2015年12月26日 星期六

ESP8266 WIFI(3) -Connected with Arduino



這次要介紹的是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.html

http://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

 10.另外我們也可以在Ardunio的序列終端器利用以下命令PC端傳資料
//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 收到hi


13. Arduino+ESP8266 說HELLO





14.手機也收到HELLO.






測試軟體<USR-TCP232-Test>及Arduino 範例程式下載.
https://www.dropbox.com/s/16oao9vyaloarsp/ESP8266_01.7z?dl=0