瓦力号是一台自走车,可利用 WiFi 联机以及 IR 红外线控制,其主要是透过 NodeMCU 这块主控板来实现 WiFi 联机控制。
在这个专案里将program 刻录进 NodeMCU,利用 WiFi 连网,并设计一些供用户按的按钮,用来操控自走车。
材料
1. 伺服马达:伺服马达是回受控制系统的马达,相较于「步进马达」则是非回受控制系统,两者的差别在于准确度。
2. NodeMCU 主控板:使用 NodeMCU,主要是因为需要它上面搭载的 ESP8266 module,可以用来实现 WiFi 联机。
3. IR receiver: 利用 IR transmitter 发送讯号去给receiver 控制瓦力号的马达,使其可以做出前进、后退以及左右转弯的动作。
4. HC-SR04 超音波传感器:将这个 module 黏在瓦力号的前身,利用超声波原理,让瓦力号能够在与障碍物接触前,在预先设定的某个距离外,就会自动停下来,不会整个撞上去。
实作步骤
1.主控板的选定:
当车子组装完毕之后,要给车子装上控制板,由于希望能藉由 WiFi 联机来控制瓦力号,因此最后采用了 NodeMCU 这块主控板。
2.让轮子转动:
NodeMCU主控板控制马达的程序已经分享到Github上,可以从这里下载。
https://gist.github.com/Ryanhu1015/855ce5dc9b403c91e5808840b4812fd8#file-button_practice-cpp
这样车子就可以动起来,顺利直走了。
ESP8266 WiFi联机控制
轮子会动了,车子会跑了,接下来要做的就是用 WiFi 联机去控制这台车。这里分成两个部分来说明:
1. ESP8266 连结公司 WiFi AP:
参考程序可以从Github上下载,地址如下,
https://gist.github.com/Ryanhu1015/ce34c5ce25119d9443225ee06f167535#file-esp8266_wifi_connection-cpp
这样 WiFi 联机就变得轻而易举,可以利用console 去观察 ESP8266 WiFi module 到底有没有乖乖的连上WiFi,如果还没就会看到不断有「.」出现在同一行。
2. User interface:
这个部分的程序代码可以从这里下载,
https://gist.github.com/Ryanhu1015/e0963d6dda8e60fccbb3249b196eacd0#file-esp8266_wifi_server-cpp
若要开启 server,势必要先连上 WiFi ,才能回传 server 的 IP 位置。其过程主要是当 WiFi 先连上后,将 ESP8266 内建的 server 唤醒,唤醒后让他回传一个 IP 位置(即 ESP8266 server 的位置)到console ,因为MAC 和 ESP8266 的 IP 位置都是同一个 AP 给的(即 MAC 和 ESP8266 是连到同一个 WiFi)所以直接在 chrome 上打上显示在 console 的 IP 位置,就会连到 ESP8266 的 server。
接下来,「WiFiClient client」用 client 这个变量去做 server 端相关的活动,例如检查它到底可不可以用,还有很重要的是用 client.print() 去实作简易的网页。
最后也是最容易让人困惑的,就是中间 request 变量在做的事情。故事是这样的,request 是来自你在 webpage 上面做了一些事情(比如说你按了某个 button)后, address 上有变化,而这个变化再利用 HTTP GET 的方式送出一个 request 给 server, server 就会去做parse 的动作,如果有,server 当然就做出相对应的响应,没有就没反应。
红外线传感器的架设
首先是把 library 装了起来(这个 library 完整到完全不用自己写多少 code,连 decode 的部分都帮 user 写好了),接着再很快的把 IR receiver 跟 ESP8266 的脚接一接,然后 program 所需要的功能,详细程序代码可从这里下载,
https://gist.github.com/Ryanhu1015/eb80cfb76d863d67832b530fc7a13d43#file-ir_receiver-cpp
这里主要是透过R_FD、R_BD、L_FD、L_BD 分别控制瓦力号轮子的四个 pin 脚,利用 PWM 的 funciton – analogWrite 去设定相对应的参数,使其可以做出前进后退以及左右转弯的动作。
再来就是 IR communication 的部分,在 main loop 里面可以看到,irrecv.decode(&results) 如果回传 true(表示 receiver 有吃到东西),就进去找相对应解碼后的码到底是符合哪个,如果符合某个码,就 trigger 某件事。最后再用 resume() 这个 function 去清掉本次读到的 IR data。
HC-SR04超音波传感器
最后,在瓦力号前方装了一个超音波传感器,利用超声波原理,让瓦力号碰触到障碍物之前,就会在我设定的某个距离外自动停下来,不会整个撞上去。
成果展示
注*车体组装部分没有描述,这部分就留给读者自己去完成。
作者:Ryan Hu
更多精彩文章请关注微信公众号?易心Microbit编程