MicroPython筆記(02):使用WebREPL遠端操控 NodeMCU/ESP32

如要上傳程式或透過直譯的方式下指令給 NodeMCU/ESP32,我常用的工具是 uPyCraft IDE,可是必須將 USB 線一直接在電腦上。有沒有辦法開機就可以執行特定程式?只要將要執行程式寫在 boot.py 或 main.py中,開機就會優先執行這兩個程式。另一個要實做的是直接經由 Web 控制 NodeMCU/ESP32 的工具 WebREPL。

[AI-Thinker ESP32S Layout]


[開機自動執行程式]

MicroPytho 系統下有兩個程式是 NodeMCU/ESP32 在一接上電源的時候就會馬上被執行的程式,依序是 boot.py 及 main.py,如果希望在開機時,就要執行的程式,可以寫在 main.py 中,
boot.py 執行一些系統設定,執行一次就結束,接著執行 main.py,通常將無限迴圈放在 main.py中。這樣 NodeMCU/ESP32 就可以不需要一直接在電腦上,由使用者按下執行按鈕,只需要接上電源就可以運作了。

[WebREPL]

所謂 REPL是 Read Evaluate Print Loop的簡稱,意為讀取-求值-列印-循環,也就是交互式提示的名稱。可以透過 UART 串列埠進行有線連接或經由 WiFi無線網路,經由瀏覽器連接 WebREPL 使用 MicroPython 指令進行控制 NodeMCU/ESP32 的交互式終端。使用 WebREPL前,需先進行設定,在提示列>>>執行:
import webrepl_setup
出現以下畫面:

在上圖第一個提示時,輸入:E,讓 NodeMCU/ESP32 接上電源後就會自動啟動 WebREPL 功能。按下Enter後,還要輸入一組密碼兩次,這是透過瀏覽器連接 WebREPL 需要進行驗證的密碼,密碼長度為4-9個字符。最後輸入 y 重新起動 ESP8266/ESP32。如果再執行一次 import webrepl_setup,就會看到以下已經 Enable 的畫面:


只做這個設定還不夠,僅完成 WebREPL 的遠程更新而已。將開發板重開機後,開啟 uPyCraft IDE,設定好連接埠,可以看到左方 device 的資料夾內有兩個 .py 檔案,除了原有的 boot.py 外多了一個 webrepl_cfg.py,這個檔案內放著先前設定的 WebREPL 密碼,是明文沒有加密的。如下圖:


上述作業完成後,要透過 WebREPL 連接開發板,可以使用瀏覽器(Chrome或Firefox)開啟用戶端,用戶端是一個網頁程式,可以直接連線至 http://micropython.org/webrepl ,或是從 GitHub 下載程式 執行。


左上角預設連線 IP 為 192,168.4.1 Port 8266,當按下 Connect 後沒有反應,如果將開發板斷電再重新上電啟動後,WebREPL 服務也不能正常執行,主要原因是沒有連接無線網路,也就是無法使用瀏覽器進行連線。

要解決上述問題,可以在開機時執行無線網路連線,需要修改 boot.py ,內容如下:
import network, webrepl
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('MyHome', '12345678')
print('network config:', wlan.ifconfig())
webrepl.start()



重新啟動開發板就會自動連線至無線網路,如果不知道連線的 IP,可以在 uPyCraft IDE 開啟 boot.py,按下執行按鍵,可以看到下方列出開發板取得的 IP。

使用瀏覽器開啟用戶端 WebREPL,修改IP:ws://192.168.1.119:8266,按下 Connect 按鍵,可以看到輸入密碼的畫面,輸入密碼後,就可以使用互動式的指令操控 NodeMCU/ESP32 的開發板了。


輸入以下指令測試一下,可以正常回應。
import os
os.listdir()

[network模組]

ESP8266/ESP32 內建 WiFi 功能,可以當做 station 模式用來連線基地台,而 AP(Access Point) 模式是把自己當作無線基地台,提供他人連線到這個開發板。

在 MicroPython 要先使用 import network 指令匯入 network 模組,接著使用active()啟動連線,並依據登入無線基地台的SSID跟密碼來進行連線。如果要把 NodeMCU/ESP32作為 station,請執行:
wlan = network.WLAN(network.STA_IF)
如果要把 ESP8266/ESP32 當作為基地台,可執行以下的指令:
wlan = network.WLAN(network.AP_IF)

要使用無線網路指令前,需先將 network 模組匯入
import network
一旦建立了網路,就可以像往常一樣用於創建和使用 TCP / UDP 通訊端。有關network模組指令,請參考下表:

指令說明
wlan = network.WLAN(network.STA_IF)建立無線AP介面
wlan.active(True)啟動無線網路
wlan.scan()掃描可以存取的無線網路
wlan.connect('ssid', 'password')連接無線 AP
wlan.isconnected()檢查是否連線成功
結果:True
wlan.config('mac')取得介面的 MAC 位址
結果:b'\xccP\xe3H\xc4\xe1'
wlan.ifconfig()取得介面的 IP/netmask/gw/DNS 位址
結果:('192.168.1.119', '255.255.255.0', '192.168.1.1', '192.168.1.1')

[範例]
def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('ssid', 'password')
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())


實做 WebREPL 後,發現這並不是一個很理想的工具,主要是要先設定好無線網路的環境後,才可以透過瀏覽器進行控制,可是對於初學者要設定無線網路還是有一點點難度,但好處是擺脫 USB 線的束縛。

[參考資料]

Post a Comment

較新的 較舊