Learning Objectives
- 說出 RP2040 微控制器的主要規格,以及 Pico、Pico W、Pico 2 的差別
- 用 BOOTSEL 按鈕與 UF2 檔案把 MicroPython 裝到 Pico 上
- 用 Pin("LED") 控制板上 LED,用 GP 編號控制外接 LED 與按鈕
- 用 ADC 讀取可變電阻的電壓,再用 PWM 的 duty_u16 調整 LED 亮度
Raspberry Pi 做的微控制器
提到 Raspberry Pi,多數人想到的是可以接螢幕、跑 Linux 的單板電腦(樹莓派軌整個軌道都在講它)。 Raspberry Pi Pico 是同一家公司做的另一種板子:它不是電腦,而是微控制器開發板,和 ESP32、micro:bit 同一類。 它沒有作業系統,通電後就執行你燒進去的程式,適合做「一直重複做一件事」的作品。
Pico 在 2021 年 1 月推出,板子上的晶片 RP2040 是 Raspberry Pi 自己設計的微控制器。官方文件列出的主要規格:
| 項目 | RP2040(Pico、Pico W) |
|---|---|
| 處理器 | 雙核心 Arm Cortex-M0+,最高 133 MHz |
| 記憶體(SRAM) | 264 KB |
| 板上快閃記憶體 | 2 MB(放韌體與你的程式檔) |
| GPIO | 26 支多功能腳位 |
| 類比輸入(ADC) | 3 支可用的 12 位元類比輸入 |
| PWM | 16 個通道 |
| 序列通訊 | UART、SPI、I2C 各 2 組 |
| PIO | 8 個可程式化 I/O 狀態機 |
拿它和上一課的 micro:bit、ESP32 軌的 ESP32 比:Pico 本身沒有無線網路,但腳位多、官方文件完整; 需要 Wi-Fi 時有 Pico W(多一顆無線晶片)。2024 年 8 月推出的 Pico 2 換成 RP2350 晶片 (Arm Cortex-M33 或 RISC-V 核心可選,最高 150 MHz、520 KB SRAM、4 MB 快閃記憶體),腳位排列和 Pico 相容。
這一課用 MicroPython 寫 Pico。語法和 ESP32 幾乎一樣,差別主要在腳位編號與幾個硬體細節。
腳位:GP 編號、3.3V 與幾支保留給板子的腳
Pico 兩側共 40 個接點,板子背面印的 GP0~GP28 是 GPIO 編號,程式裡 Pin(15) 就是 GP15。
注意實體腳位號碼(1~40)和 GP 編號不一樣,接線時看 GP 編號。
| 你要接的東西 | 用哪些腳 | 說明 |
|---|---|---|
| LED、按鈕 | 任何 GP 腳 | 數位輸入輸出,3.3V 邏輯 |
| 可變電阻、光敏電阻 | GP26、GP27、GP28 | 只有這三支能讀類比電壓(ADC0~ADC2) |
| 電源 | 3V3(OUT)、VSYS、VBUS、GND | 下面說明 |
幾個 Pico 特有的細節(來自官方資料表):
- 板上 LED 在 Pico 接到 GP25;在 Pico W 接到無線晶片,不是 RP2040 的腳位。所以 MicroPython 用名稱
Pin("LED"),兩種板子都通用。 - GP29 在板子內部用來量 VSYS 電壓(先除以 3),不能拿來接感測器;第 15 課會用它監測電池。
- ADC 腳位的輸入電壓不能超過 3.3V 再加約 0.3V,所以可變電阻要接 3V3,不要接 5V。
- 3V3(OUT) 可以供電給外接模組,官方建議負載低於 300 mA。
和 ESP32 一樣,Pico 的 GPIO 是 3.3V 邏輯。上一課 micro:bit、這一課 Pico、ESP32 軌都用 3.3V;第 14 課的 Arduino UNO 用 5V,混接時要小心。
把 MicroPython 裝到 Pico 上
Pico 出廠時沒有 MicroPython。安裝不需要燒錄器,只要一條可以傳資料的 USB 線(有些線只能充電)。
-
1
下載對應板子的 UF2 檔
到 MicroPython 官網的下載頁,找你手上的板子:Pico、Pico W、Pico 2 各有不同的檔案,選錯會無法開機或沒有 Wi-Fi 功能。 下載的是副檔名
.uf2的韌體檔。 -
2
按住 BOOTSEL,再插上 USB
板子上有一顆白色的 BOOTSEL 按鈕。先按住它,再把 USB 插到電腦,插好後放開。 電腦會出現一個新的隨身碟:Pico 叫 RPI-RP2,Pico 2 叫 RP2350。這是晶片內建的開機程式,不會被你的程式弄壞,所以把板子「玩壞」時也可以用同樣的方法重來。
-
3
把 UF2 檔拖進隨身碟
把
.uf2檔複製到那個隨身碟。複製完成後板子會自動重新開機,隨身碟消失,這代表韌體寫入完成。 之後一般插上 USB(不按 BOOTSEL),電腦看到的是一個序列埠,MicroPython 就在另一端等你。 -
4
連線:Thonny 或 mpremote
初學者常用 Thonny 編輯器:右下角選「MicroPython (Raspberry Pi Pico)」就能連線,按綠色箭頭執行。 習慣用終端機的話,MicroPython 官方的 mpremote 工具可以列出板子、直接執行電腦上的檔案、複製檔案進去。 下面的序號與連接埠名稱每台電腦不同。
-
5
run 與 main.py 的差別
mpremote run 檔案:把程式送到板子的記憶體執行,不會存進板子,拔掉電源就沒了,適合邊改邊試。- 存成板子上的
main.py:開機時自動執行,拔掉 USB 改接電池也會跑,作品完成時才這樣做。
ESP32 軌第 16 課會詳細介紹開機檔案
boot.py與main.py,Pico 的規則相同。
逐步看:板上 LED 閃三次
不用接任何線,先讓板上 LED 閃。上方電路畫面的板子左下角就是板上 LED。
這裡用 toggle():不管現在是亮還是暗,都換成另一種狀態。
逐步看:按鈕控制外接 LED
外接 LED 接 GP15(串 220Ω 到 GND),按鈕一腳接 GP14、一腳接 GND。 程式打開 RP2040 的內建上拉電阻,所以不用另外接電阻(自造者入門第 06 課講過上拉的原理)。 模擬的按鈕在 0.9~2.0 秒之間被按住,看看 LED 什麼時候亮。
Pico 的類比輸入與 PWM
RP2040 的 ADC 是 12 位元,但 MicroPython 統一用 read_u16() 回傳 0~65535(把結果放大到 16 位元的範圍),
這樣同一份程式換到不同晶片也能用。換算成電壓:
電壓 = 讀值 × 3.3 ÷ 65535
例:讀值 32768 → 約 1.65 V(3.3V 的一半)
PWM 也用同樣的 16 位元範圍:duty_u16(0) 是全暗,duty_u16(65535) 是全亮。
讀值和工作週期的範圍剛好相同,所以「讀到多少就輸出多少」只要一行,不用另外換算。
和 ESP32 的差別:ESP32 的 MicroPython 常用 read()(0~4095)與 duty()(0~1023);Pico 用 read_u16() 與 duty_u16()。
另外 Pico 的 PWM 每兩支相鄰腳位共用一個「切片」(例如 GP0 與 GP1),同一個切片的兩支腳頻率必須相同,工作週期可以不同。
逐步看:可變電阻調整 LED 亮度
可變電阻的中間腳接 GP26,兩側接 3V3 與 GND。模擬時旋鈕從約 10% 慢慢轉到 90%,注意 LED 的亮度跟著讀值變化。
小測驗:認識 Pico
Raspberry Pi Pico 板上的 RP2040 是什麼樣的晶片?
為什麼 MicroPython 建議用 Pin("LED") 控制板上 LED,而不寫 Pin(25)?
Pico 上哪一支腳不能用 ADC 讀類比電壓?
小測驗:讀值與換算
read_u16() 讀到 32768,用下面的程式換算,會印出什麼?
raw = 32768
print(round(raw * 3.3 / 65535, 2))
按鈕接 GP14 與 GND,用 Pin(14, Pin.IN, Pin.PULL_UP)。按住按鈕時,下面的程式印出什麼?
level = 0 # 按住時讀到的值
pressed = level == 0
print(1 if pressed else 0)
想讓 LED 亮度約一半,Pico 的 PWM 該怎麼寫?
重點整理
- Pico 是 Raspberry Pi 做的微控制器開發板,晶片 RP2040:雙核心 Cortex-M0+、264 KB SRAM、26 支 GPIO;Pico W 加了無線,Pico 2 換成 RP2350。
- 安裝 MicroPython:按住 BOOTSEL 插 USB,出現隨身碟後把對應板子的
.uf2拖進去。 - 板上 LED 用
Pin("LED");外接零件用 GP 編號,例如Pin(15)是 GP15。 - 類比輸入只有 GP26~GP28,
read_u16()回傳 0~65535,電壓不能超過 3.3V。 - PWM 用
duty_u16(0~65535);相鄰兩支腳共用一個切片,頻率要相同。 - 邊改邊試用
mpremote run,完成的作品存成main.py。
下一課看另一個經典平台 Arduino:它用 C++ 寫,我們會把它和 MicroPython 一行一行對照。