ESP8266遠端控制——MicroPython 韌體初體驗

0x7e2發表於2020-04-04

簡介

使用 FRP 將樹莓派的私網IP NAT 到公網的雲伺服器,樹莓派和 ESP8266 之間使用 USB連線,實現對ESP8266的遠端控制

開發環境介紹

今天的主角長這樣:

ESP8266遠端控制——MicroPython 韌體初體驗
淘寶 10 塊錢。懶得在自己的機器上裝各種包,又給它找了個跳板機,長這樣
ESP8266遠端控制——MicroPython 韌體初體驗
這個稍貴。不過是當時畢業前忽悠老師要到的,不要錢。裝個 Linux 系統之後,直接 ssh 上去就好使。拿 vim 湊合寫幾行語句應該也行了。但是發現不在家的時候,掏出電腦來想玩一會兒沒辦法,所以花了點時間搞一搞內網穿透也是很有必要的:使用FRP做內網穿透。需要有云伺服器。當時我買的時候剛好畢業,和畢設老師要錢買了兩年的雲伺服器。不會寫C、C++。所以給 esp8266 找了個 microPython 的韌體,搞一搞直接寫 Python 豈不是美哉?(如果會寫 C 的話,可以試試 AliOS Things)在 REPL 中寫語句,測試方便,但是儲存下來非常不方便。自己除錯還好,正式寫點東西是不成的。官方提供了 WebREPL,可以支援上傳檔案的那種:WebREPL Github Repo 點這裡,不管下載到本地還是跳板機都是可以的。使用 webrepl.py 可以完成板子和跳板機(本地)的同步。跳板機上還需要安裝一個 esptool,用來刷韌體進去。當然跳板機和 esp8266 之間還需要一條 microUSB 線進行連線(我買的esp8266自帶了 USB2UART 晶片——CP2102)。

# install esptool
pip install esptool
# download bin file
wget http://micropython.org/resources/firmware/esp8266-20191220-v1.12.bin
複製程式碼

手頭還需要一個開發機,mac、linux 都可以(只要能開啟 terminal,有網路即可),或者直接用 raspberry,不過條件不至於這麼艱苦才是。因為跳板機(raspberry)資源比較有限,所以我沒有安裝 virtulenv,如果機器資源比較富裕,推薦使用 venv 環境,並且配合 zsh 的 autoenv 外掛,效率提升很明顯。

Write Flash

esp8266 廠家提供了韌體,奈何我不會C語言 。所以這裡就直接先清除掉原有的韌體,刷入支援 microPython 的韌體


# erase flash
esptool.py --port /dev/ttyUSB0 erase_flash
# write new flash
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20191220-v1.12.bin
複製程式碼

其中 /dev/tty* 是 esp8266 對應的 port,這個看機器不同而不同。一般是 /dev/ttyUSB0(raspberry)或者 /dev/cu.SLAB_USBtoUART(mac)。Windows 一般是 COM*。開發嵌入式的一般都推薦用 Window 做主力機,可是我不喜歡 Windows。

親測 -fm dio 需要加上,具體原因在官方文件中有說明:

For some boards with a particular FlashROM configuration (e.g. some variants of a NodeMCU board) you may need to use the following command to deploy the firmware (note the -fm dio option)

這樣韌體就刷好了。

WIFI 網路連線

可以說如果沒有網路,ESP8266 就沒啥可玩的了。刷完 microPython 的韌體之後,需要按一下 RST 鍵。然後可以通過 screen 連線進入 microPython REPL(需要接著 USB 線)

# attach raspberry
ssh -i ~/.ssh/id_rpi -oPort=9434 pi@192.168.1.2

# attach microPython REPL
screen /dev/ttyUSB0 115200
複製程式碼

然後進入 microPythonREPL

MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
Type "help()" for more information.
>>>
複製程式碼

開啟 webREPL,然後就可以上傳檔案到板子上了

>>> import webrepl_setup
複製程式碼

按照提示說明做就行。不出意外,你已經成功開啟 WebREPL,並且設定好密碼了。

WebREPL daemon started on ws://192.168.4.1:8266
複製程式碼

接下來請保證和 Esp8266 在同一個區域網下~。如果有跳板機存在,則只需要跳板機和 esp8266在同一個區域網,本機能訪問通跳板機即可。板子自己會建立一個 WIFI,名稱是 MicroPython-xxxxxx,密碼是 _micropythonN_接下來將下面倉庫 clone 到跳板機或者本地,並啟動

git clone git@github.com:micropython/webrepl.git
複製程式碼

然後在本地建立檔案 boot.py。這個檔案會在板子開始工作之後自動執行。

# -*- coding:utf-8 -*-
# 2020-02-13
# https://docs.micropython.org/en/latest/esp8266/quickref.html#networking

import network

def init_wifi_conn(wlan, ssid, pwd):
    wlan.active(True)
    wlan.connect(ssid, pwd)
    while not wlan.isconnected():
        pass
    print("network config:", wlan.ifconfig())


def do_connection():
    sta_if = network.WLAN(network.STA_IF)
    
    # remember modify ssid and pwd.
    ssid = "your_wifi_ssid"
    pwd = "your_wifi_pwd"
    if not sta_if.isconnected():
        init_wifi_conn(sta_if, ssid, pwd)


if __name__ == '__main__':
    import webrepl
    do_connection()
    webrepl.start()

複製程式碼

然後在跳板機執行以下命令,將本地檔案 push 到 esp8266:

# cd webrepl

./webrepl_cli.py -p 1234 boot.py  192.168.4.1:/boot.py
複製程式碼

然後按住板子 reset 按鈕,再次通過 screen 進入 microPython REPL 檢視,發現 webREPL 多了一個地址,例如下圖:


WebREPL daemon started on ws://192.168.4.1:8266
WebREPL daemon started on ws://192.168.1.2:8266
Started webrepl in normal mode
複製程式碼

下面的 192.168.1.2 就是路由器分配給 Esp8266 的 ip 地址。WebREPL也可以使用 web 版本,如下:


# cd webrepl

python3 -m http.server

複製程式碼

隨後,本地瀏覽器訪問 http://{跳板機IP}:8000/webrepl.html,同樣可以連線 esp8266

GPIO

ESP8266遠端控制——MicroPython 韌體初體驗
GPIO介面定義見上述參考圖,可以使用 GPIO 實現一些非常有意思的東西。

長按兩秒識別二維碼關注

ESP8266遠端控制——MicroPython 韌體初體驗
公眾號對話方塊,回覆關鍵字“位元組跳動內推”獲取位元組跳動內推碼

相關文章