Claude CodeでRaspberry PiのGPIOを制御する — LED点灯とボタン入力
Claude Codeとgpiozeroライブラリを使い、Raspberry PiのGPIOでLEDとボタンを制御するスクリプトの書き方と配線時の注意点をまとめます。
Claude CodeでRaspberry PiのGPIOを制御するとは
Claude CodeはRaspberry Pi上でもそのまま動くCLIです。ハードウェア要件はx64またはARM64プロセッサーと4GB以上のRAMで、対応OSにはDebian 10+とUbuntu 20.04+が含まれます。Raspberry Pi OSはDebianをベースにしているため、64bit版のRaspberry Pi OSを使っていれば要件を満たします。
この記事では、Raspberry Pi公式が推奨するPythonライブラリ「GPIO Zero」を使います。Claude CodeにLED点灯・ボタン入力・両者を組み合わせたスクリプトを書かせる手順を、配線時の注意点とあわせてまとめます。
前提条件
Claude Codeのハードウェア要件(4GB以上のRAM・ARM64プロセッサー)を満たすのは、4GB以上のRAMを搭載したRaspberry Pi 4 Model BまたはRaspberry Pi 5です。いずれも64bit対応のARMプロセッサーを積んでおり、64bit版Raspberry Pi OSと組み合わせれば要件を満たします。32bit版のRaspberry Pi OS(armhf)はARM64ではないため、Claude Codeの対象外です。
GPIO制御に使うライブラリはGPIO Zeroです。Raspberry Pi OSのデスクトップイメージには標準でインストール済みです。Lite版など他のOSを使う場合は、sudo apt install python3-gpiozeroまたは仮想環境内でpip install gpiozeroを実行します。
手順1: Claude CodeをRaspberry Piにインストールする
Raspberry Pi OSはDebianベースのLinuxなので、公式のネイティブインストーラーが使えます。
curl -fsSL https://claude.ai/install.sh | bashネイティブインストールはバックグラウンドで自動更新される点が特徴です。apt・dnf・apkによるLinuxパッケージマネージャー経由のインストールも選べます。ただしその場合は自動更新されないため、claude updateまたは各パッケージマネージャーのアップグレードコマンドで手動更新します。インストール方法ごとの違いやnpm経由のインストール手順はClaude Code install完全ガイドにまとめています。
インストール後、GPIO制御スクリプトを置くディレクトリでターミナルを開いてclaudeを起動します。
claude手順2: LEDを点灯させるスクリプトを書かせる
まずは動作確認を兼ねて、GPIO17に接続したLEDを1秒間隔で点滅させるスクリプトをClaude Codeに書かせます。「GPIO Zeroを使ってGPIO17のLEDを1秒間隔で点滅させるPythonスクリプトを書いて」と指示すると、次のようなコードが返ってきます。
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)LEDオブジェクトにはon()・off()・toggle()・blink()のメソッドがあります。ThonnyのようなIDEと組み合わせなくても、python3 blink.pyとターミナルから直接実行できます。
手順3: ボタンの状態を読み取るスクリプトを書かせる
次はGPIO2に接続したボタンの状態を読み取るスクリプトです。「GPIO2のボタンが押されたかどうかを1秒ごとに表示するスクリプトを書いて」と指示すると、次のようなコードになります。
from gpiozero import Button
from time import sleep
button = Button(2)
while True:
if button.is_pressed:
print("Pressed")
else:
print("Released")
sleep(1)Buttonオブジェクトはis_pressed・is_heldのプロパティを持ちます。加えてwhen_pressed・when_released・when_heldのコールバックや、wait_for_press()・wait_for_release()のメソッドも使えます。ポーリングでなくイベント駆動で書きたい場合は、この次の手順のようにコールバックを使う形に書き換えられます。
手順4: ボタンでLEDを制御する
LEDとボタンを組み合わせ、ボタンが押されている間だけLEDを点灯させるスクリプトです。「GPIO2のボタンを押している間だけGPIO17のLEDを光らせるスクリプトを、コールバックを使って書いて」と指示すると、次のような実装になります。
from gpiozero import LED, Button
led = LED(17)
button = Button(2)
button.when_pressed = led.on
button.when_released = led.offポーリングループを自分で書かずに、ボタンの状態変化をコールバックとしてLEDのメソッドへ直接割り当てるだけで動きます。イベント駆動の書き方はwait_for_press()を使う同期的な待ち方よりコードが短くなり、他のセンサーを同時に扱う構成にも拡張しやすくなります。
配線と電圧で気をつけること
Raspberry PiのGPIOピンは、出力に設定すると3.3Vまたは0Vになり、入力に設定すると同じく3.3Vまたは0Vとして読み取られます。5Vピンと3.3Vピンはそれぞれ2本ずつ用意されていますが、5V部品を3.3V専用のGPIOピンに直接つなぐと破損の原因になります。モーターのような大電流の部品もGPIOピンに直結せず、Hブリッジ回路やモータードライバーを経由させる必要があります。LEDには電流を制限する抵抗を必ず挟みます。
GPIOポートを使うには、ユーザーがgpioグループに所属している必要があります。デフォルトユーザーは最初から所属していますが、別ユーザーで作業する場合は次のコマンドを実行します。
sudo usermod -a -G gpio <username>このコマンドを実行した後は、変更を反映させるために一度ログアウトしてログインし直す必要があります。Claude Codeにこの種の管理系コマンドを実行させる場合、sudoを含むコマンドは既定の権限モードでは確認プロンプトが挟まります。複合コマンドの権限判定の仕組みはClaude CodeのBash権限ルールは複合コマンドをどう評価するかで扱っています。
GPIOピンの番号付けは物理的な並び順になっていません。たとえばGPIO0とGPIO1は基板上に存在し物理ピン27・28に対応しますが、これらは上級者向けの用途に予約されています。gpiozeroのコード例で使う「GPIO17」のような番号は、40ピンヘッダーの位置とは別の論理的な番号なので、配線時はピン配置図で物理位置を確認しながら進めます。ターミナルでpinoutコマンドを実行すると、GPIO Zeroが提供するピン配置の参考図を表示できます。
公式ドキュメントの電気的仕様によると、出力電流の上限は搭載チップの世代で異なります。BCM2835・BCM2836・BCM2837やRP3A0を積む旧世代モデル(Raspberry Pi Zeroや3+など)は、既定のドライブ強度が8mAです。出力Low電流の上限は18mA、出力High電流の上限は17mAです。BCM2711を積む4シリーズでは既定のドライブ強度が4mAに下がり、出力電流の上限も7mA前後に下がります。プルアップ・プルダウン抵抗の値も旧世代の50〜65kΩ台から、4シリーズでは33〜73kΩ台に変わります。同じセンサーやモジュールでも世代をまたいで動作が変わることがあるため、電流に余裕のない自作回路を複数モデルで使い回す場合はこの差を踏まえておきます。
LEDの点灯やボタンの読み取り以外にも、GPIOピンにはPWM・SPI・I2Cといった代替機能が割り当てられています。GPIO12・GPIO13・GPIO18・GPIO19はハードウェアPWMに対応しており、gpiozeroのPWMLEDと組み合わせればLEDの明るさ調整やサーボモーターの角度制御に使えます。GPIO2(データ)とGPIO3(クロック)はI2Cバス、GPIO9・GPIO10・GPIO11・GPIO8・GPIO7はSPI0バスに割り当てられています。温湿度センサーやディスプレイのような複雑なモジュールを追加する際はこれらのピンを使う設計にすると、ソフトウェア制御より高速かつ安定した通信になります。
対話セッションと-pモードの使い分け
配線やコードを試行錯誤しているあいだは対話セッションのままで十分ですが、GPIO制御スクリプトをRaspberry Pi上で常時稼働させる自動化まで進めると、用途によって向くモードが変わってきます。
| 用途 | 向いているモード | 理由 |
|---|---|---|
| 配線とコードを試行錯誤しながら書く | 向いているモード対話セッション | 理由実行結果をその場で確認しながら反復修正できる |
| センサー値を定期チェックして通知する | 向いているモード-p + cron | 理由人が張り付かなくても定期実行できる |
| GPIO制御スクリプトの変更を無人でテストする | 向いているモード-p --permission-mode dontAsk + --allowedTools | 理由許可していないコマンドは自動拒否され、想定外の実行を避けられる |
-pモードでcronから定期実行する場合の例です。
claude -p "gpio_check.pyを実行してセンサー値をログに追記して" \
--allowedTools "Bash(python3 gpio_check.py)"-pセッションは既定の権限モードが常にManualになるため、--allowedToolsか--permission-modeを明示しないと確認待ちで止まります。-pモードのフラグや終了コードの扱いはClaude Code -pモードでスクリプトやパイプラインを自動化する基本にまとめています。確認プロンプトを減らす--permission-mode自体の値と優先順位はClaude Codeの--permission-modeで起動モードを指定するで扱っています。
よくあるつまずき
32bit版OSでインストールが失敗する: Claude Codeの対応プロセッサーはx64とARM64のみです。32bit版のRaspberry Pi OSではARM64の要件を満たさないため、64bit版のRaspberry Pi OSに入れ直します。
gpioグループに入れておらず権限エラーになる: sudo usermod -a -G gpio <username>を実行した直後はまだ反映されていません。一度ログアウトしてから入り直すか、newgrp gpioで現在のシェルにグループを反映させます。
5V部品を3.3V用のピンにつないで壊れる: 汎用GPIOピンはすべて3.3V仕様です。5V駆動のセンサーやモジュールを使う場合は、レベル変換モジュールを挟むか、5V専用ピンから電源だけを取り信号線は別経路にするなど回路側で対応します。
ピン番号を物理位置と取り違える: gpiozeroのコード例に出てくる番号は論理的なGPIO番号で、40ピンヘッダー上の物理的な並び順とは一致しません。配線前にpinoutコマンドやピン配置図で位置を確認します。
まとめ
Claude CodeはRaspberry Pi 4・5の64bit環境でそのまま動き、GPIO Zeroライブラリと組み合わせればLED点灯やボタン入力のスクリプトを対話的に書きながら試せます。配線では3.3V仕様と電流制限、gpioグループへの所属を確認し、常時稼働させる段階になったら-pモードとcronの組み合わせに切り替えると、人が張り付かない運用に移行できます。