デバイス・ボード

Raspberry Pi Pico

RP2040搭載のマイコンボード。安価で扱いやすい。

概要

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 チップ仕様

項目
CPUARM Cortex-M0+ デュアルコア(最大133MHz)
SRAM264KB(6バンク分割、高速アクセス)
ROM16KB(ブートローダー・USB MSD・暗号ルーチン内蔵)
外部FlashPicoは2MB QSPIフラッシュ(SIP実装)
USBUSB1.1 ホスト/デバイス(Full Speed 12Mbps)
GPIO30本(うち26本をPico基板で引き出し)
ADC4ch(12bit、最大500ksps)+ 温度センサー
SPI2本(最大62.5MHz)
I2C2本(最大3.4Mbit/s)
UART2本
PWM16チャンネル(8スライス)
PIO2ブロック(各4ステートマシン)= 合計8ステートマシン
DMA12チャンネル
割り込み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
LEDGP25(オンボードLED)
重量3g
価格550円前後(税込)

PIO(Programmable I/O)の仕様

PIOはRP2040の独自機能で、8命令のシンプルなステートマシンを8個(2ブロック×4SM)動かせます:

命令説明
JMPジャンプ(条件付き)
WAIT条件待機(GPIO入力・割り込み・IRQ)
INシフトレジスタへのビット入力
OUTシフトレジスタからのビット出力
PUSHシフトレジスタをFIFOに転送
PULLFIFOからシフトレジスタに転送
MOVレジスタ間移動
IRQ割り込み制御
SETGPIO直接制御
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はファームウェア書き込みが特に簡単です:

手順操作
1BOOTSELボタンを押しながらUSBを接続
2PCに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

項目PicoRaspberry Pi
OSなし(ベアメタル / MicroPython)Linux
CPUCortex-M0+ 133MHzCortex-A76 2.4GHz
RAM264KB4〜8GB
起動時間数ms数十秒
リアルタイム性高い低い(Linuxレイテンシ)
Wi-FiPico 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代替として位置づけられます。

関連用語

参考リンク