[Raspberry Pi Pico] 試用 MicroPython 和 LED

樹莓派對大家來說像是一臺小電腦一樣,所以第一次拿到 Raspberry Pi Pico(以下簡稱 Pico)有點意外,後來真正使用後才發現和 Arduino 很類似,是微控制器開發板,還可以搭配樹莓派處理類比輸入等相關的應用。

雖然上面有我的 Pico 實體照,我這邊還是用官方照片比較清楚一點XD 至於實體真的非常小,非常可愛。

關於 MicroPython

MicroPython 其實就是精簡版的 Python,讓我們能透過 Python 來控制硬體。目前 MicroPython 已經支援 ESP8266/ESP32 和 Arduino 等開發板,當然也包含今天要用到的 Pico。它擁有許多迷你的函式庫,也有和硬體相關的函式庫讓我們能夠控制硬體。

不過呢,因為 Pico 的定位是微控制器開發板,沒有使用者介面,所以要用和 Arduino 一樣的方式,藉由一台電腦,也就是另外一台樹莓派,將韌體燒錄至板子上。

接下來就是相關步驟:

開啟 Thonny

啟動樹莓派後,開啟 Thonny,並依照路徑 Tools/ Options 開啟視窗。

設定直譯器和燒錄韌體

點選 Interpreter 頁籤,第一個關於直譯器和裝置的下拉選單選擇「MicroPython (Raspberry Pi Pico)」。

在設定之前,記得先連接 Pico 到目前使用的樹莓派。第二個關於連接埠的下拉選單選擇「ttyAMA0(/dev/ttyAMA0)」,並且點選右下角的安裝或更新韌體。

一般來說應該會順利安裝,若沒有的話試試看重新檢查 Pico 的連接。燒錄完成後就可以關閉對話框回到原來的 Options 視窗,並且把連接埠(Port)下拉選單改成「<Try to detect port automatically>」,也就是說讓 Thonny 自動偵測。

設定完成後點選 OK 回到 Thonny 介面,並且可以檢查一下有沒有連接成功,沒有的話按按看 Stop/Restart backend 按鈕(紅色那個)重新啟動 Pico。

開始實作!

點亮 Pico 本身的 LED

今天的實作都是和 LED 相關。首先我們要藉由 Pico 上的 LED 測試一下 Pico 是否有正確連接(GPIO 腳位是 25)。

from machine import Pin
import time

led = Pin(25, Pin.OUT)
while True:
    led.value(1)
    time.sleep(1)
    led.value(0)
    time.sleep(1)

點按執行後,應該會出現要存檔的視窗,有本機(This computer)和 Pico 的選項,選擇本機即可。儲存後執行,Pico 上的 LED 會一閃一閃的。參數值 1 是點亮,0 是熄滅。這裡寫的是無限迴圈,會不斷執行除非強制終止,因此確認完後記得點按 Stop 結束執行。

LED 閃爍

LED 本身長腳是正極,短腳是負極(或是接地、GND),會連接在 GPIO15。中間再接個 220 Ω 或 330 Ω 電阻。

from machine import Pin
import time

led = Pin(15, Pin.OUT)
while True:
    led.value(1)
    time.sleep(1)
    led.value(0)
    time.sleep(1)

利用按鍵點亮 LED

加上按鈕要連接 GPIO14(10 kΩ)。指定數位輸入(Pin.IN)後,會讀取 GPIO 的狀態是 1 或是 0 ,另外 Pin.PULL_UP 是啟用上拉電阻的參數,讓 GPIO 擁有初始值 1。上拉也就是關,button 預設值 1,因此相對來說下壓是開,button 值為 0

from machine import Pin
import time

led = Pin(15, Pin.OUT)
button = Pin(14, Pin.IN, Pin.PULL_UP)
while True:
    if button.value() == 0:
        led.value(1)
        time.sleep(0.2)
    else:
        led.value(0)

手動調整 LED 亮度

這裡我們利用腳位 GPIO15 的類比輸出調整亮度。運用的是 PWM 技術,最多同時可以使用 16 個 PWM 接角。

程式會要求使用者輸入數值 0-100,這個數值會被轉換成類比輸出 0-65536(也就是 $latex 2^{16})。

from machine import Pin, PWM
import time

pwm = PWM(Pin(15))
pwm.freq(1000)

while True:
    duty = int(input("Brightness(0~100):"))
    bright = int(duty*655.36)
    pwm.duty_u16(bright)
    time.sleep(1)

讓 LED 呼吸

另外上面的類比輸出可以利用迴圈,轉變成好像自動讓它調亮又調暗,有呼吸燈的效果:

from machine import Pin, PWM
import time

pwm = PWM(Pin(15))

while True:
    for i in range(0, 65536, 100):
        pwm.duty_u16(i)
        time.sleep(0.01)
    for i in range(65536, -1, -100):
        pwm.duty_u16(i)
        time.sleep(0.01)

雖然都是很簡單的 LED 示範,但看著燈泡發亮老實說蠻有魔力的。也沒有想到 Python 語法竟然可以拿來控制硬體,一直以為它的主力都是點在數據相關,這次操作算是蠻驚喜的。

讓我知道你在想什麼!