這次要介紹的是ESP8266接在Arduino Nano v3 .因為Arduino Nano 只有一個Uart port 這個port我們要保留下來跟電腦連線及做DEBUG用,所以在我的接線上我會利用Arduino D2 pin當RX ,D3 pin 當TX,直接接到ESP8266 的TX跟RX ,也就是
Arduino D2 pin 接到ESP8266 TX pin
Arduino D3 pin 接到ESP8266 RX pin
請先參考前兩篇ESP8266的介紹:
ESP8266 Wifi (1)---Connected with PC.
http://arbu00.blogspot.tw/2015/12/esp8266-wifi-1-connected-with-pc.htmlhttp://arbu00.blogspot.tw/2015/12/esp8266-wifi2-update-firmware-and.html
上述(1)(2)動作都ok後才有辦法繼續以下操作.
在Arduino 的程式上則是準備 <SoftwareSerial>這個開源的library去規劃D2/D3為RX/TX的功能(Arduino端)
EX: SoftwareSerial WifiSerial(2,3); /* RX:D2, TX:D3 */
據說SoftwareSerial 只能設定Baud rate到19200,所以這就是為什麼我們是先要將
ESP8266的Baud rate只設在9600.
如果你用的是Arduino Mega2560有多組RX/TX的,則可以直接接ESP8266跑115200 Baud rate.
另外我們還會用到另一個開源的Library <ITEADLIB_Arduino_WeeESP8266-master>
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266/archive/master.zip
是一個把ESP8266的AT command 提供了實作的函式呼叫.
1.實際的接線可以看到已經移除了USB-UART的線,現在接上PC端的USB線是連到Arduino端的.
在接線上只需將原本的接到USB-UART (CP210x)的TX/RX端改接到Arduino即可,
另外當然須給Arduino供電,在我使用的LM2596S DC-DC 降壓電源模塊,我會在電池源頭另外拉一線供電給Arduino的Vin.另外轉出的3.3V則是供給ESP8266.
2.下圖這個小按鍵式作來讓GPIO0接地或不接地使用,實際的接線藏在ESp8266的模組板下方
請勿看這張圖上的綠線去接線,那會被誤導.
3下圖的兩個開關分別是給arduino 及ESP8266的電源開關,因為有時須斷電重置系統所以多作了開關只是方便而已.如果要reset Arduino也可以直接按Arduino nano上的reset鍵.我沒特別作ESP8266的reset 鍵.
4.底下主要是程式跟AT command的實際操作跟說明.完整的source code跟test tool請從最下方的連結下載.底下的程式主要的功能會完成
a.Arduino 跟ESP8266之間的溝通
b.PC 跟ESP8266之間的溝通
c.Android 手機跟ESP8266之間的溝通
完成了以上功能,未來我們就可以從PC或是手機端藉由網路連線到ESP8266去控制
Arduino ,例如Get 從Arduino端感測器的資料秀在網頁上,或是下指令透過ESP8266給
Arduino作Led燈開關的動作.
首先我在程式裡刻意設計了一個 DebugFlag.為了要了解如何實際program AT commad在
Arduino程式裡,故意做了這樣的開關.
以下程式可以看到當 DebugFlag=true;時coding的方式會很直接直覺的的send AT command
而先不用weeESP8266所提供的Library.就這樣的實驗可以讓我們更了解實際上如何去
program 這些command.
如:
cmdAT ="AT+GMR";
WifiSerial.println(cmdAT);
就是等同於在UART的終端器端直接下AT+GMR的命令.
大家有興趣可以自行把DebugFlag設成true 去做實驗看看.去體會看看跟直接引用
WeeESP8266 的library會有什麼不同.
另外把DebugFlag設成false才是這個程式完整的功能,
在這範例程式裡不論把DebugFlag設成true或False
都可以作Arduino 跟Esp8266的溝通連結測試.
但是要跟PC/手機端作連結測試則一定要重新build code成DebugFlag=false.
另外我在程式的開頭列出了一些相關跟常用的AT command.
大家可以實際試Run看看.
5.以下是如果把DebugFlag設成true,會跑的code,可以看到我只試作3個AT/AT+GMR/AT+CWLAP
6.以下是如果把DebugFlag設成false,會跑的code, 會完成以下動作
a.//把ESP8266 的 Wifi連線模式設為 Station模式:
b. //連線到家裡的Wifi網路得到IP adr:
c. //把「多重連線」打開
d. //讓 ESP8266進入伺服器模式,等候其他裝置與它連線:
我有特別在註解標出了原本的相對應的AT command
在b.步驟時我們須設定給ESP8266 家裡的或是手機分享的無線網路AP及密碼
在程式裡預設是
#define SSID "Buffalo-G-2.4"
#define PASSWORD "guitar100"
我家使用的是"Buffalo-G-2.4","guitar100",這裡你的肯定是不會跟我一樣的
這邊記得要修改成你要連的無線網路.
可以事先用AT+CWLAP command 去取得 ap 列表
注意每一個字元跟空白都不能key錯否則會連線失敗.
...................................
}else{ //-Start-Set to serve mode and connect to Home AP.
//把ESP8266 的 Wifi連線模式設為 Station模式:
//the same as AT+CWMODE=1
if (wifi.setOprToStation()) {
Serial.print("Operate to station ok\r\n");
} else {
Serial.print("Operate to station err\r\n");
}
//連線到家裡的Wifi網路得到IP adr:
//AT+CWJAP="Buffalo-G-2.4","guitar100"
if (wifi.joinAP(SSID,PASSWORD)) {
Serial.print("Join AP success\r\n");
Serial.print("IP: ");
Serial.println(wifi.getLocalIP().c_str());
} else {
Serial.print("Join AP failure\r\n");
}
//把「多重連線」打開
//The same as "AT+CIPMUX=1"
// cmdAT ="AT+CIPMUX?";
// WifiSerial.println(cmdAT);
// delay(1000);
if (wifi.enableMUX()) {
Serial.print("Set AT+CIPMUX=1 success\r\n");
} else {
Serial.print("Set AT+CIPMUX=1 failure\r\n");
}
//讓 ESP8266進入伺服器模式,等候其他裝置與它連線:
//The same as "AT+CIPSERVER=1,8081"
// cmdAT ="AT+CIPSERVER=1,8081";
// WifiSerial.println(cmdAT);
if (wifi.startTCPServer(8087)) {
Serial.print("Set port 8087 success\r\n");
} else {
Serial.print("Set port 8087 failure\r\n");
}
}//-END-Set to serve mode and connect to Home AP.
7.如果把DebugFlag設成true ,Debug 模式接著把程式下載到arduino之後可以開啟
序列終端機去看,應該會出現類似下圖的狀態,預設的3個AT command AT/AT+GMR/AT+CWLAP執行OK的狀態
那也可以在這上面直接在輸入其他AT command 去執行,應該會得到跟在程式直接寫好的結果
看到這也表示Ardunio跟ESP8266之間溝通是ok的
8接著把DebugFlag設成false ,重新build code下載到arduino去執行.
打開序列終端機應該會看到類似下圖,在第一次執行有時會看到show
to station err 可以按arduino的reset鍵在執行一次就會正常.
這是因為這邊寫code的人一定要有一個重要的觀念
Arduino 跟ESp8266內部都各自有一個自己的CPU在運作指令
所以在互相溝通時,timming的等待跟status ready與否的check就變得很重要
可以直接參閱看WeeESP8266 library的寫法去了解更多.
那如果指令都成功,以下我們也可以看到會得到一個IP:192.168.11.9
那在code裡我預設給他一個8087的port 給接下來,作PC /手機連線使用的
到這邊Arduino 跟ESP8266算是連線都沒問題了
9.接著這邊使用一個免費的tool <USR-TCP232-Test> 它也有Android手機版的.
利用這個我們來測試與剛剛ESP8266的連結.
首先 我在我自己的電腦跟ESP82662. 都連上家中的AP
接著打開<USR-TCP232-Test> tool之後 ,將它設定為TCP client mode
因為我們在ESP8266端是設成server端,所以我們把電腦設成Client端
接著輸入欲連線的server IP 及Port 就是剛剛ESP8266的192.168.11.9 & 8087
按下[Connect]鍵 ,如果連線成功可以在原本Arduino序列終端器上看到0,CONNECT
就表示這台電腦跟我們的Arduino+ESP8266的系統連接成功了
接下來可以直接在<USR-TCP232-Test> 下方的命令列輸入Hi 按下[SEND]之後
可以發現在Arduino 序列終端器可以看到傳送過來的Hi
//AT+CIPSEND
//「AT+CIPSEND=<length>」只適用於 CIPMUX=0 的情況。
//「AT+CIPSEND=<id>,<length>」只適用於 CIPMUX=1 的情況。
//<id>:在多重連線的情況下,需要輸入連線的代號,ESP8266才會知道要把訊息發送給哪一條連線。
//<length>要發送的訊息長度。等到此指令發送出去之後,會出現「>」符號在螢幕,這時就可以輸入符合訊息長度的訊息。
EX .輸入AT+CIPSEND=0,5 按下enter ,在輸入HELLO 按下enter
那在PC <USR-TCP232-Test> 這端就會看到HELLO.
到這邊我們就完成了與PC的溝通連結
11.接著使用一樣<USR-TCP232-Test.apk> android版,下載安裝到自己的手機
一樣先將手機連線到自己家中跟ESP8266一樣的wifi
一樣作如下的設定
12.試著 說 Hi
13. Arduino+ESP8266 說HELLO
14.手機也收到HELLO.
測試軟體<USR-TCP232-Test>及Arduino 範例程式下載.
https://www.dropbox.com/s/16oao9vyaloarsp/ESP8266_01.7z?dl=0