使用ESP32控制板(三):MicroPython的類比輸入、UART序列埠以及觸控開關」提到ESP32硬體有兩個UART埠,腳位編號如下,晶片的6~11腳內定被用於連接快閃記憶體,所以UART 1無法使用。
UART編號 | TX(傳送)腳 | RX(接收)腳 |
---|---|---|
0 | GPIO1 | GPIO3 |
1 | GPIO10 | GPIO9 |
2 | GPIO17 | GPIO16 |
使用硬體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埠都連接電腦的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。
請問一下,若是要使用Modbus rtu 的話,並且腳位是17,18,程式要如何撰寫呢?
請直接參考這個程式庫的範例:
https://github.com/brainelectronics/micropython-modbus