一步步上手10元ESP8266 WiFi模块-初探

也或許是我的環境是在 Mac OS X..

其實克里斯寫了一篇文章已經蠻詳細的,可以先參考他的文章,只是我在 MAC 下沒有 Windows 的某些工具,所以就分享一下我遇到的問題跟解決的方法,介紹一些對應的軟體。

概觀

ESP8266 是一個 wifi 晶片 + 一個處理器(DPU, Xtensa LX3),而且還有一些 IO,所以它有提供一個韌體,讓你可以下指令組態他的 wifi 設定,而且其實有一個 Arduino ESP8266 的專案 可以讓你把他當成一個 arduino 來寫,完全不需要再買一片 arduino 也可以獨立使用,簡直新奇、有趣又好玩呢!…?

ESP8266

ESP8266 有分成一大堆 ESP01 ~ ESP12..,晶片是樂鑫出的,這些不同型號是由 ai-thinker 製造的,依照不同用途有不同的規格,常見的有 ESP01 跟 ESP03,還有熱門投票呢,ESP03 最夯,我買的是 ESP01 是第二名…。ESP03 引出的接腳比較多,而且價錢差不多,平平都是布丁,當然是吃有加雞蛋的阿~?詳細差異比較,實際上除了要考量到有沒有引出自己需要的接腳以外(GPIO16 + RST  = deepSleep 用),要接到麵包板的方便性(ESP05 > ESP01 >> ESP03),除了  ESP-05 大都要額外焊轉接板,才能插到麵包板上。

P1100395

且不一樣的型號還有不同的 flash size,可以看板子上面的 flash 晶片有寫(看到脫窗就會看到上面的字了),為什麼要注意 flash size 呢?會影響韌體可以更新的版本,ESP01 黑色的(上)是新版 flash size 會比較大喔!

esp13

耗電量

耗電最多是 200mA 平常是 100mA,它可傳送距離的測試,原始板子的天線可達到 366M,外掛天線可達 479M!(裡面還有比較一個在室外 wifi 可以傳 4KM↑的產品=_=)

ESP01

ESP01 有八個腳由左到右,由上到下,由內到外,由基隆到墾丁,依序為 TX、GND、CH_PD(must be 1 to enable WiFi)、GPIO02、GPIO01、RST(Reset)、VCC(3.3V)、RX。

P1100351

由於他的腳位設計蠻奇怪的,無法直接插入麵包板,可以按照影片裡面教的,切一塊板子下來,做一個轉接板,接插座跟接頭弄成適合麵包板插的形式(如圖;來源),或者我是到光華買一包公對母的杜比接頭線,公頭就可以直接插到麵包板或者 arduino 上,只是拔拔插插的要一直看腳位快脫窗。

OLYMPUS DIGITAL CAMERA

韌體

ESP8266 的 firmware 預設會支援一種 AT Command 的協定,讓你可以從 Serial 連進去以後,對他下指令並且會把設定寫入 flash 中,重開機也還會在,叫他設成 AP or wifi client 模式,或者叫他連線等等,設定跟查詢 wifi 的 config,實際測試起來還蠻方便的。因為他就像是一個介面讓你簡化他跟 Arduino 溝通的方法,而不用所有事都要透過底層 SDK 呼叫 C 的 API 來做。

Arduino

一開始先測試看看,把 ESP8266 RX、TX 跟 arduino 的 TX、RX 對接(Arduino RX0 <=> EXP8266 TX、Arduino TX0 <=> EXP8266 RX),然後 VCC 跟 CH_PD 接 Arduino 3.3V,GND 接… GND,如下圖(開發板不同)。這裡有個小問題要注意,官方規格寫到 3.3V 只能提供 50mA 的電流(DC Current for 3.3V Pin 50 mA),所以 ESP8266 可能吃超過 100mA 就要另外接電源,但是我自己跑測試,開 Client 模式傳資料時整個板(USB電壓電流檢測器)最多寫吃 100mA,也沒出什麼問題,所以我就沒另外供電囉,只是可能程式的實作會影響耗電,真的有問題就另外供電吧,另外發現只要從 Arduino 供電就沒問題,從燒錄線供電,板子就不穩定。

ESP8266ArduinoUNO_WiringDiagram

然後下載 Library ITEADLIB_Arduino_WeeESP8266 ,這是把 ESP8266 當模組用的 library,跑裡面的範例可以測是否正常,改 SSID 跟 PASSWORD 讓他連 AP 看看,Baud Rate 要改成 115200 或 57600 都試試看(要看韌體版本決定),我自己用 115200 試成功一次,成功連線,之後不斷重開再也沒成功過了…。用 Serial 連進去他也一直 check failed 感覺是韌體真的怪怪的,所以後來就決定要先更新(大家都說要更新)。

這邊在測的時候會遇到一個問題是,如果你是用 Uno 只要這樣接以後, ESP8266 就佔據了電腦跟 arduino 的 RX、TX 所以你無法燒錄,要先拔掉才能燒,但是燒完插進去,他又佔據你跟 Arduino 的 Serial ,你就看不到 Serial.print 的結果了,這時後有兩種解法,一種是用 Ardunio mega 有支援 Serial1~3 可以用,可以讓 ESP8266 接在RX1TX1,保留 TX0 跟 RX0 給 USB 對電腦,或者參考另外一個範例(沒有用到 Library)裡面註解的方法用其他腳當作 SoftwareSerial 作為 ESP8266 跟 Arduino 通訊 SoftwareSerial,前提是 SoftwareSerial 支援 Buad rate 不超過 19200,如果韌體預設不是 9600 的就要改 buad rate 或燒別的韌體。

後來查到 ITEADLIB_Arduino_WeeESP8266 關於 SoftwareSerial 的說明 ITEADLIB_Arduino_WeeESP8266 的 Softwareserial,也有提到它可以換成 SoftwareSerial。

- //#define ESP8266_USE_SOFTWARE_SERIAL
+ #define ESP8266_USE_SOFTWARE_SERIAL

裡面有提到只要把 Software Serial 註解拿掉就能改成用 SoftwareSerial 了。實際的程式在把 Serial 換成 mySerial

// 原始版本
#include "ESP8266.h"
ESP8266 wifi(Serial);

// arduino MEGA Serial[1] 版本
#include "ESP8266.h"
ESP8266 wifi(Serial1); /* RX1 pins 19, TX1 pins 18*/

// ESP8266.h + SoftwareSerial
#include "ESP8266.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial);

Serial

好,如果真的不行,你要直接從電腦連 USB 上去燒韌體或跟電腦跟它對接連進去下指令測試,那就要找一條 USB 對 TTL 的線,大概長這個樣子,裡面會有一個晶片,或者你直接買這個晶片也可以,我是買這條線裡面的晶片是 PL2303HX,大概三四十塊吧,也有其他代替品如 CP2102、FTDI。

USB-to-TTL-Serial-Cable-FTDI-font-b-Chipset-b-font-font-b-PL2303HX-b-font (1)

他的線路對應是 紅+5V, 黑 GND, 綠 TXD,白 RXD 。好,只是要直接接上 ESP8622 之前有個問題要考慮到,他的紅線是 5V 但是 ESP8266 吃的是 3.3V,所以接上去以後,可能會讓這個晶片斷開鎖練…斷開一切的牽連。所以我們來把這個神秘的 USB 小盒子打開,裡面其實是長這樣

PL2303

他其實有 3V 的電源藏在裡面沒拉出來,我們要把 5v 的線解焊改到 3V 上面,就能讓 PL2303 直接接到 ESP8622 囉。然後照著接 arduino 的接法一樣,把 RX TX 對接 電源、接地弄好以後就可以用電腦來連了。

只是要先裝個 Driver,裡面有 PL2303 跟 FTDI 的 MacOS X Driver,裝好重開以後,在裝個 CoolTerm or minicom (brew install) or screen (mac 內建?)就能跟 Serial /dvu/cu.usbserail 連接囉。記得設定

baudrate: 115200
Data Bits: 8bit
Stop Bits: 1

然後看是用什麼軟體連 Serial,也可以直接開 Arduino IDE 的 Serial Monitor 來看。

$ minicom --baudrate 115200 --device /dev/cu.usbserial
# screen
$ screen /dev/cu.usbserial 115200

就能打一些 AT 指令跟他聊聊天囉,例如

  • AT+GMR 取得韌體版本
  • AT+RST 重設
  • AT+CWLAP 取得 ap 列表

Screen Shot 2015-07-19 at 12.18.15 AM

上圖是 CoolTerm 連成功的畫面,如果還是都怪怪不能跟他講話還是先更新韌體再說吧。我是印出一直 CHECK FAILED。

更新韌體

好,管他有沒有問題(真的有問題),先來更新韌體,準備好燒韌體的軟體 esptool,python 寫的,下載好記得先 python setup.py install 安裝相依套件。

pinouts

按照上述 USB 的接法,再把 GPIO0 接地(跟 GND 接起來),如上圖,這是燒錄模式,然後去 Ai-thinker 論壇下載韌體 v1.1.1 ,用 CoolTerm 連連看,確定有回應,但是一直跳針無法溝通,就來給他燒給他死啦。

試了幾個版本,紀錄差別:

  • v0.9.2:AT+UART=9600,8,1,0,0 會一直 ERROR,無法改預設 buad rate(應該試 AT_ISP=9600?)。
  • v0.9.5:可以 AT+UART=9600,8,1,0,0 不會出錯。但是實測起來感覺 0.9.2 穩定度比較好耶,0.9.5 一直 createTCP 失敗?
  • v1.1.1:AI-thinker 最新板,需要 flash size 是 1MB 的版本(ESP01 黑色版)

最後結論,不同韌體有不同的 AT 指令跟不同的預設 buad rate,還要依照硬體支援度決定韌體版本 > 1.0(1MB) 或 < 1.0 (512KB)。可以穩定的使用就好也不見得支援範例測試內的每一個指令。

用 esptool 燒錄指令如下,要改成自己的 device 喔,燒錄的重點是要把 GPIO0 接地,平時運作時就不能接地。

$ python esptool.py -p /dev/cu.usbserial write_flash 0x000000 v0.9.2.2\ AT\ Firmware.bin
Connecting...
Erasing flash...
Writing at 0x0007ec00... (100 %)

Leaving...

詳細燒錄教學

測試方式與 AT 指令

再回去跑測試,就開心的通過啦,跑所有模式,印出很多資訊(其實我的韌體一堆 ERROR,但是可以用了)。

附上一個自己寫的小測試,接 mega 的 Serial1,透過 Arduino 跟 ESP8622 聊天,聊天模式很 OK ㄟ。

void setup() {
  Serial1.begin(9600); //RX1 TX1,即 Pin18 及 Pin19
  Serial.begin(9600);
}

void loop() {
  if (Serial1.available()) {
    Serial.write(Serial1.read());
  }

  if (Serial.available()) {
    char chars = Serial.read();
    Serial1.write(chars);
  }
}

測試的指令

$ AT+RST # 重設
OK

$ AT+CWMODE=3 # 設成 ap + client 模式
OK

$ AT+CWMODE? # 查詢目前模式 1 = client, 2 = AP, 3 = BOTH
+CWMODE:3

$ AT+CWLAP # 列出 SID
+CWLAP:(4,"TP-LINK",-65,"a0:f3:c1:86:10:8f",6)
+CWLAP:(4,"26-2",-87,"fc:75:16:ed:13:58",11)
+CWLAP:(4,"HITRON-1E60",-85,"78:8d:f7:6d:1e:68",11)
$ AT+CWJAP="TP-LINK","PASSWORD" # 連到 TP-LINK
OK
$ AT+CIFSR # 印出 IP 狀態
192.168.4.1
192.168.0.109

$ AT+GMR # 印出 firmware
0018000902

$ AT+CIOBAUD? # 查 baud rate
+CIOBAUD:9600
$ AT+CIOBAUD=9600 # 設定 baud rate
BAUD->9600

最後重開 arduino 他還是會紀錄上一次的連線狀態喔,所以要記得要設定都要先 AT+RST,官方 AT Command 文件

ITEADLIB_Arduino_WeeESP8266

這個 library 裡面其實實作就是把 API 轉成 AT Commands,所以直接看查 .h 檔 .cpp 檔就可以知道哪個 AT Command 對應到哪個 API,大部分都在範例裡面以了,剩下才要看 API,例如 deepSleep(ms),可以計算電池在睡眠跟啟動模式下可以用多久。

#include "ESP8266.h"
ESP8266 wifi(Serial1);
void setup() {
  Serial.begin(9600);
  Serial.println( wifi.getLocalIP().c_str());
}
void loop() {
  // sleep 1000ms low energy mode
  wifi.deepSleep(1000);
}

應用小範例:

另外接了土壤濕度偵測,把資料 POST 到免費的 IOT 平台 thingspeak,有空再補完…。

範例程式:

 

小結:

如果克服韌體更新的痛苦過程,這應該是顆 CP 值爆表的模組八…,之後研究完 BLE or Zigbee 再來比較一下。最後可以試著直接用 ESP8266 Arduino 專案直接燒程式進去取代 AT Command,可以不透過 Arduino 獨立運作。

後記:

因為這篇文章做了一場教學,有整理了一份比較新又全面的觀點的投影片跟程式碼可以參考這篇文章

相關資源:

很短又完整的 ESP8266 簡介影片,必看
https://www.youtube.com/watch?v=9QZkCQSHnko

Getting Started With The Esp8266 And Arduino

http://www.madebymarket.com/blog/dev/getting-started-with-esp8266.html

社群的 ESP8266 github & forum
https://github.com/esp8266/esp8266-wiki/wiki
http://www.esp8266.com/

ESP8266 Arduino IDE(用來把 ESP8266 當 Arduino 開發板)
https://github.com/esp8266/Arduino

基本測試指令
http://www.instructables.com/id/Using-the-ESP8266-module/step3/Configuring-the-8266-Module/

Makezine 5美元的WiFi微控器ESP8266已可與Arduino相容
http://www.makezine.com.tw/make2599131456/5wifiesp8266arduino

燒韌體教學
Intro Esp8266 firmware update http://www.instructables.com/id/Intro-Esp-8266-firmware-update/
Upgrading ESP8266 Firmware http://taylorcoffelt.com/article/1

ESP8266 官方論壇(找到bug有2000鎂的賞金喔)
http://bbs.espressif.com/

ESPTOOL ESP8266 ROM Bootloader utility
https://github.com/themadinventor/esptool

Arduino ESP8266 Library
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266

AT指令文件

https://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/

ESP 系列是由 Ai-thinkers 生產,詳細規格比較
http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family

- See more at: http://mlwmlw.org/2015/07/%e6%b7%b1%e5%85%a5%e6%b7%ba%e5%87%ba-wifi-%e6%...

Book type: