ESP32 MicroPython與Python的pySerial模組進行UART序列通訊

使用ESP32控制板(三):MicroPython的類比輸入、UART序列埠以及觸控開關」提到ESP32硬體有兩個UART埠,腳位編號如下,晶片的6~11腳內定被用於連接快閃記憶體,所以UART 1無法使用。

UART編號TX(傳送)腳RX(接收)腳
0GPIO1GPIO3
1GPIO10GPIO9
2GPIO17GPIO16

使用硬體UART序列埠收發Python序列資料

UART 0是ESP32與電腦USB介面相連的序列埠,用於傳輸程式檔以及Python的REPL操作(從終端機輸入和輸出訊息),不可挪作他用。如果要透過UART序列埠接收和傳送訊息給其他程式,例如,傳給電腦的Python程式,請改用UART 2。

底下是在UART 2連接「USB轉TTL序列」模組的電路,某些「USB轉TTL序列」模組的TX腳可切換成5V或3.3V輸出,若採3.3V輸出,則連接TX腳的1KΩ電阻可省略。

在UART 2連接「USB轉TTL序列」模組的電路

這兩個UART埠都連接電腦的USB介面。上圖假設連接電腦終端機的UART0的電腦端序列埠號是COM3;UART2的電腦端序列埠號假設是COM9。

修改「使用Python的pySerial模組進行序列通訊:連接電腦與Arduino和MicroPython」裡的MicroPython程式,採用UART2硬體介面、9600bps鮑率的ESP32序列通訊程式碼:

from machine import Pin
from machine import UART

def main():
    com = UART(2, 9600, tx=17, rx=16)
    com.init(9600)

    led = Pin(5, Pin.OUT, value=1)  # 設定LED接腳
    print('MicroPython Ready...')  # 輸出訊息到終端機

    while True:
        choice = com.readline()

        if choice == b'LED_ON\n':
            led.value(0)
            com.write(b'LED is ON!\n')  # 回應訊息給電腦端的Python
        elif choice == b'LED_OFF\n':
            led.value(1)
            com.write(b'LED is OFF!\n')

if __name__ == '__main__':
    main()

把上面的程式命名成main.py,存入ESP32開發板。然後在電腦上執行「使用Python的pySerial模組進行序列通訊:連接電腦與Arduino和MicroPython」裡的Python序列通訊程式(序列埠記得改成上圖的COM9),即可控制開發板內建的LED。UART的鮑率不一定要設成9600,只要通訊雙方的速率相同即可。

使用軟體UART序列埠收發Python序列資料

使用ESP32控制板(一):WEMOS LOLIN32簡介」提到控制板的UART埠可透過軟體指定任意接腳,相當於Arduino程式的SoftwareSerial。用軟體設定時,UART腳可以是任意GPIO腳,但ESP32的34, 35, 36和39不支援數位輸出,所以不能用於TX。

底下的敘述代表改用ESP32晶片的18和19當作UART 1的接腳:

com = UART(1, 9600, tx=18, rx=19)

那如果把UART 1改成使用UART 0的預設腳:

com = UART(1, 9600, tx=1, rx=3)

結果將是:

  • 可透過ESP32預設的USB序列通訊介面收發Python程式資料,不用再外接「USB轉TTL序列」介面。
  • REPL功能失去作用,也無法透過USB上傳程式檔。

因此,改用預設的USB序列通訊介面接腳之前,請設置一個開關來切換是否執行軟體序列埠,筆者把開關接在腳13:

切換是否執行軟體序列埠開關電路

這個開關可以用一根導線代替。開機時,若開關被按著,或者用導線將腳13接地,則不啟用自訂的軟體序列埠,否則啟用軟體序列埠。

ESP32的MicroPython軟體UART序列通訊範例程式碼:

from machine import Pin
from machine import UART

def main():
    # UART 1設成USB序列埠的預設腳
    com = UART(1, 9600, tx=1, rx=3)
    com.init(9600)
    led = Pin(5, Pin.OUT, value=1)

    while True:
        choice = com.readline()

        if choice == b'LED_ON\n':
            led.value(0)
            com.write(b'LED is ON!\n')  # 回應訊息給電腦端的Python
        elif choice == b'LED_OFF\n':
            led.value(1)
            com.write(b'LED is OFF!\n')

if __name__ == '__main__':
    ser_pin = Pin(13, Pin.IN, Pin.PULL_UP) # 腳13設成輸入、啟用上拉電阻。
    if ser_pin.value() == 1:  # 若腳13沒有接地…
        main()

ESP32控制板的腳13先接地(等同按下開關),然後把main.py存入ESP32。然後拔掉腳13的接地線(等同放開開關),再重置(Reset)ESP32,它將執行軟體UART通訊程式。在電腦上執行Python序列通訊程式,即可控制開發板內建的LED。

Posts created 483

2 thoughts on “ESP32 MicroPython與Python的pySerial模組進行UART序列通訊

  1. 請問一下,若是要使用Modbus rtu 的話,並且腳位是17,18,程式要如何撰寫呢?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top