2017年4月26日 星期三

MicroPython on ESP8266 (一) : 燒錄韌體

好久沒玩 ESP8266 了, 之前有想要在 ESP-01 模組上灌 NodeMCU 都一直沒時間. 最近在努力學習 Python, 今天突發奇想 : 可以在 ESP8266 上跑 Python 嗎? 我在 Google 輸入 "ESP8266 Python" 進行搜尋, 想看看這兩個我最有興趣的一硬一軟詞彙是否交集, 呵呵, 還真的找到了 MicrPython 這個專案, 這是一個包含 Python 3 標準函式庫的精簡子集實作, 為資源受限的嵌入式設備上提供了一個低階的作業系統環境 (Python OS) 以執行 Python 3 解譯器.

MicroPython 是澳洲的 Damien Geoge 在 Kickstarter 上所發起的一個開源專案 :

參考 :

MicroPython tutorial for ESP8266  (官方教學)
# An Introduction to MicroPython
ESP8266 and MicroPython - Part 1
https://learn.adafruit.com/micropython-basics-load-files-and-run-code
https://learn.adafruit.com/building-and-running-micropython-on-the-esp8266/overview

MicroPython 提供了許多 Python 的高階功能, 例如互動式命令提示介面 (稱為 REPL, Read Evaluate Print Loop), 無限精準度整數, 閉包 (Closure), 串列功能, 以及例外處理等等. 其目標是盡量做到與電腦上完整的CPython 相容, 使得桌上型電腦上的 Python 程式碼可以很容易地移植到微控器等嵌入式設備中執行.  MicroPython 除了實作了 Python 核心函式庫外, 也加入了稱為 machine 的函式庫以存取低階的硬體資源. 參考 MicroPython 的 WiKi 與文件 :

http://wiki.micropython.org/Home
http://docs.micropython.org/en/latest/pyboard/
MicroPython Documentation (v1.8.6 PDF)
MicroPython tutorial for ESP8266  (官方教學)
http://docs.micropython.org/en/latest/micropython-esp8266.pdf
http://docs.micropython.org/en/latest/pyboard/library/usocket.html#class-socket
http://docs.micropython.org/en/v1.8.7/esp8266/library/usocket.html#module-usocket
https://gist.github.com/xyb/9a4c8d7fba92e6e3761a (驅動程式)

MicroPython 是用 C99 寫的, 與 CPython 之間的差異參考 :

http://docs.micropython.org/en/latest/pyboard/genrst/index.html

MicroPython 目前可以在 ESP8266 與 Pyboard 等板子上執行, Pyboard 是以 STM32F405RG 微控器為核心的開發板, 處理器架構為 ARM Cortex-M4 32 位元, 具有 1MB 的 FLASH ROM 與 192KB 的 RAM, 內建三軸加速器, 參考官網與 Adafruit 介紹 :




不過 PyBoard 小小一片不便宜, 露天都 1800 元以上 :

# 【樹莓派Raspberry pi 專營店】MicroPython pyboard $2150

露天賣家 Proteus 則有一塊外觀像 Arduino, 但用 ESP-12F 做的開發板, 可直接使用 Arduino IDE 進行開發 :

# ESP8266 Arduino IDE 開發板 $486

而 Adafruit 也有一塊 HUZZAH 開發板, 要價 16.95 美金 (約 508 元台幣), 此板具有 4MB FLASH 記憶體, 9 個 GPIO 腳, 內建 CP2104 USB 轉換晶片 (但無 USB 插槽), 露天也有賣 :

# Adafruit Feather HUZZAH with ESP8266 WiFi 
# 《德源科技》Adafruit HUZZAH ESP8266 Breakout(ada2471) $441
# 《iCshop1》HUZZAH ESP8266 Breakout【80 MHz,3.3V】$450

我比較有興趣的是如何在 ESP8266 上跑 MicroPython, 因為我手邊還有好幾片 ESP8266 ESP-01 模組. 只要用 TTL-UART 模組將 MicroPython 韌體燒錄到 ESP-01 裡, 就可以在 ESP-01 上執行 Python 指令碼了. Adafruit 網站有介紹如何燒錄 MicroPython 韌體到 ESP8266 上, 參考 :


MicroPython 有各板子的論壇可發問求助, ESP8266 板的 MicroPython 論壇位址如下 :

https://forum.micropython.org/viewforum.php?f=16

首先是到 MicroPython 官網下載韌體 :


因為我手邊的是 512KB 藍板的 ESP-01, 所以要下載 512K 的韌體, 當然跟 1MB 的韌體的差別是有些功能被取消了, 這樣才能把韌體大小瘦身下來 :


接下來是將 ESP-01 模組接上 USB-TTL 上傳線, 我使用的是網路上很便宜的 PL2303HX (最便宜約 29 元, 參考 PL2303HX USB轉TTL 線材版), 燒錄前要將 GPIO0 接地才行 (須在 power up 之前, 因 ESP8266 是在電源打開時偵測 GPIO 以便決定是否進入燒錄模式), 燒錄完成後再拔掉接地線 :


參考 : 

但要注意這款上傳線的驅動程式在 Win8 以上電腦要安裝舊版 (2009 年以前的) 才會動, 參考 :

# 安裝 PL2303HX USB 轉 TTL 驅動程式
# 關於 PL2303HX 在 win8 無法驅動的問題
安裝 PL2303HX USB 轉 TTL 驅動程式

燒錄軟體官網介紹的是使用 Python 的 esptools 套件, 安裝指令如下 :

D:\test>pip install esptool
Collecting esptool
  Downloading esptool-1.3.tar.gz
Collecting pyserial>=2.5 (from esptool)
  Using cached pyserial-3.3-py2.py3-none-any.whl
Installing collected packages: pyserial, esptool
  Running setup.py install for esptool ... done
Successfully installed esptool-1.3 pyserial-3.3

但我看了一下它的燒錄指令, 發現似乎是給 MacOS 上用的, Windows 上要怎麼下沒時間去研究, 所以還是用以前燒錄 AT 指令韌體的 ESP8266 Flasher :

# 下載 ESP8266 Flasher (參考 ESP8266: Reflash Dance!)
Esp8266 Firmware Update

這個軟體操作很簡單, 就是選定 COM 埠, 指定要燒錄的 bin 韌體, 按 Download 即可, 燒錄結束時會出現 Failed to leave flash mode 不要理它, 那是 bug :


注意, 如果按 "Download" 鈕都沒反應, 但檢查裝置管理員 COM 埠又是正常, 那麼只要插拔一下 USB 插頭就應該可以抓到串列埠了.

也可以使用另一款 ESP8266Flasher.exe 來燒錄, 此程式可以指定燒錄速度 : 


執行 ESP8266Flasher.exe 後先在 Operation 頁籤指定 COM 埠 :


然後在 Config 頁籤中按齒輪鈕指定 MicroPython 韌體 :


在 Advanced 頁籤中選擇速率 115200, Flash Size 為 512KB :


最後返回 Operation 頁籤按下右邊的 Flash 鈕即開始燒錄 : 


燒錄進度滿格後, 檢查 Log 頁籤, 若左下角出現打勾表示燒錄成功, 否則失敗 :


我原先下載到 1MB 的韌體, 結果都是燒錄到約 89% 就停掉了, 重複試了好幾次都是這樣, 才想到我的 ESP-01 是舊版的 512KB, 用 1MB 的韌體當然燒不進去囉. 同樣地, 若按 "Flash" 鈕都沒反應, 但檢查裝置管理員 COM 埠又是正常, 切到 Log 這邊通常會看到 Serial port not connectted 訊息, 只要插拔一下 USB 插頭就應該可以抓到串列埠了

燒錄完成後關電, 拔掉 GPIO0 的接地線, 先開啟 Putty, 選擇 Serial 串列通訊, 115200 速率與所接的 COM 埠, 開啟連線即進入 Python 執行環境  (Linux 環境則是使用 screen) :


這時再給 ESP-01 送電就可以順利進入 REPL 命令模式了 :


預設是三個大於符號的 REPL 介面 (即 Python 解譯器提示符號). 輸入 help() 會顯示操作說明 :

>>> help()
Welcome to MicroPython!

For online docs please visit http://docs.micropython.org/en/latest/esp8266/ .
For diagnostic information to include in bug reports execute 'import port_diag'.

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()                             # Scan for available access points
sta_if.connect("sta_if.isconnected()                      # Check for successful connection
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="
Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)

按 CTRL+A 進入一個大於符號的原始 REPL 介面, 這是給了解 MicroPython 實作細節較了解的工程師使用的. 按 CTRL+B 則是進入正常的 REPL 介面, 也就是 Python 解譯器介面. 按 CTRL+C 可中斷執行中的程式, 按 CTRL+D 會使板子重置 (reset), CTRL+E 進入張貼模式. 


輸入 print("Hello Worl") 可正常執行; 但 print "Hello World" 卻錯誤, 可見確實是 Python3 環境. 此 REPL 介面會儲存前 6 次指令, 可按向上鍵叫回之前所下的指令修改為新指令, 這對測試程式功能相當方便.

我用一個 USB 電壓電流計量取 5V-3.3V 電源板所吃電流大約是 40mA 左右, 這包括了電源板本身的消耗, 所以估計 ESP8266 大約消耗 30mA 左右.

參考 :

【一起玩esp8266】简单调试


2017-05-16 補充 :

上週購買的五顆 ESP-01 1MB Flash 板收到後一直到昨晚才有時間測試, 但忘了將 USB-TTL 轉接線接地與將 CHPD 接 VCC, 搞了十分鐘才順利將 1MB 韌體燒錄完畢. 如果 CHPD 沒接 HIGH, 則 LOG 會一直顯示 Finding ESP8266, 如果有顯示 MAC 就表示已順利找到 ESP8266, 才能順利燒錄.





完成後開機顯示如下訊息, 跟 512MB 版確實不同 :

b▒#4 ets_task(40100164, 3, 3fff8398, 4)
could not open file 'boot.py' for reading
could not open file 'main.py' for reading

MicroPython v1.8.7-7-gb5a1a20a3 on 2017-01-09; ESP module with ESP8266
Type "help()" for more information.
>>>

參考下列文章, 以 import port_diag 指令可檢視板子的設定情形 :

https://github.com/micropython/micropython/issues/2255

>>> import port_diag
FlashROM:
Flash ID: 1440c8 (Vendor: c8 Device: 4014)
Flash bootloader data:
Byte @2: 02
Byte @3: 20 (Flash size: 1MB Flash freq: 40MHZ)
Firmware checksum:
size: 586684
md5: 2c7ce68f0e1a5690257698e5e42caf16
True

Networking:
STA ifconfig: ('0.0.0.0', '0.0.0.0', '0.0.0.0', '208.67.222.222')
AP ifconfig: ('192.168.4.1', '255.255.255.0', '192.168.4.1', '208.67.222.222')
Free WiFi driver buffers of type:
0: 8 (1,2 TX)
1: 0 (4 Mngmt TX(len: 0x41-0x100))
2: 8 (5 Mngmt TX (len: 0-0x40))
3: 4 (7)
4: 7 (8 RX)
lwIP PCBs:
Active PCB states:
Listen PCB states:
TIME-WAIT PCB states:

另外, 可用 esp 函式庫檢查韌體是否有問題 :

>>> import esp
>>> esp.check_fw()
size: 586684
md5: 2c7ce68f0e1a5690257698e5e42caf16
True

最後顯示 True 表示韌體正常, 毋須重燒.  參考 :


2017-05-19 補充 :

除了下載現成的韌體燒錄到 ESP8266 板上外, 還可以自行從原始碼編譯韌體, 好處是可以挑選自己想要的功能或擴充現成韌體沒有包含的功能, 參考 :


另外, MicroPython on ESP8266 目前也還未支援 SD 卡 :

"MicroPython on the ESP8266 does not currently support running Python code off a SD card or other file system like other more mature MicroPython boards!"

參考 :


Adafruit 有賣一款 SD 卡擴充板, 問題是 ESP-01 能用嗎? 

# micropython-upip 1.2 (安裝擴充套件)

2017-06-18 補充 :

官網建議用 1M Bytes 的 ESP8266 模組 :


"The minimum requirement for flash size is 1Mbyte. There is also a special build for boards with 512KB, but it is highly limited comparing to the normal build: there is no support for filesystem, and thus features which depend on it won’t work (WebREPL, upip, etc.). As such, 512KB build will be more interesting for users who build from source and fine-tune parameters for their particular application."

2017-06-26 補充 :

今天在 "MemoryError: memory allocation failed, allocating" 看到 os.uname() 指令, 它會傳回  6 元素 tuple 顯示系統資訊如韌體版本 : 

>>> import os
>>> os.uname()
(sysname='esp8266', nodename='esp8266', release='2.0.0(5a875ba)', version='v1.9.1-8-g7213e78d on 2017-06-12', machine='ESP module with ESP8266')

2017-07-05 補充 :

今天找到這個 Python 語言學習網站, 值得參考 :


2017-09-09 補充 :

今天看到下面這個網站, 才知道 MicroPython 部分資助來自歐洲太空總署, 而且只有一位專職核心開發者, 兩名業餘貢獻者, 雖然還是屬於開發中的技術, 但持續成熟中 ! 


25 則留言 :

呂浩宇 提到...

不好意思 我看了很多您的文章
關於ESP8266 ESP01的連線方式
我一直無法成功
已經用了麵包版店員固定3.3v
然後接usb轉TTL(CP2102)用SSCOM32或是Realterm
都沒辦法連接使用AT指令(所有鮑率都換過了)
ESP8226上的藍燈一直無閃爍
電路接法都跟您文章的一樣
我也換了兩張晶片了
用Arduino跟esp8266溝通則一直是
ATE0
[1613] Failed to disable Echo
AT+CIPCLOSE=1

卡了好幾天 麻煩指導了

Tony Huang 提到...

不知道是不是韌體的關係, 我一直使用 0018000902 版的韌體都沒問題, 此版預設 9600 鮑率鰻穩的, 參考下面這篇試試看 :

http://yhhuang1966.blogspot.tw/2015/08/esp8266.html

Tony Huang 提到...

下面這篇有人提到原因是鮑率, 參考 :

https://community.blynk.cc/t/solved-failed-to-disable-echo-problem/3955

呂浩宇 提到...

因為我沒辦法連接電腦 所以也沒辦法升級韌體欸
向sscom32不管哪個鮑率都只走亂碼
沒看到OK
一鍵燒入則是time out

Tony Huang 提到...

會不會是 CP2102 有問題呢? 我使用 PL2303HX 除了 DRIVER 外未曾遇到過 USB 連線問題. 另外, ESP8266 啟動時較吃電流, 應使用獨立的 3.3V 電源板為宜. 首先到裝置管理員檢查 COM PORT 是否有驚嘆號, 有表示無 DRIVER 或版本不對. COM PORT 沒問題了才可能連線成功. 連線 OK 了就直接用 esp8266 flasher 程式燒錄韌體.

柏辰施 提到...

老師您好 我與上面的同學有一樣的問題
無法連接上電腦
PL2303已經更新過 能夠正常使用
板子是黑色的ESP01
電源供應使用 麵包版電源供應器
使用Realterm做測試,所有Baud都是過了,沒有反應
我有在一篇文章看到 Send AT指令 要左邊的status 的 RXD 跟 TXD 要同時亮
可是我只有亮TXD 按SEND ESP會瞬間亮藍燈
上面說可能配線錯誤或有元件損壞
目前我無法確認的設備大概只有PL2303不確定
剩下的設備都確定是正常的
配線是
ESP VCC -> 麵包版電源3.3V
ESP CH_PD > 麵包版3.3V
ESP TXD > PL2303 RXD
ESP RXD > PL2303 TXD
ESP GND >麵包版GND
PL2303 GND > 麵包版GND

我有嘗試直接燒錄韌體(有將GPIO0接地) flasher (白色介面)會顯示connect failed
(黑色介面)會卡在正在尋找芯片

順序我是 接完所有配線>接上 PL2303 > 開啟麵包版電源
在黑藍色的燒錄軟體,有嘗試過先點一鍵燒錄才開啟麵包版電源
以上都沒有結果

希望老師有空之時,能夠幫忙我分析問題所在
非常感激!

Tony Huang 提到...

施兄您好, 接線看來是對的, 但燒錄新韌體要將 GPIO0 腳接地, 而且是在 ESP-01 送電前就必須接地 (ESP 是在開機時偵測 GPIO0 是否為 LOW, 是的話進入燒錄模式), 燒錄完畢後關電拔掉 GPIO0 即可. 另外我手上都有一顆以上 ESP8266, 也有兩條 PL2303, 以備有問題時替換看看哪裡有問題, 但備用品至今都沒用過. 您不會這麼巧剛好買到有問題的零件吧? 其次還有一個共接地問題常被忽略, 就是 EXP8266, PL2303, 以及麵包板電源模組的 GND 都必須共接, 否則無法形成迴路, 不過您的接線看來是 OK 的. 麵包板電源模組上的 JUMPER 也要注意, 最好用三用電表量過再送電, 免得把 5V 電源灌給 ESP8266 造成損壞.

Tony Huang 提到...

另外, 驅動程式 OK 嗎? 裝置管理員那邊有看到 COM 埠且無驚嘆號嗎?

柏辰施 提到...

Tony老師,感謝您的回覆
我之前在燒錄韌體時,有遵照老師的作法及順序,仍然無法成功
於是我先將目標放置於能夠成功與ESP8266溝通,再來進行韌體燒錄
我有拍一些照片放上雲端請老師參考一下
https://drive.google.com/open?id=0B-ZQfaVyNA7vaVdnZXhvbUFNczQ

紅線 ESP8266 VCC
橘線 ESP8266 CH_PD
黑線兩條 ESP8266 GND / PL2303 GND
黃線 ESP8266 RXD 對接 綠線 PL2303 TXD
綠線 ESP8266 TXD 對接 白線 PL2303 RXD

電源輸出3.3V
PL2303的驅動 我有嘗試過2017版 2014版 但我的作業系統在win10 兩個版本接會出現驚嘆號
所以我使用2008版本的驅動程式,就解決了驚嘆號問題,但仍舊無法順利溝通

配備部分 我ESP01有買兩顆,防止損壞
因為我是資管科系,沒有三用電表及相關的使用知識,感謝老師提點,我去進行相關知識的學習
因為ESP01搞很久,又有進度壓力,最近在一個有相關經驗的學弟推薦下,決定買一顆ESP-12E來進行測試
最後感激老師的回覆,謝謝

Tony Huang 提到...

看圖應該沒錯, 除了速率不同之外, 我燒的韌體是 9600 bps. 另外 Realterm 的 Display 頁籤, 要勾選 Display As 與 ANSI 才不會有亂碼.ESP-12 拉出較多 I/O, 記憶體也較大, 接法跟 ESP-01 一樣.

Tony Huang 提到...

實作的東西就是這樣, 變數很多, 要一步步縮小障礙點才能找出癥結.

Tony Huang 提到...

realterm 參考 :

http://yhhuang1966.blogspot.tw/2015/07/esp8266-wifi-at-command.html

匿名 提到...

所以應該買ESP-01S的,
因為ESP-01S的CHPD已經把電阻接到VCC.......

Yi-Siang Ciou 提到...

老師您好,我這幾天購買了一片ESP8266如圖 http://imgur.com/3ypwsjC
燒錄任體的方式是直接透過傳輸線和Nodemcu-flasher燒錄esp8266-20170823-v1.9.2.bin
完成後上電再用putty連線只會得到連續不間斷的無意義亂碼 (esp8266本身led會持續閃爍)
想請問該如何解決?

Tony Huang 提到...

您好, 請下載上面 ESP8266Flasher.exe 再次燒錄, 注意需先將 GPIO0 (不是板上的 D0) 接地才能開機進行燒錄, BAUD RATE 115200, 40MHz, SIZE 應該是 4MB.

Yi-Siang Ciou 提到...

老師你好 剛剛先接地並在燒錄後拔掉
結果已經有如文章中顯是韌體版本及Python環境了
但是介面無法輸入任何指令可能是什麼原因呢?
附圖:http://imgur.com/imeFK7b

Tony Huang 提到...

CTRL+ D : 軟體重置
CTRL + B : 進入 REPL 介面
CTRL + C : 鍵盤中斷

按 CTRL + B 應該 OK, 不然按重置鈕試試看.

Tony Huang 提到...

ok 嗎?

Yi-Siang Ciou 提到...

感謝老師 重新燒錄後沒問題了
想再請教老師 若是要開始測試網路上一些範例程式
如整個目錄包含多個.py檔 是要用webrepl來編譯嗎?
還是有其他更簡便的方式?

Tony Huang 提到...

webrepl 是指令介面, 是解譯不是編譯. python 程式可用 webrepl 上傳, 也可以直接用 ampy 上傳. 參考 :
http://yhhuang1966.blogspot.tw/2017/05/micropython-on-esp8266_18.html
http://yhhuang1966.blogspot.tw/2017/05/micropython-on-esp8266-wifi_16.html

Yi-Siang Ciou 提到...

了解 我已經透過Webrepl一個一個將檔案丟過去
包含main.py及boot.py及其他py檔
不過nodemcu是否能像linux環境用ls之類的指令查詢呢
能夠方便清楚知道目前上面有哪些檔案?

Tony Huang 提到...

webrepl 沒辦法, 要用 ampy 或 mpfshell, 參考 :

http://yhhuang1966.blogspot.tw/2017/05/micropython-on-esp8266_18.html

Yi-Siang Ciou 提到...

老師您好 又遇到了幾個非常詭異的問題..
因為測是GPIO的部分碰到 Pin' object has no attribute 'low'的問題
爬文後發現是Flash size的問題 於是將4M改為1M和512K測試
但結果竟然又回到最初的問題 燒錄完後會不斷閃爍藍燈並從console傳送出亂碼
有將gnd和gpio接在一起但試了幾次版子依然如此 這樣是被我玩壞了嗎?
這麼多狀況還請老師包含

Tony Huang 提到...

NodeMCU 板子應該是 4MB, 不可燒 4MB 以下. 另外, 在新版韌體中, Pin 物件已經沒有 high() 與 low(), 必須用 value(1) 與 value(0).

Yi-Siang Ciou 提到...

感謝老師回覆! 原來是這個問題阿
早上不小心碰到樹莓派的網路孔外殼短路到燒掉了
晚點買好心的版子再來測試看看! 感謝..