2015年5月23日 星期六

【技術教學】打造Wifi遙控車(之二):整合 ESP8266 與 Arduino

嗨,我是克里斯。

上一集中,我們已經成功完成了電腦與 ESP8266的通訊。於是我接著著手研究和實作 ESP8266與 Arduino的通訊。然而後續的工作進行得並不順利,中間經歷了一段辛苦搏鬥的歷程(所以這一集才會等到現在)。


至於,搏鬥的歷程如何辛苦(如上圖),我就不講細節了。以下分享的重點,就放在辛苦搏鬥得到經驗和心得。

配線

基本上,用 Arduino 與 ESP8266 通訊 和 用電腦與 ESP8266 通訊的過程差不多。

在配線上,我們只要把原本接到 CP2102 (或其他USB轉 Serial轉換器)的線拆掉,把 TXD和 RXD改接到 Arduino上就行了:
  • 【Arduino】TX→【ESP8266】URXD
  • 【Arduino】RX→【ESP8266】UTXD
我建議使用 Arduino Mega,它會比 Arduino Uno 還要更適合。


因為 Uno只有一組 RX/TX通訊連接孔,而這組 RX/TX其實是與它的 USB連接阜接在一起。當我們把 USB線插上電腦,就等於是使用了這組 RX/TX 在和電腦通訊(是的,Arduino內建USB轉 Serial轉換器,所以接USB就可以直接跟 RX/TX通訊)。這也表示,它同時只能跟 電腦和 ESP8266 其中一個通訊。如果接了 ESP8266 那就無法跟電腦通訊了。

但 Mega 則有多組(0號~3號共四組)的 RX/TX通訊連接孔,因此我們就可以使用兩組 RX/TX,同時和電腦及 ESP8266 通訊。這會讓我們之後的實驗更容易。

Arduino Mega 的 RX0/TX0 就和 Uno一樣,已經跟它的 USB連接阜連接。所以如果你使用的是 Mega,請改接到它的 RX1/ TX1(孔19、18)。

除了通訊的配線之外,我們也要處理電源的配線。我高度建議不要使用 Arduino的 3.3v孔當作電源供應 ESP8266。因為,這就是我會辛苦搏鬥+鬼打牆的 80%原因!

穩定的電源!

ESP8266 對於電源供應真的非常龜毛。電壓太低或太高,或供應的電流不足,都會讓它秀逗。如果能夠提供穩定的 3.3v電源和充足的電流(至少要200mA~300mA以上),你才會有機會跟它相處愉快。不然無預警、不明原因的斷線、重新開機等症頭,將會如影隨形......

Arduino 的電源供應並不穩定。電流可能也不夠。而如果  ESP8266又是和 Arduino,甚至小車的馬達,共用同一組電池,那麼電壓和電流就很容易隨著其他部份的電力消耗而波動,變得很不穩定。於是 ESP8266就會開始當機、吐出亂碼,甚至重新啟動。

那麼,如果另外接電池給 ESP8266 呢?

是的,一開始我也是這麼做的,但這並沒有完全解決問題,因為後來我發現,電池的電壓其實也不好控制。

我使用的電池是一種叫做 18650的充電電池(好用大推),它的額定電壓是 3.7 V,光是這麼一顆電池就超過 ESP8266的可接受範圍 (1.7~3.6V),何況充飽電時的電壓更高達4.3V以上。

即使找到合適的電池,因為電池充飽電的電壓和快沒電時的電壓會有相當的差異,這好像也會對 ESP8266 有影響。

所以我會建議,不要直接把電源接到 ESP8266,而是把電源接到穩壓器(電源模組),透過它來為 ESP8266進行獨立的供電,而不要跟 Arduino或馬達共用一組電池 (不過 GND還是要跟 Arduino的 GND接在一起,不然它是不會動的)。

我使用的是下面這一款電源模組,它需要 6.5~12V電源輸入(很適合兩顆 18650電池),並提供了穩定的 3.3V電源輸出。裝上後,ESP8266 的很多問題就消失了。要把電池與電源模組連接,可以去購買 2.1mm的 DC接頭來插。另外我也有找到另一款電源輸入只需要 4.5~7V的電源模組(適合兩顆3號電池)。


複習一下 ESP8266 接腳:
所以在電源的部分,可以這樣配線:
  • 【穩壓器(電源模組)】3.3v → 【ESP8266】VCC
  • 【穩壓器(電源模組)】3.3v → 【ESP8266】CH_PD
  • 【穩壓器(電源模組)】GND → 【ESP8266】GND
  • 【穩壓器(電源模組)】GND → 【Arduino】GND

通訊測試程式

配好線後,就要來幫  Arduino撰寫程式,以便與 ESP8266 通訊了。

我所使用的是 Arduino Mega,透過 RX1/TX1與 ESP8266連接,並使用 USB線與電腦連接。在程式當中,我可以透過 Serial 與 Serial1分別與電腦和 ESP8266通訊:
Serial.print("HI Computer\n"); //發送給電腦
Serial1.print("AT\r\n"); //發送給 ESP8266
要特別注意的是,發送給 ESP8266的指令,必須要以「\r\n」結尾,這樣 ESP8266才會判斷這是一行命令文字的結束。

當我們發送 「AT」指令給 ESP8266,它應該會回給我們一行空白行以及一行 OK。它傳回的每一行同樣也會是以「\r\n」作為換行字元。

然而,即使 ESP8266 收到指令,並成功傳送回覆訊息給 Arduino,我們卻無法從電腦知道 Arduino收到了什麼訊息。因此我們需要寫一段轉送訊息的程式碼,來讓 Arduino把 ESP8266 傳送給它的訊息轉送到電腦。

要做到這點,其實很簡單,Arduino IDE本身就附有一個範例檔案,裡面示範的就是這樣的功能。而且不但可以轉送 Serial1 的訊息到 Serial,同時也可以把 Serial 的訊息到 Serial1。依照下圖開啟範例「MultiSerialMega」就會看到了:

簡易Wifi連線程式

現在,我們已經大致掌握 Arduino和 ESP8266 如何通訊了(畢竟與跟電腦通訊差不多)。

接下來,我們的目標,就是要寫一個程式,讓 Arduino控制 ESP8266 連上 Wifi,並且把 ESP8266 設定成伺服器,等候其他裝置(如手機或筆電)與它連線。

而當連線裝置(如手機或筆電)發送訊息給 ESP8266 時,Arduino也能從 ESP8266接收,並處理訊息(最好還可以把訊息透過 USB傳給電腦顯示出來。

如果可以做到這樣,那麼我們就可以實現,外部裝置(如手機或筆電),透過 Wifi 經由 ESP8266,對 Arduino的遙控。而我們也就離 Wifi遙控車又近了一步!

限於篇幅,此處不進行程式細節的教學。但我寫了一個簡易的連線範例「ESP8266 Wifi Connection Template」,可以做到我上面寫的目標。大家可以去下載來參考:


不過這個程式只是我寫的一個初步的測試。雖然可以用但還沒達到我期望的標準。因此後來,我特別為 ESP8266 的控制,寫了一個 C++的類別。希望以後只要需要使用 Arduino控制 ESP8266 就只需要載入這個類別,便可簡單的操作 ESP8266。而不用煩惱 Serial的讀取,時間等候和文字處理工作。目前這個類別還在測試中,或許過一段時間後我會把它放到 GitHub上面。

回到我們的簡易連線程式。基本上,只要把程式當中的「SSID」和「PASSWORD」兩個變數改成自己的 Wifi的名稱和密碼,Arduino就會控制 ESP8266 完成連線,並成為伺服器了。

等 ESP8266 成為了伺服器,電腦端的 Serial就會收到「Server Ready」文字。

這時,我們就要再度拿出上一集當中使用過的網路連線程式「Connector-Test」。這是我自己寫的一個網路連線測試程式,可在這裡下載(必須先安裝 Adobe Air才能使用)。它的 Port預設為 8087無法更改。

透過「Connector-Test」程式,我們可以跟 ESP8266 連線。如果不知道 ESP8266 的 IP,可以直接從電腦透過 Serial發指令「AT+CIFSR」問它。

一但連線成功,就會在電腦端的 Serial看到 ESP8266說「Link」。而當我們透過「Connector-Test」程式發送訊息給 ESP8266,我們也會很快在 Serial畫面看到「+IPD,....」的訊息:



到了這裡,我們就可以確定,以 Wifi 遙控Arduino是沒有問題的了!

下集預告

接下來,我們還有三個步驟,才能把 Wifi遙控車完成:
  1. 做好一台讓 Arduino可以開的車。
  2. 寫一支專門的程式,指導 Arduino如何一邊接收遙控訊號一邊開車。
  3. 還要再寫一支遙控器程式(或 App),安裝在電腦(或手機/平板)上,提供方便的遙控按鈕和操作介面,以便發送遙控訊號給 Arduino。畢竟,我們總不能用這個「Connector-Test」程式打字來遙控車子吧?
PS:
其實我已經快把剩下的部分做完了 :P
但是寫教學很花時間的,所以我們就慢慢來吧...
等作品完成再貼上來現寶  XD