概要
Raspberry Pi PicoはRaspberry Pi財団が2021年1月に発売したマイコン(MCU)ボードです。財団が自社設計したRP2040チップを搭載し、税込500円前後という低価格で提供されます。Raspberry Pi(Linuxが動くSBC)とは異なり、Picoはリアルタイム制御向けの組み込みマイコンボードです。
RP2040はデュアルコアのARM Cortex-M0+(最大133MHz)・264KB SRAM・USB1.1を内蔵し、外付けQSPI Flashにプログラムを格納します。特徴的なのは**PIO(Programmable I/O)**という独自のステートマシンで、SPI・UART・I2Cなどのプロトコルをソフトウェアで自由に実装できます。
開発言語はC/C++(公式SDK)またはMicroPythonが主流で、Arduinoコアにも対応しています。USBにUF2ファームウェアとしてドラッグ&ドロップで書き込める手軽さも人気の理由です。
歴史・背景
Raspberry Pi財団はもともとSBC(Linuxベース)のみを製造していましたが、2020年ごろから自社製SoC設計に着手。2021年1月に初の自社チップであるRP2040を発表し、同日Raspberry Pi Picoの販売を開始しました。
価格は4ドル(日本では税込550円前後)と設定し、教育市場・電子工作市場で既存のArduino Uno(約3,000円)・STM32 Nucleo(約1,500円)より低コストで選択肢を提供することを目指しました。
2023年にはRP2040の後継RP2350を搭載したRaspberry Pi Pico 2を発表。ARM Cortex-M33デュアルコア・RISC-V(Hazard3)デュアルコアを切り替えられる独自アーキテクチャ・520KB SRAM・最大150MHzで動作し、セキュリティ機能も強化されました。
技術仕様
RP2040 チップ仕様
| 項目 | 値 |
|---|---|
| CPU | ARM Cortex-M0+ デュアルコア(最大133MHz) |
| SRAM | 264KB(6バンク分割、高速アクセス) |
| ROM | 16KB(ブートローダー・USB MSD・暗号ルーチン内蔵) |
| 外部Flash | Picoは2MB QSPIフラッシュ(SIP実装) |
| USB | USB1.1 ホスト/デバイス(Full Speed 12Mbps) |
| GPIO | 30本(うち26本をPico基板で引き出し) |
| ADC | 4ch(12bit、最大500ksps)+ 温度センサー |
| SPI | 2本(最大62.5MHz) |
| I2C | 2本(最大3.4Mbit/s) |
| UART | 2本 |
| PWM | 16チャンネル(8スライス) |
| PIO | 2ブロック(各4ステートマシン)= 合計8ステートマシン |
| DMA | 12チャンネル |
| 割り込み | IRQ 26本 |
| 動作電圧 | 1.8〜5.5V(GPIO I/O電圧は3.3V、PicoはUSB5V→3.3V変換内蔵) |
| 消費電流 | 通常動作 〜15mA、Sleep 〜180µA、Dormant 〜0.8mA |
Raspberry Pi Picoボード仕様
| 項目 | 値 |
|---|---|
| チップ | RP2040 |
| フラッシュ | 2MB W25Q16JVS (QSPIフラッシュ) |
| GPIOピン | 26本(3.3V、最大12mA/ピン) |
| ADCピン | 3本(GP26〜GP28)+ 内部温度センサー |
| 電源入力 | USB Micro-Bまたは VSYS(1.8〜5.5V) |
| 3.3V出力 | 最大300mA(オンボードLDO経由) |
| サイズ | 51mm × 21mm |
| LED | GP25(オンボードLED) |
| 重量 | 3g |
| 価格 | 550円前後(税込) |
PIO(Programmable I/O)の仕様
PIOはRP2040の独自機能で、8命令のシンプルなステートマシンを8個(2ブロック×4SM)動かせます:
| 命令 | 説明 |
|---|---|
| JMP | ジャンプ(条件付き) |
| WAIT | 条件待機(GPIO入力・割り込み・IRQ) |
| IN | シフトレジスタへのビット入力 |
| OUT | シフトレジスタからのビット出力 |
| PUSH | シフトレジスタをFIFOに転送 |
| PULL | FIFOからシフトレジスタに転送 |
| MOV | レジスタ間移動 |
| IRQ | 割り込み制御 |
| SET | GPIO直接制御 |
| NOP | 何もしない |
| 項目 | 値 |
|---|---|
| 実行速度 | CPUクロックから分周(最大133MHz) |
| FIFO深さ | Tx/Rx各4ワード(DMAで連続転送可) |
動作原理
RP2040のデュアルコア動作は対称マルチプロセッシング(SMP)で、両コアが同じアドレス空間を共有します:
// コア1でタスクを起動する例(Pico C SDK)
#include "pico/stdlib.h"
#include "pico/multicore.h"
void core1_entry() {
while (true) {
// コア1の処理(例:通信処理)
uint32_t msg = multicore_fifo_pop_blocking();
process_data(msg);
}
}
int main() {
stdio_init_all();
// コア1を起動
multicore_launch_core1(core1_entry);
while (true) {
// コア0の処理(例:センサー読み取り)
uint32_t data = read_sensor();
multicore_fifo_push_blocking(data);
sleep_ms(100);
}
}
PIOを使ったカスタムプロトコル実装の例(WS2812 LEDドライバー):
; WS2812 NeoPixel PIOプログラム(pico-examples より)
.program ws2812
.side_set 1
.wrap_target
bitloop:
out x, 1 side 0 [T3 - 1] ; データビットを取り出し、LOW期間
jmp !x do_zero side 1 [T1 - 1] ; HIGHへ。0なら do_zero へ
do_one:
jmp bitloop side 1 [T2 - 1] ; 1: HIGH期間を延長
do_zero:
nop side 0 [T2 - 1] ; 0: LOW期間に戻る
.wrap
MicroPythonでの使用例:
# MicroPython で Pico W に接続(Wi-Fi付きモデル)
import network
import time
from machine import Pin, ADC
# LED制御
led = Pin(25, Pin.OUT)
# ADC(温度センサー)読み取り
sensor = ADC(4) # 内蔵温度センサー
def read_temperature():
raw = sensor.read_u16()
voltage = raw * 3.3 / 65535
temperature = 27 - (voltage - 0.706) / 0.001721
return temperature
while True:
led.toggle()
temp = read_temperature()
print(f"Temp: {temp:.1f}°C")
time.sleep(1)
用途・ユースケース
Raspberry Pi Picoが選ばれる場面:
- 電子工作・教育: MicroPythonで手軽にLED・センサー・モーター制御を学ぶ
- USB HID デバイス: キーボード・マウス・ゲームコントローラーをエミュレート(USB1.1 FS)
- カスタムプロトコル通信: PIOでWS2812・DMX512・独自シリアルを実装
- シンセサイザー・音楽: PWMとDMAで音声波形生成
- マルチコア並列処理: センサー読み取りと通信処理を別コアで同時実行
- USB-UART変換器: デバッグ用のUSBシリアル変換として使用
- ロボティクス: サーボ制御(PWM)とエンコーダー読み取り(PIO)
実装・開発のポイント
ファームウェア書き込みの手軽さ
Picoはファームウェア書き込みが特に簡単です:
| 手順 | 操作 |
|---|---|
| 1 | BOOTSELボタンを押しながらUSBを接続 |
| 2 | PCにUSBマスストレージデバイスとして認識される(RPI-RP2) |
| 3 | .uf2ファイルをドラッグ&ドロップ |
| 4 | 自動的に再起動して新しいファームウェアで動作開始 |
# Pico C SDKのビルド例
mkdir build && cd build
cmake .. -DPICO_BOARD=pico
make -j4
# build/hello_world.uf2 がPicoに書き込むファイル
Pico W(Wi-Fi版)
Raspberry Pi Pico WはCYW43439チップ(Infineon)によるWi-Fi 4(802.11n)とBluetooth 5.2を追加したモデルです:
# Pico WでWi-Fi接続する例
import network
import socket
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('SSID', 'PASSWORD')
while not wlan.isconnected():
pass
print('Connected:', wlan.ifconfig())
# シンプルなHTTPリクエスト
addr = socket.getaddrinfo('example.com', 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n')
response = s.recv(1024)
print(response)
s.close()
低消費電力化
// Dormantモード(最小消費電力 〜0.8mA)
// GPIOの変化でウェイクアップ
#include "pico/sleep.h"
#include "hardware/gpio.h"
// GPIO16の立ち上がりエッジでウェイクアップ
sleep_goto_dormant_until_edge_high(16);
他技術との比較
Raspberry Pi Pico vs Raspberry Pi
| 項目 | Pico | Raspberry Pi |
|---|---|---|
| OS | なし(ベアメタル / MicroPython) | Linux |
| CPU | Cortex-M0+ 133MHz | Cortex-A76 2.4GHz |
| RAM | 264KB | 4〜8GB |
| 起動時間 | 数ms | 数十秒 |
| リアルタイム性 | 高い | 低い(Linuxレイテンシ) |
| Wi-Fi | Pico Wのみ(要別売) | 内蔵(標準) |
| 価格 | 550円 | 5,000〜14,000円 |
Pico vs Arduino Uno
Arduino UnoはATmega328P(8MHz〜16MHz・2KB SRAM・32KB Flash)を搭載し、Picoと比べて処理能力・メモリ量が大幅に劣ります。ただしArduinoのシールドエコシステムや豊富なライブラリを活用したい場面ではArduino Unoが適します。Picoはより高性能でコスパに優れたArduino代替として位置づけられます。