2019年6月25日 星期二

MicroPython v1.11 釋出

最近因為要幫二哥規劃物聯網學習進程, 重拾 MicroPython on ESP8266 專案, 於是上網追蹤 MicroPython 演進, 發現它已釋出 v1.11 版韌體, ESP8266 與 ESP32 版本下載連結如下 :

http://micropython.org/download/#esp8266
http://micropython.org/download/#esp32

最近跟露天賣家買了兩塊 NodeMCU ESP32 板子, 我看了賣家提供的教學說明, 覺得以 ESP32 取代 Arduino 很有道理, 不過他採用 Arduino IDE 作為開發工具, 參考 :

ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

其論點我非常認同, 摘要如下 :
  1. Arduino 缺乏 WiFi 與藍芽, 需要另購模組很不實用. ESP32 則一應俱全, 學校應該改用 ESP32 教學. 
  2. ESP8266 模組例如 D1 mni 只有一個 ADC 腳太少 (需要另外購買 PCF8591 ADC/DAC 模組), 而 ESP32 的 18 隻 GPIO 都可做DIO 或 ADC 使用. 
另外一篇作者也是使用 NodeMCU, 雖然不是採用 ESP32 (應該是 ESP-12 模組), 但開發工具是 MicroPython :

用 Python 玩硬體:MicroPython 簡介與實作

其論點認為 ESP-01 模組只有兩個 GPIO 腳太陽春, 做不了甚麼大事. 而 NodeMCU 有 USB 與多個 GPIO, 比 ESP-01 方便太多. 這個我非常認同. ESP-01 只適合用在簡單的 ON-OFF 控制應用.

綜合而言我覺得 :
  1. 簡單的 2 個輸出入控制 : ESP-01 (60 元)
  2. 需要 8 個輸出入不需要藍芽的應用 : D1 mini (80 元)
  3. 需要 8 個以上 GPIO & ADC 以及藍芽的應用 : ESP32 (200 元)
關於 D1 mini 與 MicroPython 參考 :

WeMOS D1 Mini 開發板測試
MicroPython 學習筆記索引

我在零件箱找到以前買的一塊 NodeMCU (ESP-12), 就用這塊 ESP8266 模組來燒錄 MicroPython v1.11 韌體吧 ! 這款 NodeMCU 是 ESP8266 模組, 因此仍可用 ESP8266Flasher.exe 程式燒錄, 但我打算改用 esptool 套件, 先用 pip3 安裝此套件 :

pip3 install esptool

另外 NodeMCU 大都採用 CP2102 晶片做 UART 與 USB 轉換, 需到 Silicon Labs 公司網站下載安裝驅動程式 :

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

安裝好後在控制台的裝置管理員頁面就會看到 CP210X 的 COM 埠, 此處為 COM8, 清除與燒錄需指定所連接的 COM 埠.


1. 檢查 flash id 與 size : 

下面指令用來檢查這塊 NodeMCU 上的 flash 記憶體大小 :

C:\Users\User>esptool.py.exe --port COM8 --baud 115200 flash_id 
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266 
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22 
Uploading stub...
Running stub...
Stub running...
Manufacturer: e0
Device: 4016
Detected flash size: 4MB 
Hard resetting via RTS pin...

可見此板上的 SoC 處理器晶片為 ESP8266, flash 大小為 4MB, 只有 WiFi 功能.


2. 清除 flash 內程式與資料 : 

注意, 在按 ENTER 執行刪除 flash 與燒錄韌體前須先按住板子右下角的 flash 鈕, 等出現 Connecting ... 後再放開 :




C:\Users\User>esptool.py.exe --port COM8 erase_flash 
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 13.6s
Hard resetting via RTS pin...


3. 下載 MicroPython 韌體進行燒錄 : 

先切換到下載韌體所在目錄, 同樣地, 在按 ENTER 執行燒錄韌體前須先按住板子右下角的 flash 鈕, 等出現 Connecting ... 後再放開 :

D:\>cd test 

D:\test>esptool.py.exe --port COM8 --baud 115200 write_flash -fm dio -fs 4MB 0x00000 esp8266-20190529-v1.11.bin   
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash params set to 0x0240
Compressed 617880 bytes to 402086...
Wrote 617880 bytes (402086 compressed) at 0x00000000 in 35.9 seconds (effective 137.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

這樣就燒錄完成了.


4. 檢查硬體與韌體狀態 : 

以 PuTTY 用 Serial 115200 連線 NodeMCU, 檢查硬體與韌體狀態 :

MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> import esp 
>>> esp.check_fw()   
size: 617864
md5: 9cdb85c9e0150cef6a2a5cc589283483
True   
>>> import port_diag   
FlashROM:
Flash ID: 1640e0 (Vendor: e0 Device: 4016)
Flash bootloader data:
Byte @2: 02
Byte @3: 40 (Flash size: 4MB Flash freq: 40MHZ)
Firmware checksum:
size: 617864
md5: 9cdb85c9e0150cef6a2a5cc589283483
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:

韌體 checksum 結果 True 表示韌體正常無毀損. 此外也顯示固定的 AP 網址為 192.168.4.1, 而 flash 有 4MB, 對於一般物聯網應用絕對足夠使用.


5. 檢查檔案系統  : 

>>> import os 
>>> os.listdir() 
['boot.py'] 

可見根目錄下只有一個啟動檔案 boot.py, 用 open() 開啟 boot.py 再用迴圈讀取內容 :

>>> f=open('boot.py','r') 
>>> for line in f.readlines():   
...     print(line) 
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import uos, machine   

#uos.dupterm(None, 1) # disable REPL on UART(0)

import gc 

#import webrepl

#webrepl.start()

gc.collect() 

可見預設已引入 uos, gc, 以及 machine 三個內建模組, webrepl 是關閉的, 需手動開啟.


6. 開啟 webrepl 功能 : 

只要引入 webrepl_setup 模組即可開啟 werepl 功能 :

 >>> import webrepl_setup 
WebREPL daemon auto-start status: disabled

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E 
To enable WebREPL, you must set password for it
New password (4-9 chars): 123456   
Confirm password: 123456   
Changes will be activated after reboot 
Would you like to reboot now? (y/n) y

開啟 webrepl 後要按 reset 鈕重啟, 但我發現只有這樣好像看起來開機成功, 但按鍵盤 PuTTY 卻沒反應, 但關掉 PuTTY 並重插 USB 線就可以了.

這樣再次讀取 boot.py 會發現 webrepl 在啟動時就開啟了 :

>>> f=open('boot.py','r') 
>>> for line in f.readlines(): 
...     print(line)
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import uos, machine

#uos.dupterm(None, 1) # disable REPL on UART(0)

import gc

import webrepl

webrepl.start()

gc.collect()

沒有留言 :