我們前面花了一個星期來準備板子相關的環境,從今天開始,才算是真正把板子用了起來!
從前面的 Python 資源裏面,您應該瞭解了 Python 直譯器通常帶有一個互動界面 REPL, 您可利用這個界面來輸入指令、資料、以及印出訊息。 Micropython 也有個 REPL, 我們可以用 Thonny 或是 mpremote 工具來連上開發板,使用 Micropython 的 REPL 。
這裡需要注意的是,同時就只有一個程式能連上某個 Serial port。當我們使用 Thonny 連上了某個 Serial port,我們就不能用其它在這台PC的終端(例如 mpremote)連上這個 Serial port,會報出錯誤訊息。
例如
這時我們想要用 "mpremote connect com9" 指令來連接到開發板
(base) PS C:\Users\ts>
(base) PS C:\Users\ts> mpremote devs
COM4 None 0000:0000 Microsoft None
COM5 None 0000:0000 Microsoft None
COM9 123456 303a:4001 Microsoft None
(base) PS C:\Users\ts>
(base) PS C:\Users\ts> mpremote connect com9
failed to access com9 (it may be in use by another program)
(base) PS C:\Users\ts>
發現到報出 com9 無法存取(access)的錯誤;反之亦然,若您已經用 mpremote 連上了開發板,就不能用 Thonny 連上開發板了,若這時要用 Thonny 來連板子, mpremote 的連線必須先中斷,然後才能由 Thonny 來連接。
Thonny 的斷線,可以從 RUN 表單中點擊 disconnect,如下圖
這樣 Thonny 就與開發板中斷連線了
然後我們再用 mpremote 連線看看:
(base) PS C:\Users\ts> mpremote connect com9
Connected to MicroPython at com9
Use Ctrl-] or Ctrl-x to exit this shell
但是,沒看到 REPL 的 >>> 提示符號啊! 您可以按一下 "Enter" 看看,若是沒有出現 >>>,再按一下 CTRL-C,若再不行,再按 CTRL-B。這個 Enter(跳下一行),CTRL-C(中斷程式的執行),CTRL-B(離開raw-mode)是您可以記住常用的順序。
在 mpremote 已經連線的情況下,這時,我們用 Thonny 連線到 com9, 看看會發生什麼事,
在 RUN 表單中點擊 “Stop/Restart backend" :
果然:
com9 報錯了 !
好了,入論如何,我們現在能夠自由的連上 Micropython 的 REPL了,這是一個非常有用的界面,我常常在 REPL 試一些小程式片段,成功之後再貼上主程式。
以下我們來介紹幾個 Micropython REPL 操作片段:
查看 help
>>> help()
Welcome to MicroPython on the ESP32!
For online docs please visit http://docs.micropython.org/
For access to the hardware use the 'machine' module:
import machine
pin12 = machine.Pin(12, machine.Pin.OUT)
pin12.value(1)
pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
print(pin13.value())
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22))
i2c.scan()
i2c.writeto(addr, b'1234')
i2c.readfrom(addr, 4)
Basic WiFi configuration:
import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected() # Check for successful connection
Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode
For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>>
查看系統支援哪些內建的模組(Module):
>>> help('modules')
__main__ bluetooth hashlib re
_asyncio btree heapq select
_boot builtins inisetup socket
_espnow cmath io ssl
_onewire collections json struct
_thread cryptolib machine sys
_webrepl deflate math time
apa106 dht micropython uasyncio
array ds18x20 mip/__init__ uctypes
asyncio/__init__ errno neopixel umqtt/robust
asyncio/core esp network umqtt/simple
asyncio/event esp32 ntptime upysh
asyncio/funcs espnow onewire urequests
asyncio/lock flashbdev os webrepl
asyncio/stream framebuf platform webrepl_setup
binascii gc random websocket
Plus any modules on the filesystem
>>>
我們以 time module 爲例,用 import time 匯入進來,並且用dir(time) 來查看:
>>> import time
>>> dir(time)
['__class__', '__name__', '__dict__', 'gmtime', 'localtime', 'mktime', 'sleep', 'sleep_ms', 'sleep_us', 'ticks_add', 'ticks_cpu', 'ticks_diff', 'ticks_ms', 'ticks_us', 'time', 'time_ns']
>>>
我們用 help(time) 來看看:
>>> help(time)
object <module 'time'> is of type module
__name__ -- time
gmtime -- <function>
localtime -- <function>
mktime -- <function>
time -- <function>
time_ns -- <function>
sleep -- <function>
sleep_ms -- <function>
sleep_us -- <function>
ticks_ms -- <function>
ticks_us -- <function>
ticks_cpu -- <function>
ticks_add -- <function>
ticks_diff -- <function>
>>>
我們發現 time.sleep 是個函數,試一下:
>>> time.sleep(5) ; print('Hi')
Hi
>>>
果然,停了(sleep) 5 秒鐘,才印出 Hi 。
在 Micropython REPL 中,善用 help()、dir(),對於我們正確程式的編寫,除錯很有幫助。
但是 help()、dir()等的訊息畢竟有限,想要得到這些內建函數、模組的詳細功能,還是要參考到 Micropython 官方的文件網頁: https://docs.micropython.org/en/latest/
我們在左上角的查詢框中輸入 ”time module", 然後按 Enter鍵:
我們發現找的了 109 筆資料,接着按下第一筆:
這樣我們就可以查找到內建 time 模組的詳細用法了。
其它的模組也是以此類推,若有不懂的地方,可以到社群上提問,提問的功力也是需要練習與精進的。
注意一下,Micropython 畢竟是一個閹割版的 Python, 您可以在 Micropython REPL 試試之前學到的 Python 指令,看看能不能執行,下面是我隨便的試了一下:
>>> 3+5
8
>>> a = 3
>>> b = 5
>>> c = 3 + 5
>>> c
8
>>> print(c)
8
>>> c = 3.0 + 5
>>> c
8.0
>>> round(3.5)
4
>>> round(-3.5)
-4
>>> round(-2.5)
-2
>>> round(-1.5)
-2
>>> round(-0.5)
0
>>>