David Lin

David Lin

一個軟體工程師的隨意筆記

23 May 2021

Hello, Raspberry Pi Pico

前言

今年 Raspberry Pi 推出一個比 Pi Zero 還要小的 MCU Board,定名為 Raspberry Pi Pico, 搭載著自家設計的 RP2040 SoC。因為我很喜歡吃 Raspberry(才不是),就很好奇買了一個來玩看看。

外觀

把 Pico 與 Arduino Nano 放在一起比較看看外觀,看起來 Pico 整整比 Nano 大了一截(可是 Pico 不是 Nano 的千分之一倍嗎…)

Pico and Nano

在麵包板上,Pico 可以很漂亮地放上去,兩旁孔洞數量完美平衡。 而 Nano 卻硬是一邊會比另一邊多一截,對於強迫症來說超不友善的。

Pico and Nano on Breadboard

硬體規格

然後看一下這個東西的規格吧!

PropertyValue
SoCRaspberry Pi RP2040
CPUDual-core Arm Cortex-M0+ @ 133MHz
RAM264KB on chip SRAM
Flash2MB on board Q-SPI
UART2x
SPI2x
I2C2x
PWM16x
Programmable IO8x
ADC4x 12-bit, 0.5 MSa/s
USB1.1 Host/Device

從上面的規格來看,可以知道它是一個 ARM Cortex-M0+ 架構的 microcontroller, 記憶體僅有 264KB,但可以隨時從 2MB Flash 拿取資料,這一點與 Arduino Nano 類似。而且它也有專門的 SPI, I2C 的控制器,可以連接到專門的接腳上使用。

根據維基百科, ARM Cortex-M0+ 的主要特色:

  • ARMv6-M architecture
  • 2-stage pipeline (one fewer than Cortex-M0)
  • Instruction sets: (same as Cortex-M0)
    • Thumb-1 (most), missing CBZ, CBNZ, IT
    • Thumb-2 (some), only BL, DMB, DSB, ISB, MRS, MSR
  • 32-bit hardware integer multiply with 32-bit result
  • 1 to 32 interrupts, plus NMI

可以知道它是一個比較精簡的 ARM 32-bit 架構,使用 Thumb-1 大部分指令與 Thumb-2 少部分指令。 Thumb 指令集本來是 ARM 設計給嵌入式裝置使用的精簡版指令, 意在減少記憶體佔用量,這對於記憶體要斤斤計較的裝置來說還蠻重要的。 從這個資料來看,RP2040 就真的是定位在嵌入式裝置上了。

最讓我感興趣的是它有 Programmable IO (簡稱 PIO),它有兩個用途:

  1. 增加 I2C or SPI IO bus (需要超過兩個 bus 的情況)
  2. 自訂特殊的 IO bus

聽起來 PIO 的功能蠻強大的,我找個時間去研究看看好了。 XD

Hello World!

看完外觀之後,開始進行一個重要的儀式… Hello World! Pico 的官網上說可以使用 C++ SDK 或是 MicroPython,在這裡我直接從 MicroPython 開始。

裝完 MicroPython 的 firmware 之後,從電腦打指令連到 Pico:

minicom -o -D /dev/tty.usbmodem0000000000001

上面的 /dev/tty.usbmodem0000000000001 是 Pico 在 Mac 上的介面, 以 serial port 形式存在,所以可以使用任何 serial terminal 程式去跟它溝通(minicom, picocom, CoolTerm 之類)。

如果換到 Linux 平台上,出現的裝置名稱會不同,可能會是 /dev/ttyACM0 之類的名稱,需要自己去確認。

連上 Pico 之後,按下 Ctrl-D 進行重設 Pico ,就可以看到此畫面, 代表已經進入 MicroPython REPL 介面了:

Minicom Screenshot 1

然後打上標準的 Hello World 程式:

print("Hello World")

它就會乖乖在 Terminal 上印出結果:

Minicom Screenshot 2

還不夠,我還要讓它上面的 LED 閃!!!

from machine import Pin, lightsleep as sleep

led = Pin(25, Pin.OUT)

while True:
    led.toggle()
    sleep(1000)

結果如下:

用 rshell 上傳程式碼

如果原本寫很長的 Python 程式,還要用打字一點一點上傳到 REPL 才能給 Pico 跑程式, 而且當把 Pico 重新啟動之後,就會把之前打進去的程式清除掉了。

如果要讓 Python 程式『燒錄』到 Pico 內, 可以用 rshell 把 Python 檔案存到 Pico 內。

rshell

rshell 啟動之後,進入 host 的 shell 畫面(注意,這不是 Pico 的):

Rshell Screenshot 1

然後打上指令,把程式上傳到 Pico 去:

cp blink.py /pyboard/main.py

很簡單對吧?這樣每次啟動 Pico 就會自動執行寫好的程式了。 如果想要重新進入 REPL ,可以用 rshell 進入 Pico 並把 /pyboard/main.py 檔案刪除就好了。

使用 Thonny IDE

也可以直接用 Thonny IDE 去上傳 Python 程式到 Pico 上。

Thonny IDE 1

這個 IDE 真的超陽春,感覺上這是給小孩子用的 XD。 剛安裝完 Thonny IDE 之後還需要進入 Preferences 去設定 Interpreter 成 MicroPython (Raspberry Pi Pico),並且把 Port 改成 Pico 所在的 serial port。

把程式碼貼上到 editor 上,按下 Run 按鈕,就可以馬上看到結果了。

總結

Raspberry Pi Pico 感覺上還蠻重視教育領域的,在推出 Pico 就有準備好相應的工具與使用說明, 上手起來不會太困難,甚至有點太簡單了。

References

comments powered by Disqus