樹莓派對大家來說像是一臺小電腦一樣,所以第一次拿到 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 語法竟然可以拿來控制硬體,一直以為它的主力都是點在數據相關,這次操作算是蠻驚喜的。