Raspberry Pi PicoのMicroPythonをClaude Codeで書く
Claude CodeでRaspberry Pi Pico向けMicroPythonを書き、mpremote経由でREPLとGPIOを操作する手順をまとめます。
Raspberry Pi PicoはUSB接続だけでMicroPythonが動く安価なマイコンボードです。Claude CodeはPico本体を直接操作しません。ローカルのターミナルで動き、mpremoteという公式CLIをBashツール経由で呼び出すことでPicoと通信します。この記事では、ファームウェアの書き込みからGPIO制御スクリプトの生成、mpremoteでの書き込みと動作確認までの一連の流れを、MicroPython公式ドキュメントの記載に沿って進めます。実際に手元のボードで動かしながら読み進められる形でまとめました。
Raspberry Pi PicoのMicroPython開発でClaude Codeは何をするか
Claude Codeの役割は3つに絞られます。Pythonスクリプトの生成と編集、mpremoteコマンドの実行、そして実行結果の確認です。ハードウェアを直接見ているわけではありません。
mpremoteとは、USBシリアル経由でMicroPythonデバイスのファイル操作・REPL接続・スクリプト実行をひとまとめにする公式CLIツールです。Claude CodeのBashツールはこのコマンドを呼び出すだけで、シリアル通信そのものはmpremoteが担います。つまり開発の流れは「Claude Codeがコードを書く→Bashツールでmpremoteを実行する→出力を読んで次の指示を出す」というループになります。人がREPLに向き合ってタイプする作業を、CLI越しのコマンド実行に置き換える構成です。
開発環境を準備する
書き込み前に、ファームウェアとmpremoteの2つを用意します。手順は次の順番で進めます。
- PicoのBOOTSELボタンを押しながらUSBケーブルでパソコンに接続する(データ通信対応のケーブルが必要です)
- USBマスストレージとして認識されたドライブに、MicroPythonの
.uf2ファームウェアファイルをコピーする - 書き込みが終わると自動的に再起動し、Picoが1台のシリアルデバイスとして見えるようになる
ファームウェアはmicropython.orgのダウンロードページから取得します。REPL上ですでにMicroPythonが動いている場合は、machine.bootloader()を実行してもブートローダーモードに入れます。
対象のボードによって載っているマイコンが異なる点も押さえておきます。無印のPicoはRP2040(133MHz、デュアルコアArm Cortex-M0+、264KB SRAM)を積んでいます。Pico 2はRP2350(最大150MHz、デュアルコアArm Cortex-M33またはHazard3のRISC-V、520KB SRAM)です。どちらもMicroPythonのrp2ポートが対応していますが、.uf2ファイルはボードごとに別配布です。手元のボードに合わないファームウェアを書き込むと起動しないため、ダウンロード時にボード名を確認します。
続いてmpremoteをインストールします。Claude Codeのターミナルセッションでそのまま実行できます。
pip install --user mpremoteインストール後は、接続されているデバイス一覧を確認しておくと以降のコマンドが迷いません。
mpremote connect listClaude CodeにGPIO制御スクリプトを書かせる
GPIO操作はMicroPythonのmachine.Pinクラスで行います。出力ピンならon()・off()・value()、入力ピンならvalue()で状態を読み取る、というのが基本の型です。Claude Codeに「GP0へLEDを繋いで1秒間隔で点滅させ、GP2のボタン入力もついでに読む」と指示すると、次のようなスクリプトを生成します。
from machine import Pin
import time
led = Pin(0, Pin.OUT)
button = Pin(2, Pin.IN, Pin.PULL_UP)
while True:
led.value(not led.value())
print("button:", button.value())
time.sleep(1)Pin(0, Pin.OUT)でGP0を出力に、Pin(2, Pin.IN, Pin.PULL_UP)でGP2を内部プルアップ付きの入力に設定しています。この2行はMicroPython公式のRP2クイックリファレンスに載っている基本形そのものです。
明るさやモーターの回転数のように段階的な出力が欲しい場合は、machine.PWMクラスに切り替える指示に変えます。RP2040には8個のPWMスライスがあり、1つのGPIOピンにつき周波数とデューティ比を指定するだけで済みます。
from machine import Pin, PWM
pwm0 = PWM(Pin(0), freq=2000, duty_u16=32768)
pwm0.freq(1000) # 周波数を変更
pwm0.duty_u16(200) # デューティ比を0〜65535の範囲で変更PinからPWM、あるいはADCへ切り替えても、from machine import ...のインポート元は変わりません。Claude Codeに追加のセンサー処理を頼むときも、同じmachineモジュールの中に該当クラスがあるため、生成されるコードの構造は大きく変わらず読みやすさが保たれます。
mpremoteでPicoに書き込み、動作を確認する
書いたスクリプトをPicoで動かす方法は、用途によって使い分けます。動作確認だけなら、ファイルをデバイスに保存せずRAM上で直接実行できます。
mpremote run blink.pyrunはローカルファイルの中身をそのままデバイスへ送って実行するコマンドで、デバイスのファイルシステムには一切コピーされません。電源を切れば消える一時実行です。電源投入のたびに自動実行させたい場合は、main.pyとしてコピーします。
mpremote cp blink.py :main.py:で始まるパスがデバイス側を表す書き方は、scpのコロン記法にならったものです。ファイルの中身を確認したいときはmpremote fs cat :main.py、ディレクトリ一覧はmpremote fs lsで見られます。いずれも標準出力にテキストを返すだけなので、Claude CodeのBashツールが結果をそのまま読み取れます。
一方、対話的なmpremote replはターミナルをPicoのREPLへそのまま繋ぐコマンドで、人がその場でCtrl-Cやペーストモードを使いながら触る用途に向いています。Claude Codeは対話セッションを維持できないため、自動化ループの中ではrun・eval・execのような一回で完結するコマンドを軸にするのが実用的です。
ファイルコピーのたびに待たず反復する
編集のたびにcpで書き込み直すのは、修正回数が増えると手間になります。mpremote mountを使うと、ローカルのディレクトリをPicoの/remoteとしてそのままマウントでき、コピーを挟まずにインポートや実行ができます。
mpremote mount . exec "import blink"カレントディレクトリをマウントしたうえで、Pico側からblink.pyをimport blinkとして直接読み込んで実行しています。ファイルの中身を書き換えたら、Pico側でCtrl-Dによるソフトリセットを挟めば、次のimportで最新のコードが反映されます。Claude Codeからは、このコマンドをBashツールで1回実行するだけで「編集→即実行」のループが作れます。mountの後に他のコマンドを続けなかった場合は、自動的に対話REPLへ入る点も覚えておくと、意図せずコマンドが返ってこない状況に戸惑わずに済みます。
mpremoteコマンドの使い分け早見表
| 操作 | コマンド | 適した場面 |
|---|---|---|
| 一時実行 | コマンドmpremote run <file> | 適した場面保存前にコードの動作だけ素早く確かめたいとき |
| 永続化 | コマンドmpremote cp <file> :main.py | 適した場面電源投入時に自動実行させたいとき |
| 状態確認 | コマンドmpremote fs ls / fs cat | 適した場面デバイス上のファイルをClaude Codeに読ませたいとき |
| 反復実行 | コマンドmpremote mount . | 適した場面編集のたびにコピーせず何度も試したいとき |
| 対話REPL | コマンドmpremote repl | 適した場面人がセンサー値などをその場で触って確認したいとき |
よくあるつまずき
- デバイスが見つからない:
mpremoteはシリアルポートを排他モードで開きます。ThonnyやArduino IDEのシリアルモニタを同時に起動していると、mpremote側から見えなくなるため、他のツールを先に閉じてから接続し直します - 承認プロンプトで毎回止まる:
Bash(mpremote:*)のような許可ルールを設定していないと、コマンドを打つたびに確認が挟まります。頻繁に呼び出すコマンドだけを先に許可リストへ入れておくと、実行のたびに手が止まらずに済みます。ツールの許可範囲を絞りたい場合はallowedTools/disallowedToolsでの制御も選択肢になります - サンドボックス環境で挙動が変わることがある:
sandbox.enabledを有効にしている場合、書き込み範囲が作業ディレクトリと一時ディレクトリに絞られます。シリアルポートまわりの扱いは環境によって差が出るため、mpremoteが動かないときは切り分けの候補に入れておくと迷いません。詳細はsandbox.enabledの挙動にまとめています - 書いたはずのコードが再起動で消える:
mpremote runはRAM上で直接実行するだけで、デバイスのファイルシステムには保存されません。残したいコードはmain.pyへ明示的にコピーします - BOOTSELモードに入れない: 充電専用のUSBケーブルではデータ通信ができず、ドライブとして認識されません
まとめ
Claude CodeはPicoのハードウェアを直接見ることはできません。それでもmpremoteという公式CLIを介せば、コード生成からデバイスへの書き込み・動作確認までを1つのターミナルセッションで完結できます。runで素早く試し、mountでコピーなしに反復し、cpでmain.pyとして定着させ、fs系コマンドでデバイス側の状態をClaude Codeに読ませる。この4つの使い分けを覚えておけば、GPIO制御スクリプトの開発サイクルは十分に回ります。
対話が必要な場面だけ人がREPLに入り、それ以外の反復作業はClaude Codeに任せるという分担にすると、マイコン開発特有の「書いて→焼いて→確かめる」のループが短くなります。Claude Code自体の権限設計や拡張機構を広く知りたい場合はClaude Code完全ガイドも参考にしてください。