iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

ESP32 Micropython 從入門到實用系列 第 8

08.使用開發板上的 Micropython REPL

  • 分享至 

  • xImage
  •  

我們前面花了一個星期來準備板子相關的環境,從今天開始,才算是真正把板子用了起來!

從前面的 Python 資源裏面,您應該瞭解了 Python 直譯器通常帶有一個互動界面 REPL, 您可利用這個界面來輸入指令、資料、以及印出訊息。 Micropython 也有個 REPL, 我們可以用 Thonny 或是 mpremote 工具來連上開發板,使用 Micropython 的 REPL 。

這裡需要注意的是,同時就只有一個程式能連上某個 Serial port。當我們使用 Thonny 連上了某個 Serial port,我們就不能用其它在這台PC的終端(例如 mpremote)連上這個 Serial port,會報出錯誤訊息。

例如
https://ithelp.ithome.com.tw/upload/images/20230923/20140037W28bn58VJE.png

這時我們想要用 "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,如下圖
https://ithelp.ithome.com.tw/upload/images/20230923/20140037v6scp5YGXW.png
這樣 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" :
https://ithelp.ithome.com.tw/upload/images/20230923/20140037Ykr767xQeo.png

果然:
https://ithelp.ithome.com.tw/upload/images/20230923/20140037gBmxx0fDoS.png
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鍵:
https://ithelp.ithome.com.tw/upload/images/20230923/201400371JlNy364Ya.png
我們發現找的了 109 筆資料,接着按下第一筆:
https://ithelp.ithome.com.tw/upload/images/20230923/20140037KVco4m8AVX.png

這樣我們就可以查找到內建 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
>>>

上一篇
07.Python 入門學習途徑
下一篇
09.點亮一顆LED燈與開發板硬體學習入門
系列文
ESP32 Micropython 從入門到實用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言