2017年9月25日 星期一

Arduino C on ESP8266 學習筆記 (一) : 環境設定與韌體上傳

我以前剛開始接觸 ESP8266 時 Arduino IDE 尚未支援 ESP8266, 因此是透過軟體序列埠連接 Arduino Nano 板與 ESP-01 模組, 從 Arduino Nano 發出 AT 指令控制 ESP8266 的網路連線. 這種做法是以 Arduino 開發板當微控器, ESP8266 只是一個透過序列埠通訊的 WiFi 模組而已, 即 Arduino 是主, ESP8266 是僕, 但缺點是透過序列埠通訊傳遞 AT 指令再從回應中解讀 TCP/IP 協定, 操作速度受到序列埠的限制.

事實上 ESP8266 本身就是一個 32 位元處理器 (512K/1M/4M Flash), 比起 Arduino 那 8 位元的 ATMEGA328P 處理器(32K Flash) 要強多了. 當 Arduino IDE 支援 ESP8266 開發板後, 就可以直接用 Arduino 語法 (C 語言系列) 開發 ESP8266 物聯網應用程式了, 以下測試是以 ESP8266 模組 Standalone 作為微控器, 與 Arduino 板子無關, 只是使用 Arduino IDE 作為開發工具, 使用 C 語言語法撰寫程式而已. 不過 Arduino IDE 預設並未含有 ESP8266 開發板函式庫與驅動程式, 必須在 "檔案/偏好設定" 的 "額外的開發板管理員位址" 欄位輸入下列網址 :

http://arduino.esp8266.com/stable/package_esp8266com_index.json




然後在 "工具/開發板/開發板管理員" 中, 搜尋 "ESP8266" 會看到 "esp8266 by ESP8266 Community" 這一項, 按底下的 "安裝" 鈕進行下載安裝 :




安裝完成後會顯示 "Installed" :




這時再切到 "工具/開發板" 就可以看到 "ESP8266 Modules" 選單了. 如果是使用 ESP-01/ESP-12 等模組應選 "Generic ESP8266 Module" :




事實上往下拉還支援很多 ESP8266 開發板, 我手上有的板子是 NodeMCU 與 WeMOS D1 Mini :




選取板子類型後再切到 "工具", 就可看到此板子的資訊, 例如 Flash 大小與 baud rate (預設 115200 bps) 等 (這裡我用的是 ESP-01 模組) :




這樣就可以開始撰寫 Arduino 程式上傳 ESP8266 了. 注意, 燒錄韌體時必須先將 GPIO 0 接地 , 燒錄完之後再拔掉. 如果沒有將 GPIO 0, 會出現如下的 "espcomm_sync failed" 與 "error: espcomm_upload_mem failed" 錯誤訊息 :

warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

參考 :

warning: espcomm_sync failed error: espcomm_open failed


我這次是使用手邊之前玩 Arduino+ESP8266 時剩下的 ESP-01 512K Flash 模組進行測試, 我把它插在好用的 ESP-01 專用轉接板上, 配合一個小麵包板與 2 個 LED + 220 歐姆電阻, 複製雙 LED 交互閃爍實驗 :




我是從加工後的背板引出 ESP-01 模組的 GND, GPIO 0, GPIO 2 三支腳到麵包板上, GPIO 0 與 GPIO 2 分別驅動兩個 LED, 此兩個 LED 各串接 200 歐姆電阻後共接 ESP-01 的 GND.

關於 ESP-01 專用轉接板參考 :

ESP-01 專用轉接板加工

我把上面這篇文章末尾的 MircoPython 程式改寫為 Arduino 程式如下 :


const int LED0=0;     //GPIO 0
const int LED2=2;     //GPIO 2
void setup() {
    pinMode(LED0,OUTPUT);
    pinMode(LED2,OUTPUT);
    }

void loop() {
    digitalWrite(LED0,HIGH);
    digitalWrite(LED2,LOW);
    delay(1000);
    digitalWrite(LED0,LOW);
    digitalWrite(LED2,HIGH);
    delay(1000);  
    }


草稿碼使用了 222229 bytes (51%) 的程式儲存空間。上限為 434160 bytes。
全域變數使用了 31572 bytes (38%) 的動態記憶體,剩餘 50348 bytes 給區域變數。上限為 81920 bytes 。
Uploading 226384 bytes from C:\Users\cht\AppData\Local\Temp\arduino_build_695446/arduesp_1.ino.bin to flash at 0x00000000
................................................................................ [ 36% ]
................................................................................ [ 72% ]
..............................................................                   [ 100% ]

天啊! 短短的程式編譯後竟然高達 222KB! 已經把 512K Flash (實際上只有 434KB 可用) 占掉一半了 (51%)! 反觀 Arduino Nano 才 30KB Flash, 同樣程式碼應該不到 10%. 韌體上傳完成後, 拔掉 GPIO 0 的接地線, 將 ESP8266 重開機即可看到兩個 LED 交互閃爍了.




參考 :

Arduino/doc/esp8266wifi/   (ESP8266WiFi.h 函式庫文件)
http://ruten-proteus.blogspot.tw/2015/09/esp8266-kits-support-arduino-ide.html

17 則留言 :

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...
作者已經移除這則留言。
Even 提到...

Tony您好~

我也是使用ESP01板子,在Arduino IDE環境設定上,均依文中介紹設定,但編譯卻一直無法成功,訊息如下,請問該朝何方下方向除錯呢?謝謝您。

未知的板子generic(平台esp8266,套件esp8266)

開發板 Generic ESP8266 Module 編譯錯誤。

小狐狸事務所 提到...

如果確定 gpio0 有接地, 那就是板子的問題了. 我之前買過樣子完全一樣, 但編號是 ESP01S 的板子, 燒錄完全成功, 但就是不能用, 試過好幾次都不行就收起來了. 你的卻出現未知的板子, 應該是 IDE 看不懂這是啥板子. 有試過下載最新版 ide 嗎?

小狐狸事務所 提到...

另外就是接線要再確認正確與否.

Even 提到...

◆ IDE已升級至1.8.8版,仍然不行,後來安裝FireBeetle-ESP8266開發板函式庫與驅動程式,便順利燒錄成功,但始終還是不知其所然。

◆ 另外,請教~如何讓ESP8266『單機』執行AT COMMAND呢?例如要執行AT+CWJAP="SSID","PASSWORD",我嘗試著用Arduino的語法Serail.println("AT+CWJAP="SSID","PASSWORD"")燒錄至ESP8266裡,但未能執行動作...謝謝您。

小狐狸事務所 提到...

若要 ESP8266 執行 AT 指令, 需燒錄 AT 的韌體, 或者自行實作 AT.

匿名 提到...

您好
我的是 USB to UART(FT232RL)再接R/Tx,上述的GPIO0有接GND,但是還是燒不了,
我是否是漏了什麼呢?

小狐狸事務所 提到...

Rx 與 Tx 要對接, 即 Rx 接 Tx, Tx 接 Rx, 這沒問題吧? 另外 EXP8266 電源要夠力.

匿名 提到...

ㄛ 我放棄了
Rx/Tx我沒接錯,下AT指令會回應,
我用MP2104DJ轉3.3V,足夠600mA,用示波器看,沒看到電掉下來

我決定去買塊板子
請問是買Arduino uno R3這塊嗎?
3Q

小狐狸事務所 提到...

UNO R3 是標準的 ARDUINO, 這塊 OK. 您打算改用 ARDUINO 嗎? 它是用 C 語言的.

匿名 提到...

Aduino或Python我都有下載來試看看,
Python的版本好多,環境也摸不太熟,

我看再不行,我就要去報名付錢上課了~

謝謝您的指導

小狐狸事務所 提到...

我覺得網路資料相當多, 自己摸索學習收穫較多, 當然如果是工作需要急用, 上課可能較快, 但上完還是得自己動手摸才有用.

匿名 提到...

請問一下 我用d1 mini加指紋辨識 指紋的範例裡面有softwareserial(2,3); 我把它改成softwareserial(D1,D2) 並且有去下載NEWsoftwareserial 也有把它放在library裡面 但是都顯示溝通失敗..

小狐狸事務所 提到...

應該要用 (2,3), 除非 D1, D2 事先有 define 為 2,3

Unknown 提到...

您好!我用esp01s板,其中有2个脚IO0&IO2可用来控制2个继电器的,一直弄不成,可否有现成编好了的程序给我学习一下?多谢您!杨学生。

小狐狸事務所 提到...

抱歉, 漏看您的貼文了, 不知解決否.