2017/04/18

ESP8266:第一次接觸Adafruit HUZZAH ESP8266 Breakout,燒錄韌體NodeMCU、Arduino SDK、MicroPython、CircuitPython

這篇是寫給我自己看的,初步介紹ESP8266,韌體包含NodeMCU、Arduino SDK、MicroPython、CircuitPython,以及燒錄工具。

大綱:

  • ESP8266基本介紹
  • ESP8266模組
  • NodeMCU、韌體燒錄工具esptool、整合式開發環境ESPlorer、圖形介面的燒錄工具nodemcu-flasher與nodemcu-pyflasher
  • Arduino SDK
  • MicroPython
  • CircuitPython

ESP8266基本介紹

ESP8266,乐鑫信息科技公司(Espressif Systems)推出的WiFi晶片,價格超低,受到國外人士關注,並且把資料文件從中文翻成英文;後來釋出開發工具SDK,開始湧出各種韌體。社群網站在此,資訊豐富。

基本規格如下,詳情可看維基百科ESP8266
  • CPU,32-bit RISC, Tensilica Xtensa L106,運作頻率80 MHz。
  • 64 KB指令RAM,96 KB資料RAM。
  • 外部Flash:0.5 MB到4 MB(最高可達16 MB)。
  • WiFi:2.4 GHz ,IEEE 802.11 b/g/n、WEP or WPA/WPA2,可做為站台、AP存取點、或雙模。
  • 網路協定:TCP/IP、DNS。
  • 16個GPIO腳位,其他還有SPI、I2C、I2S、UART、10-bit ADC。
  • 工作電壓:3.3 V。 
  • 功耗:待機小於200uA,正常狀態12mA(平均)到200mA(峰值),持續傳送狀態70mA(平均)到200mA (峰值)。
  • 傳送速率:110到921600 bps。
ESP8266模組

通常會買模組而非單獨的晶片,知名模組廠商有安信可科技(Ai-Thinker、Anxinke),產品型號ESP-01、ESP-02 ... ESP-14等等,差異在於加裝的Flash大小、是否通過FCC與CE檢驗、天線類型、拉出來的腳位數量等,可到維基百科ESP8266查詢。注意,下圖中的模組尺寸比例,沒有依照實際大小。
不過我買的是Adafruit HUZZAH ESP8266 Breakout,以ESP-12F為基礎(含4 MB的Flash),再加上穩壓器(輸入電壓範圍3.4~6 V、輸出3.3V 500mA)、電壓準位轉換、LED、按鈕、二極體保護電源輸入等等,只需要再準備USB轉序列埠的線此模組的文件在此,詳述腳位、資料規格表、以及NodeMCU與Arduino SDK的基本範例。另外的產品Adafruit Feather HUZZAH with ESP8266 WiFi,則已內建USB轉序列埠晶片CP2104與LiPoly充電電路。
背面。
以USB轉序列埠的線連接電腦後,開始嚐試各種韌體、寫點程式碼吧。

NodeMCU、韌體燒錄工具esptool、整合式開發環境ESPlorer、圖形介面的燒錄工具nodemcu-flasher與nodemcu-pyflasher

此模組預設燒錄的韌體是NodeMCU文件在此,有API與韌體的建置和燒錄),版本0.9.5(build 20150318、Lua 5.1.4),可使用PuTTY(Win)、CoolTerm(Mac)、screen(Linux)、或其他終端機軟體連線,速率是9600,關掉任何硬體交握或流量控制,行結尾應設為CRLF "\r\n" 。

我使用PuTTY連線,需按一下模組上的Reset重置鈕,看到底下畫面的提示字元,便可開始輸入Lua程式:
若出現字樣「MEM CHECK FAIL!!!」,可能原因之一是傳輸速率錯了。

也可使用整合式開發環境ESPlorer(Java軟體),支援的韌體有NodeMCU、MicroPython、與AT指令。開啟後先到Settings-Select firmware選擇韌體為NodeMCU,選擇正確的序列埠與傳輸速率,按下Open連線,同樣地要按一下模組上的Reset重置鈕:
嗯,版本太舊了,可到NodeMCU custom builds線上建置韌體,自由選擇想要哪些程式庫,只需等幾分鐘,就會寄信告知;下載後,使用esptool(以Python的pip來安裝)進行燒錄,先讓ESP8266進入燒錄模式,作法是按著此模組的GPIO0鍵、按一下Reset鍵、放開GPIO0鍵,成功的話,GPIO0旁邊的紅色LED會進入半亮(黯淡)的狀態,然後執行的指令與參數如下:

python esptool.py --port COM5 --baud 460800 write_flash --flash_size=detect -fm dio 0x00000 firmware.bin

--port指定序列埠號,--baud指定速率,write_flash代表要燒錄,0x00000代表燒錄起始位址,firmware.bin是想燒錄的韌體。--flash_size=detect代表自動偵測Flash的大小,-fm是燒錄模式,512 KB模組使用qio,4 MB以上模組使用dio,但-fm或可省略。詳情可參考esptool官網NodeMCU的文件Adafruit的文件

如果發生奇怪的行為,可下參數erase_flash清除Flash,然後再燒錄,或可解決。原因可能是新舊版韌體有所差異而導致。

燒錄新版NodeMCU韌體後,再試著連線,雖然速率9600也可以,但改成115200會比較順。
另外,有支圖形介面的燒錄工具nodemcu-flasher,只有Windows版,直接下載32位元版64位元版。簡單用法是到Config指定韌體檔與位址,然後到Operation指定序列埠,按下Flash(F)即可燒錄。
還有支圖形介面的燒錄工具nodemcu-pyflasher,需要Python與wxPython,跨平台。我在Windows上想安裝,但卡在wxPython模組這一關。

如果想自己建置NodeMCU韌體,ESP8266核心的處理器,採用Tensilica公司的Xtensa LX106,所以需要該處理器的工具鍊。參考How to set up manually the GCC toolchain and SDK,原生建置環境,使用VirtualBox,安裝Ubuntu 12.04(15.04與16.10應該也可以),然後看Guts of the IoT: Building NodeMCU from Source for the ESP8266,下載esp-open-sdk,包含了Xtensa lx106架構的工具鍊、Espressif Systems釋出的ESP8266 IoT SDK(會被稱為vendor sdk)、以及其他程式庫,然後下載NodeMCU韌體的原始碼,進行建置。

Arduino SDK

社群有為ESP8266移植Arduino API,讓Arduino IDE支援ESP8266程式開發,安裝1.6.4以後的版本(官方建議1.6.8版),到選單-檔案-偏好設定-額外的開發板管理員網址,增加http://arduino.esp8266.com/stable/package_esp8266com_index.json,然後到選單-工具-開發板-開發板管理員,安裝「esp8266 by ESP8266 Community」。然後到選單-工具-開發板與序列埠,做好設定。

接著便可如平常撰寫Arduino草稿碼的方式,開始撰寫程式控制ESP8266。建置並燒錄的東西,就等同於韌體,也就是說會覆蓋掉之前的韌體。

MicroPython

MicroPython官網下載供ESP8266用的韌體,例如esp8266-20170108-v1.8.7.bin,然後燒錄即可,序列埠連線速率是115200。MicroPython文件到此參閱,原始碼在GitHub。另可參考Adafruit的文件MicroPython Basics: How to Load MicroPython on a Board

CircuitPython

CircuitPython是MicroPython的分支版本,主要加入Atmel SAMD21的支援,以及API的變動。到此下載供ESP8266用的韌體,例如供此模組用的adafruit-circuitpython-feather_huzzah-0.9.5.bin,然後燒錄即可,序列埠連線速率是115200。CircuitPython文件到此參閱,原始碼在GitHub,還有專屬的Gitter聊天室論壇

也可以自己建置,需要工具是ESP Open SDK,自己從頭搞的話太麻煩,參考這份文件,使用VirtualBox、Vagrant打造建置環境,然後便可建置CircuitPython(MicroPython也可以)。

注意,在0.9.0版以前,若是此模組Adafruit HUZZAH ESP8266 Breakout的話,序列埠連線會有問題,雖可出現Python提示符號(三個大於),但輸入沒反應。

若是0.9.1~0.9.4版,則無法正常連線。
上述問題已於0.9.5版解決,原因在這篇論壇討論文章另一篇


其他:
  • Pycom,各種以Python為開發語言的開發板,如WiPy、LoPy、SiPy等等。 
  • ampy,Adafruit MicroPython Tool,序列埠工具,傳送、存取檔案。

12 comments:

  1. 葉難大大
    請問有辦法能夠讓我arduino抓到的數據丟到excel裡嗎?
    抓到的是電表的資訊,用modbus協定,rs485傳輸到arduino。
    現在卡在整合數據的方法。
    還請大大幫幫忙,感激不盡。

    ReplyDelete
    Replies
    1. 建議儲存成csv檔,用excel直接開啟。
      我是這樣做的。

      Delete
  2. 讓arduino與電腦連接起來囉,藍牙、WiFi、有線連接等等。
    然後電腦端跑程式,接收數據,寫入excel檔。

    ReplyDelete
  3. 請問有人可以幫忙開發一個計畫:
    1. 由 UART 讀出一個溫度值.
    2. 透過 WiFi 及 MQTT 傳送溫度資料到 Cloud database.
    3. 能推播 給 App.
    4. 能開發 iOS及Android APP

    ReplyDelete
    Replies
    1. 可到發包/接案的網站詢問。

      Delete
  4. 葉難大哥, 請教一下:

    Arduino uno 與 arduino marco pro 板子在序列埠上有什麼不同寫法嗎?

    我從以下網址找了一個程式,是一個數學題目的解法
    https://sites.google.com/site/csjhmaker/arduino-ji-chu/arduino-xue-xi-fang-fa

    我覺的很奇怪的地方是我用「Arduino uno」上傳程式成功後,可以在序列埠監控視窗得到計算結果
    但是我用「arduino marco pro 」上傳程式成功後,序列埠監控視窗是空白沒有任何回應

    可以請教這是為什麼嗎?設定問題?

    程式碼
    int i=1;
    void setup() {
    Serial.begin(9600);
    for(long b=1 ; b<1000 ; b++){ //b=1~1000逐一代入
    for(long m=1 ; m<19 ; m++){ //m=1~19 逐一代入
    long delta = b*b-10*m ;
    double ans = sqrt(delta); // sqrt() 為開根號的動作函式
    if(ans-long(ans)==0){ // long()為取整數後存成長整數,原數-取整數=小數部分
    Serial.print("i="); // i為第幾組滿除條件解的個數
    Serial.print(i);
    Serial.print(" , ");
    Serial.print("b=");
    Serial.print(b);
    Serial.print(" , ");
    Serial.print("c=");
    Serial.print(2*m);
    Serial.print(" , ");
    Serial.print("delta=");
    Serial.print(delta);
    Serial.print(" , ");
    Serial.print("ans=");
    Serial.println(ans);
    i++;
    }}}}
    void loop() {
    }

    ReplyDelete
    Replies
    1. 「arduino marco pro 」?這是那一塊板子?網路上找不到

      Delete
  5. 我寫錯了是 arduino micro pro

    http://www.playrobot.com/arduino-board/1064-pro-micro-5v-16mhz.html

    Pro Micro - 5V/16MHz 是使用ATmega32U4控制器 5V / 16MHz,主要採取了低價位、周邊不銲接接腳,方便使用者自行連接不同種類pin腳。

    產品規格:
    ATmega32U4 running at 5V/16MHz
    Supported under Arduino IDE v1.0.1
    On-Board micro-USB connector for programming
    4 x 10-bit ADC pins
    12 x Digital I/Os (5 are PWM capable)
    Rx and Tx Hardware Serial Connections
    Our Smallest Arduino-Compatible Board Yet!
    Dimensions: 1.3x0.7"


    文件下載:
    Schematic
    Eagle Files
    Hookup Guide
    Graphical Datasheet
    Datasheet (ATmega32U4)
    Firmware Note
    Arduino Addon Files
    Arduino Addon Files (IDE 1.5+)
    GitHub (Design Files)

    ReplyDelete
    Replies
    1. Uno因有一顆獨立晶片負責USB轉TTL Serial,所以當主晶片重置時,該連線並不會斷掉,
      但ATmega32U4是它自己模擬,

      試試在setup()的開頭處,加上這一行
      while (!Serial);
      等待開啟序列埠。

      Delete
  6. 葉難大哥,十分感謝您的回覆。

    ReplyDelete
  7. 老師你好 我想請問我目前想要做暗號門的問題
    就是我們想利用arduino+聲音感測器+伺服馬達
    然後如果敲門會輸出訊號讓led亮
    (就是敲->led亮 沒敲就沒亮
    然後去進行判斷是否敲門的間隔是我們要的 如果是就讓伺服馬達進行轉90度從而達成開門的效果
    可是不知道該如何去使arduino進行這種一連串接受到的判斷

    ReplyDelete