[教學] 認識 MicroPython (三) - 移植 Blink 範例程式到 NodeMCU

NodeMCU Blink範例程式
移植 Arduino IDE 裡面的 Blink 範例程式到 MicroPython,需要用到兩個 MicroPython 模組,time模組用來處理時間延遲,在 MicroPython 裡面,不會直接碰硬體計時器 Timer,或計數器 Counter,他把這些工作,包進去實時作業系統 RTOS 的管理中,以虛擬計時器的方式來實現。machine 模組裡面的 Pin 類別,則是用來控制 NodeMCU 的 GPIO 腳位。

先用直譯器編寫這個簡單的程式

先在直譯器中試驗一下 Blink 範例程式。NodeMcu v3 電路設計與腳位安排,是把 LED 藍燈設定在 D4,也就是 GPIO2。只要呼叫、初始化一個 Pin 類別物件,把GPIO2 設定為輸出,然後對 GPIO2 執行輸出的 0 與 1 切換,就能讓藍燈閃爍。
>>> import time
>>> from machine import Pin
>>> p2 = Pin(2, Pin.OUT)
>>> while True:
...     p2.on()
...     time.sleep_ms(500)
...     p2.off()
...     time.sleep_ms(500)
...
...
...
上面的無窮迴圈,while True,會讓閃爍永遠持續下去。輸入完幾行無窮迴圈中的開關命令,按三次 Enter 鍵,才能開始執行迴圈。要跳出迴圈的話,可以用我們經驗中的 Ctrl-C 按鍵,跳出這個無窮迴圈。
MicroPython 直譯器,還提供貼上程式的方法,讓你可以快速試驗一些寫好的範例程式。按下 Ctrl-E 進入貼上模式,會顯示提示字元 ===。複製、貼上下面重新編排的程式之後,按下 Ctrl-D 一口氣執行,就可以看到藍燈開始閃爍:

import time
from machine import Pin
p2 = Pin(2, Pin.OUT)
while True:
    p2.on()
    time.sleep_ms(500)
    p2.off()
    time.sleep_ms(500)

另外還有Ctrl-A按鍵,進入 raw REPL 開發者模式、Ctrl-B 返回正常模式、Ctrl-D 重新開機。這些可以透過輸入 help() 指令看到,前一節有提過,這個指令也會教你,怎麼樣啟動 NodeMCU 的無線網路。

用 WebREPL 上傳第一個程式

把上面的程式,先用文字編輯器,產生一個名為 main.py 的程式檔。然後用前文試過的 WebREPL 上傳這個檔案進去 NodeMCU。

上傳前面試驗成功的 Blink 程式到 NodeMCU
在 WebREPL 用戶端界面,按下 Ctrl-D 重開機之後,你就會看到 NodeMCU 的藍燈開始閃爍。跟前面在直譯器所試驗的結果一樣。
閃爍的藍燈
試完這個範例程式,一些基本的 IO 操作,基本上都沒問題了。要寫讀取開關狀態、打開/關閉繼電器,還是輸出特定頻率、Duty 的 PWM信號,轉動伺服機角度,還是弄個調光控制,或是輸出特定 I/O Sequence Patter 讓步進馬達轉起來,多半已經沒什麼難度了。
比如說,用 MicroPython 來輸出 PWM 控制伺服機轉動角度,看起來超簡單:

>>> servo = machine.PWM(machine.Pin(12), freq=50)
>>> servo.duty(40)
>>> servo.duty(115)
>>> servo.duty(77)

玩膩了,把剛上傳的 main.py 刪掉

由於目前 Blink 程式正在無限執行,你再次用REPL連線進去之後,記得要按 Ctrl-C 跳出目前執行的 Blink 程式,才能做其他的動作,不然你怎麼按 Enter鍵,NodeMCU也不會理你。
如果要刪除上傳的 main.py,不要讓它在重開機之後又執行,可以用以下指令,把檔案刪掉:
>>> uos.remove('main.py')
這樣就刪掉了。
如果捨不得刪,可以改掉檔名就好:
>>> uos.rename('main.py', 'blink.py')
更多 uos 檔案系統管理的功能,可以用 help 來看 uos 這個模組可用的方法函式:
>>> help(uos)
object <module 'uos'> is of type module
  __name__ -- uos
  uname -- <function>
  urandom -- <function>
  dupterm -- <function>
  dupterm_notify -- <function>
  ilistdir -- <function>
  listdir -- <function>
  mkdir -- <function>
  rmdir -- <function>
  chdir -- <function>
  getcwd -- <function>
  remove -- <function>
  rename -- <function>
  stat -- <function>
  statvfs -- <function>
  mount -- <function>
  umount -- <function>
  VfsFat -- <class 'VfsFat'>
(竟然還有 mount/umound 方法函式,難不成可以外接 SD 卡?是的,ESP32有兩個 Channel 的 SD/MMC ,透過兩個 SPI Port 存取 SD卡。)

換上 PWM 輸出程式,控制風扇轉速

像上面這個簡單的 IO 程式,馬上就可以舉一反三,另外寫一個風扇調速程式。輸出 PWM ,然後透過一顆蝦皮買到的雙通道 MOSFET,調整 PWM 的 Duty Cycle,來控制 DC 風扇的轉速。

import time
from machine import Pin, PWM

#define 50Hz PWM output on D2 (GPIO4)
pwmfan = PWM(Pin(4), freq=50, duty=0)

#speed up fan in 50 cycles FOR loop until duty cycle became 980/1024
for i in range(50):
    pwmfan.duty(i*20)#maximum duty will be 49*20 = 980
    time.sleep_ms(250)

time.sleep(5)
#disable PWM pin after 17.5 seconds
pwmfan.deinit()

NodeMCU PWM Control Fan Speed

這個 MOSFET 模組,上面並聯兩顆 AOD4184,提供電壓 5V–36V 電流 15A,最大切換功率400W,一顆15元台幣。搜尋「大功率MOS管」關鍵字就可以找到,還蠻好用的。以前那些光華買的很貴的晶片都變垃圾了。

下一步?

到此已經學會在 MicroPython 下,處理在 Arduino IDE 寫程式、執行的過程。接下來可以更深入地去了解 MicroPython 提供的那些模組、類別、方法函式,並開始用 Python 來實現一些 IoT 的點子,執行遠端無線網路遙控。
細節可以參考 MicroPython 函式庫 線上手冊與教學。
也可以像一般 Python 去下載一些外加的函式庫,可以在這裡找到 MicroPthon 官方函式庫
然後像一般 Python 可以用 pip 指令線上安裝函式庫,比如以下指令,安裝 struct 函式庫。官方函式庫前面都會加上 micropython- 字眼
>>> import upip
>>> upip.install("micropython-struct")
函式庫下載之後,會放在 /lib 目錄中。你自己寫的函式庫,也可以放進去裡面。

沒有留言:

張貼留言