Claude Media
Claude CodeでArduinoを制御する — スケッチ作成からシリアル通信まで

Claude CodeでArduinoを制御する — スケッチ作成からシリアル通信まで

Claude CodeはArduino専用機能を持たず、arduino-cliをBashツールから呼ぶ構成です。スケッチ作成・コンパイル・アップロード・シリアル通信の実装手順を扱います。

Claude CodeにArduino専用の機能はありません。使うのは「ファイル編集」と「コマンド実行」という2つの一般的な能力だけです。実体はArduinoの公式CLIツールであるarduino-cliをBashツールから呼び出す構成で、スケッチの作成からコンパイル、ボードへの書き込み、シリアル通信の確認までを一通りこなせます。特別な連携機能の追加を待つ必要はありません。

Arduino開発に必要な前提環境

Claude Code側で必要なのはターミナルからclaudeコマンドを実行できる環境です。CLI・IDE統合・デスクトップアプリのいずれでも、ローカルのシェルコマンドを実行できる形であれば同じ手順が動きます。Claude Codeの組み込みツールは「ファイル操作」「検索」「実行」「Web」「コードインテリジェンス」の5カテゴリです。実行カテゴリにはシェルコマンド・サーバー起動・テスト・gitの利用が含まれ、Arduino開発で使うのは主にファイル操作と実行の2つです。

Arduino側で必要なのは、USBケーブルで接続したArduinoボードと、コンパイル・書き込みを担うarduino-cliです。Arduino IDEのGUIは不要で、Claude Codeが呼び出すのはコマンドラインツールのarduino-cliだけです。リモート環境やCI上でこのワークフローを動かしたい場合の構成は、Claude apps gatewayをCIやリモート開発機から使う記事が参考になります。

Claude Codeはターミナル・IDE統合・デスクトップアプリ・ブラウザの各形態で使えます。ただしuploadmonitorは、ボードが物理的に接続されたUSBポートへの直接アクセスが要ります。ブラウザ経由のリモート実行環境では、コンパイルまでは進んでも書き込みと通信確認の段階でポートが見えず失敗します。この2コマンドは、ボードを挿したマシン自身でBashツールが動く構成に限定して実行するのが安全です。

arduino-cliをセットアップする

arduino-cliはHomebrew経由か、公式のインストールスクリプトで導入します。

brew update
brew install arduino-cli

Homebrewを使わない場合は、公式スクリプトを$PWD/binに展開できます。

curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh

インストールスクリプトはバージョンを指定してピン留めできます。sh -s 0.9.0のようにバージョン番号を渡せば、CIやチーム内で同じarduino-cliのバージョンを再現できます。指定を省くと最新の安定版が入り、nightly-latestを指定すると毎日ビルドされる開発版が入ります。

arduino-cliは設定ファイルが無くても全機能を使えますが、arduino-cli config initで作成しておくと、以降のコマンドで同じフラグを毎回書かずに済みます。設定ファイルにはボードマネージャーの追加URLなど、サードパーティ製ボードを使う際の項目もまとめられます。

導入後はコアのインデックス更新と、接続したボードの認識確認をClaude CodeにBashツールで実行させます。

arduino-cli core update-index
arduino-cli board list

board listはポート名・ボード名・FQBN(Fully Qualified Board Name)を返します。Arduino Unoを接続した場合、ポートは/dev/ttyACM0のような表記、FQBNはarduino:avr:unoのような形式です。表示されたFQBNのプラットフォームコア(arduino:avrarduino:samdなど)が未インストールなら、arduino-cli core install <プラットフォーム名>で導入します。このFQBNとポートは、後段のコンパイル・書き込み・シリアル通信のすべてのコマンドで共通して使います。

Claude Codeにスケッチを書かせる

Arduinoのプログラムは「スケッチ」と呼ばれ、実体はフォルダです。フォルダ名と同名の.inoファイルを必ず1つ含む必要があり、フォルダ名・ファイル名は英数字とアンダースコアで始まり、最大63文字までという制約があります。.inoのほかに.cpp.c.h.Sといった補助ファイルも同じフォルダに置けます。

スケッチの雛形はarduino-cli sketch newで作成できます。

arduino-cli sketch new BlinkAndReport

これでBlinkAndReport/BlinkAndReport.inoが生成され、中身はsetup()loop()だけの空の骨格です。ここから先はClaude Codeの通常のファイル編集で進められます。LEDの点滅にシリアル出力を組み合わせたコードを書かせる場合、次のような指示が具体的です。

BlinkAndReport.inoを編集してください。setup()Serial.begin(9600)pinMode(LED_BUILTIN, OUTPUT)を呼びます。loop()ではLEDを1秒間隔で点滅させながら、Serial.println()で点滅回数をシリアルに出力してください。

arduino-cli自体はテキストエディタではありません。.inoファイルの読み書きはClaude CodeのEdit・Writeツールが担い、arduino-cliはコンパイルと書き込みだけを担当する分担です。ライブラリが必要な場合はarduino-cli lib search <キーワード>で検索し、arduino-cli lib install <ライブラリ名>で追加できます。

スケッチ内で外部ライブラリを1つにまとめて配布したい場合は、フォルダ内のsrcサブフォルダにコードを置く方法もあります。src配下は再帰的にコンパイルされますが、IDEのタブには表示されないため、利用者に見せたくない実装を同梱するのに向きます。Claude Codeにライブラリのバンドルを頼む際は、このsrcフォルダの用途を指示に含めると意図通りの構成になりやすくなります。

コンパイルとアップロードの許可をどう設計するか

コンパイルはcompile、書き込みはuploadで、どちらもFQBNの指定が必須です。

arduino-cli compile --fqbn arduino:avr:uno BlinkAndReport
arduino-cli upload -p /dev/ttyACM0 --fqbn arduino:avr:uno BlinkAndReport

compileの出力にはプログラム使用量(バイト数と最大サイズに対する割合)が表示されるため、メモリの小さいボードで容量オーバーを起こしていないかをその場で確認できます。uploadは書き込み対象のポートを-pで明示する必要があり、board listで確認したポート名をそのまま使います。

このワークフローではcompileuploadを何度も繰り返すため、Claude Codeが毎回のコマンド実行で許可を求めてくると開発のテンポが落ちます。.claude/settings.jsonpermissions.allowに、コマンドの先頭部分を対象にしたルールを登録しておくと、同じパターンのコマンドは確認なしで実行できます。

{
  "permissions": {
    "allow": [
      "Bash(arduino-cli compile *)",
      "Bash(arduino-cli upload *)"
    ]
  }
}

どこまで自動化するかは、開発の段階によって変えるのが現実的です。

運用方法向いている場面留意点
毎回手動で承認する向いている場面初めてボードに書き込む・配線を変えた直後留意点都度確認が入るぶん安全、連続実行には向かない
permissions.allowに事前登録する向いている場面同じcompile/uploadコマンドを繰り返す開発ループ留意点コマンドの先頭パターンを許可、想定外の引数までは弾けない
auto modeに任せる向いている場面定型的な検証を高速に繰り返す場面留意点分類器が判定できない場合は拒否側に倒れる

auto modeの分類器がコマンドを拒否した場合の制御は、PermissionDenied hookの記事にまとまっています。拒否のログ化とモデルへの再試行許可を、フックで細かく扱えます。対話セッションではなく、書き込みまで任せる自律エージェントを組みたい場合は選択肢が変わります。Agent SDKのパーミッション制御なら、モードとallow/denyルールを個別に設計できます。

シリアル通信でボードとの応答を確認する

書き込んだスケッチがSerial.println()で出力している内容を確認するには、arduino-cliのmonitorコマンドを使います。

arduino-cli monitor -p /dev/ttyACM0 -c baudrate=9600

-pでポート、-c(--config)でbaudrate=値のような通信設定を指定します。ボード側のスケッチでSerial.begin()に渡した値と、monitor側のbaudrateが一致していないと文字化けした出力になります。--timestampを付けると各行に受信時刻を付与でき、--fqbn(-b)でボードを明示的に指定することもできます。

monitorコマンドの注意点は、実行するとその場で通信を開いたまま終了しないことです。Ctrl+Cなどで止めるまでプロセスが残り続けるため、Claude CodeのBashツールでそのまま実行するとコマンドが返ってこず、次のステップに進めなくなります。数秒間だけ出力を見て終了させたい場合は、シェルのtimeoutコマンドで実行時間を区切るのが確実です。

timeout 5 arduino-cli monitor -p /dev/ttyACM0 -c baudrate=9600

これで5秒間だけシリアル出力を受け取り、コマンドが正常に終了します。動作確認のたびにmonitorを都度実行し、期待した文字列が出力に含まれているかをClaude Codeに判定させる、という繰り返しがこのワークフローの中心になります。

よくあるつまずき

  • monitorがブロックしたままターンが返らない: timeoutで秒数を区切らずに実行すると、Ctrl+Cで止めるまでコマンドが終了しません。動作確認では必ず秒数を指定します
  • ポートがビジー状態で書き込めない: Arduino IDEやほかのmonitorプロセスが同じポートを開いたままだと、uploadmonitorが失敗します。別プロセスを終了してから再実行します
  • baudrateの不一致で文字化けする: スケッチ内のSerial.begin()の値と、monitor-c baudrate=が違うと出力が読めません。両方を同じ値に揃えます
  • FQBNやポート名が環境ごとに変わる: macOSでは/dev/tty.usbmodem*のような表記になるなど、OSやボードによってポート名の形式が変わります。都度arduino-cli board listで確認するのが確実です
  • 初回のBashコマンド実行で毎回許可を求められる: permissions.allowにコマンドを登録していないと、compileuploadのたびに承認が必要になります。繰り返す段階に入ったら事前登録を検討します

まとめ

Claude CodeでArduinoを制御する仕組みは、特別な統合機能ではありません。ファイル編集とBashツールによるコマンド実行の組み合わせです。arduino-cliのsketch newcompileuploadmonitorが軸になり、スケッチの作成から書き込み、応答確認までを一つのループで回せます。繰り返しの多いコンパイル・書き込みはpermissions.allowで事前に許可しておくと、開発のテンポを保ちやすくなります。ブロッキングするmonitortimeoutで区切るのが実用上のコツです。ポート名やFQBNの表記はボードやOSで変わるため、迷ったときはarduino-cli board listに立ち返って確認します。

この記事を共有:XはてブLinkedIn