Python+ESP嵌入式開發快速上手

Apostle浩發表於2024-06-23

環境搭建

MicroPython介紹

MicroPython 是一種精簡版的 Python 程式語言,專門設計用於嵌入式系統和物聯網(IoT)開發。它提供了一個 Python 3 的子集,適用於資源受限的微控制器和微控制器環境。MicroPython 允許開發人員使用 Python 的簡潔語法和強大功能來編寫嵌入式系統的程式碼。

以下是一些關於 MicroPython 的要點:

  1. 特點

    • 小巧靈活:MicroPython 是一種輕量級的實現,適用於資源有限的裝置。
    • 易於學習:對於已經熟悉 Python 的開發者來說,學習 MicroPython 是相對簡單的。
    • 互動式 REPL:MicroPython 提供了互動式的 REPL(Read-Eval-Print Loop),方便除錯和快速原型開發。
    • 物件導向程式設計:支援物件導向程式設計範例,包括類、物件和繼承等概念。
  2. 用途

    • MicroPython 適用於許多嵌入式系統和物聯網應用的開發,如感測器網路、自動化控制、物聯網裝置等。
    • 它可以在各種微控制器和微控制器平臺上執行,例如 ESP8266、ESP32、STM32 等。
  3. 如何開始

    • 您可以從 MicroPython 官方網站(https://micropython.org/)下載適用於您的目標平臺的韌體。
    • 使用 USB 連線您的開發板或裝置,您可以透過串列埠 REPL 與裝置互動。
    • 透過編輯和上傳 Python 指令碼,您可以開始編寫和執行 MicroPython 程式碼。
  4. 語法

    • MicroPython 支援 Python 3 的語法和一些標準庫,但並非完全與 CPython 相容。
    • 基本的 Python 語法、函式和類在 MicroPython 中基本都能工作,但某些高階特性和標準庫可能不被支援。

MicroPython 為嵌入式開發者提供了一個用 Python 進行程式設計的輕量級選項,讓開發者能夠更方便地利用 Python 的優勢開發嵌入式系統和物聯網裝置。

安裝Thonny

Thonny 是一款簡單易用的 Python 整合開發環境 (IDE),旨在幫助初學者和教育者快速入門 Python 程式設計。它提供了許多功能和工具,使得編寫、執行和除錯 Python 程式碼變得更加簡單和直觀。

下面是 Thonny 的一些特點和常用功能:

  1. 簡單易用:Thonny 的使用者介面設計簡潔直觀,適合初學者快速上手並開始編寫 Python 程式碼。

  2. 整合偵錯程式:Thonny 整合了 Python 的偵錯程式,可以幫助您在程式碼中查詢和修復錯誤,便於編寫穩健的程式。

  3. 程式碼補全:Thonny 提供程式碼補全功能,可以快速補全程式碼,減少編寫程式碼時的錯誤。

  4. 視覺化變數監視:在除錯過程中,Thonny 提供了視覺化的變數監視器,方便您跟蹤程式中的變數值。

  5. 檔案管理器:Thonny 提供了檔案管理器,可以輕鬆管理專案檔案和目錄。

  6. 整合 Package Manager:可以透過 Thonny 的整合 Package Manager 安裝、升級和管理 Python 的第三方庫。

  7. 支援不同的 Python 直譯器:允許您在 Thonny 中配置和切換不同版本的 Python 直譯器,以便於開發不同環境下的專案。

  8. 支援多平臺:Thonny 可在 Windows、macOS 和 Linux 等作業系統上執行,提供跨平臺的開發體驗。

Thonny官方網站

ESP8266系列環境搭建

基於Windows系統下,燒錄韌體到 ESP8266 模組,請按照以下步驟進行操作:

準備工作

  1. 下載韌體:首先,確保您已經從(官方網站)[https://micropython.org/download/ESP8266_GENERIC/]或適當的資源處下載了要燒錄到 ESP8266 上的韌體。通常,韌體檔案是一個二進位制檔案(.bin 格式)。
img
  1. 安裝燒錄工具:您需要安裝適用於 ESP8266 的燒錄工具。一個常用的工具是 esptool。
pip install esptool

燒錄韌體步驟

  1. 連線 ESP8266

使用 USB 轉 TTL 串列埠聯結器將 ESP8266 模組連線到計算機。確保選擇正確的串列埠和波特率。

電腦透過usb連線esp32,檢視esp32的埠號,我這裡是COM4口。

img
  1. 擦除 Flash

在燒錄新韌體之前,您可能需要擦除 ESP8266 上的 Flash 儲存器。這可以透過下列 esptool命令完成:

esptool --port COM4 erase_flash

確保將 COM4 替換為您的 ESP8266 的實際埠號。

img

擦除完成。

  1. 燒錄韌體

使用 esptool來燒錄韌體到 ESP8266。示例命令如下:

esptool --port COM4 --baud 460800 write_flash --flash_size=detect 0  ESP8266_GENERIC-20240602-v1.23.0.bin
  • --port COM4: 指定 ESP8266 的串列埠號為COM4
  • --baud 460800: 指定波特率。
  • write_flash: 燒錄韌體到 Flash 儲存器。
  • ESP8266_GENERIC-20240602-v1.23.0.bin: 替換為您要燒錄的韌體檔名。
  1. 等待燒錄完成

燒錄過程需要一些時間。請耐心等待,直到燒錄進度完成。

  1. 重啟裝置

一旦韌體燒錄完成,斷開並重新連線 ESP8266 模組,或者透過復位將其重啟。

獲取 MicroPython REPL 提示

REPL 代表 Read Evaluate Print Loop,是您可以在 ESP8266 上訪問的互動式 MicroPython 提示的名稱。到目前為止,使用 REPL 是測試程式碼和執行命令的最簡單方法。

有兩種訪問 REPL 的方法:透過 UART 串​​行埠的有線連線,或透過 WiFi。

透過串列埠進行REPL

REPL 在 UART0 序列外圍裝置上始終可用,該外圍裝置連線到用於 TX 的引腳 GPIO1 和用於 RX 的 GPIO3。REPL 的波特率為 115200。如果您的板上有 USB 序列轉換器,那麼您應該能夠直接從您的 PC 訪問 REPL。否則,您將需要一種與 UART 通訊的方法。

使用Putty、MobaXterm等終端工具連線ESP8266開發版。

img

連續按多次Enter鍵,出現>>>提示符說明連線成功。

嘗試在提示符下鍵入以下內容:

>>> print('hello esp8266!')
hello esp8266!

如果你使用thonny開發編輯器,右下角可以直接選擇連線到的裝置。

img

配置WebREPL(網路瀏覽器互動提示)

連線WIFI

使用thonny編輯器,選擇開啟檔案,選擇從裝置中開啟。

img

選擇開啟boot.py檔案。

img

修改boot.py新增連線wifi程式碼:

# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import os, machine
#os.dupterm(None, 1) # disable REPL on UART(0)
import gc
import webrepl


def do_connect():
    import json
    import network
    # 嘗試讀取配置檔案wifi_confi.json,這裡我們以json的方式來儲存WIFI配置
    # wifi_config.json在根目錄下
    
    # 若不是初次執行,則將檔案中的內容讀取並載入到字典變數 config
    try:
        with open('wifi_config.json','r') as f:
            config = json.loads(f.read())
    # 若初次執行,則將進入excpet,執行配置檔案的建立        
    except:
        essid = input('wifi name:') # 輸入essid
        password = input('wifi passwrod:') # 輸入password
        config = dict(essid=essid, password=password) # 建立字典
        with open('wifi_config.json','w') as f:
            f.write(json.dumps(config)) # 將字典序列化為json字串,存入wifi_config.json
            
    #以下為正常的WIFI連線流程        
    wifi = network.WLAN(network.STA_IF)  
    if not wifi.isconnected(): 
        print('connecting to network...')
        wifi.active(True) 
        wifi.connect(config['essid'], config['password']) 
        import time
        time.sleep(5) #一般睡個5-10秒,應該綽綽有餘
        
        if not wifi.isconnected():
            wifi.active(False) #關掉連線,免得repl死迴圈輸出
            print('wifi connection error, please reconnect')
            import os
            # 連續輸錯essid和password會導致wifi_config.json不存在
            try:
                os.remove('wifi_config.json') # 刪除配置檔案
            except:
                pass
            do_connect() # 重新連線
        else:
            print('network config:', wifi.ifconfig()) 

if __name__ == '__main__':
    do_connect()
    
    webrepl.start()
    gc.collect()

點選執行,輸入賬號密碼連線WIFI.

img
配置WebREPL服務

要配置 ESP8266 上的 WebREPL(Web-based REPL),您可以按照以下步驟進行操作:

  1. 啟用 WebREPL
  • 在 REPL 中輸入以下命令以啟用 WebREPL:
>>>import webrepl_setup

WebREPL daemon auto-start status: disabled  #當前狀態:disabled  

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> e   #輸入e,開啟
Would you like to change WebREPL password? (y/n) y  #輸入y,修改與設定密碼
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 密碼。這將設定一個用於連線 WebREPL 的密碼。
  1. 連線到 WebREPL

使用串列埠連線ESP8266,在REPL輸入:

>>> import webrepl
>>> webrepl.start()
WebREPL server started on http://192.168.31.241:8266/
Started webrepl in normal mode
  • 現在,您可以連線到 ESP8266 的 WebREPL。您可以使用代表ESP8266_IP的IP地址。
  • 開啟瀏覽器並導航到http://192.168.4.1:8266
  • 輸入先前設定的 WebREPL 密碼以連線到 ESP8266。
img
  1. 使用 WebREPL

    • 一旦連線成功,您將可以透過 WebREPL 控制檯與 ESP8266 進行互動。
    • 您可以在 WebREPL 控制檯中執行 Python 命令和指令碼,實時檢視輸出。
  2. 遠端控制 ESP8266

    • 透過 WebREPL,您可以遠端控制 ESP8266,執行程式碼並監視輸出。
    • 還可以上傳和下載檔案,訪問裝置上的檔案系統等操作。

透過上述步驟,您可以配置並使用 ESP8266 上的 WebREPL,這使得與裝置互動更為方便。

ESP8266 使用教程

修改boot.py檔案

建立函式do_thing實現自定義功能塊的呼叫。

# This file is executed on every boot (including wake-boot from deepsleep)
# import esp
# esp.osdebug(None)
import os, machine

# os.dupterm(None, 1) # disable REPL on UART(0)
import gc
import webrepl
import time


def do_connect():
    import json
    import network

    # 嘗試讀取配置檔案wifi_confi.json,這裡我們以json的方式來儲存WIFI配置
    # wifi_config.json在根目錄下

    # 若不是初次執行,則將檔案中的內容讀取並載入到字典變數 config
    try:
        with open("wifi_config.json", "r") as f:
            config = json.loads(f.read())
    # 若初次執行,則將進入excpet,執行配置檔案的建立
    except:
        essid = input("wifi name:")  # 輸入essid
        password = input("wifi passwrod:")  # 輸入password
        config = dict(essid=essid, password=password)  # 建立字典
        with open("wifi_config.json", "w") as f:
            f.write(json.dumps(config))  # 將字典序列化為json字串,存入wifi_config.json

    # 以下為正常的WIFI連線流程
    wifi = network.WLAN(network.STA_IF)
    if not wifi.isconnected():
        print("connecting to network...")
        wifi.active(True)
        wifi.connect(config["essid"], config["password"])
        import time

        time.sleep(5)  # 一般睡個5-10秒,應該綽綽有餘

        if not wifi.isconnected():
            wifi.active(False)  # 關掉連線,免得repl死迴圈輸出
            print("wifi connection error, please reconnect")
            import os

            # 連續輸錯essid和password會導致wifi_config.json不存在
            try:
                os.remove("wifi_config.json")  # 刪除配置檔案
            except:
                pass
            do_connect()  # 重新連線
        else:
            print("network config:", wifi.ifconfig())


def do_thing():
    try:
        # 在這裡實現自定義的功能
    finally:
        pass


if __name__ == "__main__":
    do_connect()
    time.sleep(5)
    webrepl.start()
    gc.collect()
    do_thing()

點亮LED燈

要實現簡單的 LED 點燈功能,您可以使用以下程式碼示例透過 ESP8266 控制 LED 燈點亮和熄滅:

MicroPython 程式碼示例

定義led.py檔案。

import time
from machine import Pin

def led_light():
    # 實現燈閃爍
    led = Pin(2, Pin.OUT)

    while 1:
        led.value(1)
        time.sleep(1)
        led.value(0)
        time.sleep(1)

修改boot.py檔案,呼叫led_light函式。

#...
from led import *

def do_thing():
    try:
        led_light()
    finally:
        pass

#...

實現步驟

  1. 連線 LED:將 LED 的正極連線到 ESP8266 的 GPIO 引腳(例如 GPIO 2),將負極連線到 GND 引腳。

  2. 透過 Thonny IDE 或 WebREPL 連線到 ESP8266,並將上面的程式碼上傳並執行。

  3. LED 控制

    • 程式碼中的迴圈會使 LED 燈每隔一秒交替點亮和熄滅。
    • 您可以根據需要調整延時時間來控制 LED 點亮和熄滅的頻率。

PWM 呼吸燈

def pwm_led():
    # 實現呼吸燈
    led2 = PWM(Pin(2))
    led2.freq(1000)

    while True:  # 控制整體的重複 (1.從不亮到亮 2.從亮到不亮)
        # 1.實現從不亮到亮
        for i in range(0, 1024):
            led2.duty(i)
            time.sleep_ms(1)  # 每隔1ms變化一次亮度

        # 2.實現從亮到不亮
        for i in range(1023, -1, -1):
            led2.duty(i)
            time.sleep_ms(1)

PC控制LED燈

準備工具

下載NetAssist網路除錯工具

整體思路

img
  1. esp8266連線wifi,讓其擁有IP地址

  2. 建立UDP Socket

  3. 接收UDP資料

  4. 根據接收到的UDP資料控制LED燈的亮滅

實現程式碼

新建main.py放到ESP8266根目錄。

from net import *
from machine import Pin



def main():
    # 建立UDP套接字
    udp_socket = creat_udp_socket()
    # 建立GPIO引腳物件
    LED2 = Pin(2, Pin.OUT)
    # 接收UDP資料
    while True:
        recv_data, sender_info = udp_socket.recvfrom(1024)
        print("{}傳送的資料,{}".format(sender_info, recv_data))
        
        recv_data_str = recv_data.decode("utf-8")
        print("解碼後的資料:{}".format(recv_data_str))
        # 根據收到的UDP資料控制LED燈的亮滅
        if recv_data_str == "on":
            LED2.value(0)
            print("開燈")
        elif recv_data_str == "off":
            LED2.value(1)
            print("關燈")

if __name__ == "__main__":
    main()

開啟NetAssist配置本地UDP服務。給對應埠傳送on字元,燈會點亮,傳送off字元,燈會熄滅。

相關文章