ArduinoとClaude APIを連携させてスマートデバイスを作る!シリアル通信×AIで音声応答ガジェットを自作する方法
「Arduinoで電子工作はできるようになってきた。でも、もっとインテリジェントなデバイスを作りたい…」
そんな気持ち、ありませんか?
センサーで値を読んでLEDを光らせる、モーターを動かす——これだけでも十分楽しいんですが、「AIと組み合わせたら何かすごいものが作れそう」という直感、あると思うんです。
今回は、ArduinoとClaude APIを組み合わせて「AIが返答する音声応答スマートデバイス」を自作する方法を解説します。仕組みはシンプルで、Arduinoが取得したセンサーデータや入力をPythonスクリプトに送り、PythonがClaude APIに問い合わせ、その応答をArduinoに返す——というパイプラインです。
✅ 対象読者:Arduino基礎経験あり・Python初〜中級者
✅ 難易度:★★★☆☆(中級者向け)
難しそうに見えますが、ざっくりとした流れをつかめば一気に「作れそう」に変わるはずです。一緒に進めていきましょう!
🔧 今回作るものの全体像

まず完成イメージを整理しておきましょう。
今回作るAIスマートデバイスの構成はこうなっています。
- 🟡 Arduino:ボタン入力を検知 → シリアル通信でPythonにメッセージ送信 → Pythonからの返答をLCDまたはシリアルモニタに表示
- 🐍 Python(PCまたはRaspberry Pi上):ArduinoからのメッセージをClaude APIに転送 → レスポンスをArduinoに返す
- 🤖 Claude API:受け取ったテキストに対してAI応答を生成
つまり、ArduinoはセンサーやUIを担当、AI処理はPython+Claude APIに任せるという役割分担です。これがポイントです。
今回使うハードウェアはこちら。
- Arduino UNO(または互換機)
- タクトスイッチ × 1
- 抵抗 10kΩ × 1(プルダウン用)
- I2C接続のOLEDディスプレイ(SSD1306・オプション)
- USBケーブル(PCと接続用)
📦 環境準備:使うライブラリとAPIキーの設定
まずPython側の準備から始めましょう。
必要なPythonライブラリをインストール
pip install anthropic pyserial
anthropic:Claude API公式Pythonクライアントpyserial:ArduinoとのUSBシリアル通信に使います
APIキーを環境変数に設定
APIキーはコードに直書きしないのが鉄則です。環境変数に設定しましょう。
# macOS / Linux
export ANTHROPIC_API_KEY="sk-ant-xxxxxxxxxxxx"
# Windows(コマンドプロンプト)
set ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
設定できたか確認しておきましょう。
# Python で確認
import os
print(os.environ.get("ANTHROPIC_API_KEY")) # キーが表示されればOK
🔌 STEP 1:Arduino側のスケッチを書く
まずArduino側を作ります。ボタンが押されたらシリアル通信でPythonに「質問文」を送り、Pythonからの返答を受け取ってシリアルモニタに表示する、シンプルな構成です。
// Arduinoスケッチ:ボタン押下でPythonにメッセージ送信 → 返答を受信して表示
const int BUTTON_PIN = 2; // ボタン接続ピン
bool buttonPressed = false; // ボタン状態管理フラグ
String responseBuffer = ""; // Pythonからの返答バッファ
void setup() {
Serial.begin(9600); // シリアル通信開始(9600bps)
pinMode(BUTTON_PIN, INPUT); // ボタンを入力モードに設定
Serial.println("READY"); // Pythonへ準備完了を通知
}
void loop() {
// ボタンが押されたか確認
if (digitalRead(BUTTON_PIN) == HIGH && !buttonPressed) {
buttonPressed = true;
// 🔑 ここで送りたい質問をシリアル送信
// 実際にはセンサー値や状況に合わせた文を生成できます
Serial.println("今の室温が25度で湿度が70%です。快適ですか?アドバイスをください。");
}
// ボタンが離されたらフラグをリセット
if (digitalRead(BUTTON_PIN) == LOW) {
buttonPressed = false;
}
// Pythonからの返答を受信して表示
while (Serial.available() > 0) {
char c = Serial.read();
if (c == '\n') {
// 1行受信完了 → 表示して内容をリセット
Serial.print("[AI応答]: ");
Serial.println(responseBuffer);
responseBuffer = "";
} else {
responseBuffer += c;
}
}
delay(100);
}
ポイントをまとめるとこんな感じです。
Serial.println()でPython側に文字列メッセージを送信Serial.available()でPythonからの返答を受信待機- 改行文字(
)を区切りとして1行ずつ処理する設計
- ボタンのチャタリング防止にフラグ管理を使用
🐍 STEP 2:Python側のブリッジスクリプトを書く
次に、Pythonスクリプトを作成します。これがArduinoとClaude APIをつなぐ「橋」の役割を果たします。
import serial
import anthropic
import os
import time
# ===== 設定 =====
SERIAL_PORT = "COM3" # Windowsの場合。Macなら "/dev/tty.usbmodem..." 等
BAUD_RATE = 9600
MODEL = "claude-opus-4-5" # 使用するClaudeモデル
# ===== 初期化 =====
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
print(f"[INFO] シリアルポート {SERIAL_PORT} に接続中...")
arduino = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=2)
time.sleep(2) # Arduino起動待ち(重要!)
print("[INFO] 接続完了!Arduinoからのメッセージを待機中...")
def ask_claude(user_message: str) -> str:
"""Claude APIにメッセージを送信して返答を取得する"""
print(f"[Claude送信] {user_message}")
message = client.messages.create(
model=MODEL,
max_tokens=200, # Arduinoに返す文字数は短めに設定
system=(
"あなたは家庭のスマートデバイスに搭載されたAIアシスタントです。"
"ユーザーのセンサーデータや質問に対して、"
"簡潔で実用的なアドバイスを100文字以内で返してください。"
),
messages=[
{"role": "user", "content": user_message}
]
)
response_text = message.content[0].text
print(f"[Claude返答] {response_text}")
return response_text
def send_to_arduino(text: str):
"""テキストをArduinoにシリアル送信する"""
# Arduino側で1行ずつ処理するため改行を付けて送信
arduino.write((text + "\n").encode("utf-8"))
print(f"[Arduino送信] {text}")
# ===== メインループ =====
try:
while True:
# Arduinoからの1行メッセージを待受
if arduino.in_waiting > 0:
raw = arduino.readline()
message = raw.decode("utf-8", errors="ignore").strip()
# 空行・準備完了通知は無視
if not message or message == "READY":
continue
print(f"[Arduino受信] {message}")
# Claude APIに問い合わせ
ai_response = ask_claude(message)
# 返答をArduinoに返す
send_to_arduino(ai_response)
time.sleep(0.1)
except KeyboardInterrupt:
print("\n[INFO] 終了します")
arduino.close()
ここが重要です。
time.sleep(2)のArduino起動待ちを忘れないこと。これがないと最初のメッセージを取りこぼします- systemプロンプトでClaudeをスマートデバイス用AIとして動作させています。応答が短くなるよう指示するのがコツ
max_tokens=200で返答を短めに制限。Arduinoのシリアルバッファに収まるサイズに調整しましょう- 文字コードは
utf-8を指定。日本語のやりとりに対応します
🚀 STEP 3:実際に動かしてみよう
では実際に動かしてみましょう。手順はこの通りです。
- Arduinoスケッチをボードに書き込む(Arduino IDEで「マイコンボードに書き込む」)
- シリアルモニタは一旦閉じる(PythonとArduino IDEで同時にシリアルポートを開けないため)
- Pythonスクリプトを実行する
- Arduinoのボタンを押す
うまく動くと、ターミナルにこんな出力が流れてきます。
[INFO] シリアルポート COM3 に接続中...
[INFO] 接続完了!Arduinoからのメッセージを待機中...
[Arduino受信] 今の室温が25度で湿度が70%です。快適ですか?アドバイスをください。
[Claude送信] 今の室温が25度で湿度が70%です。快適ですか?アドバイスをください。
[Claude返答] 室温25℃・湿度70%はやや蒸し暑い環境です。除湿機や扇風機を使って湿度60%以下に下げると快適になりますよ!
[Arduino送信] 室温25℃・湿度70%はやや蒸し暑い環境です。除湿機や扇風機を使って湿度60%以下に下げると快適になりますよ!
Arduinoのシリアルモニタ側には「[AI応答]: 室温25℃・湿度70%は…」と表示されるはずです。
🌡️ 応用編:DHT11センサーと組み合わせてリアル計測データをAIに渡す
固定の文字列を送るだけでは面白くないので、DHT11温湿度センサーの実測値をリアルタイムでClaudeに送るバージョンに拡張してみましょう。
Arduino側のスケッチを以下のように変更します(DHT libraryが必要です)。
#include <DHT.h>
#define DHT_PIN 4 // DHT11のデータピン
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
const int BUTTON_PIN = 2;
bool buttonPressed = false;
String responseBuffer = "";
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
dht.begin(); // DHT11初期化
Serial.println("READY");
}
void loop() {
if (digitalRead(BUTTON_PIN) == HIGH && !buttonPressed) {
buttonPressed = true;
// DHT11からリアルタイムで温湿度を取得
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
// 📡 センサー値を含む文章をPythonへ送信
String msg = "現在の室温は" + String(temp, 1) + "度、湿度は" + String(hum, 1) + "%です。快適な環境にするためのアドバイスをください。";
Serial.println(msg);
} else {
Serial.println("センサーの読み取りに失敗しました。原因を教えてください。");
}
}
if (digitalRead(BUTTON_PIN) == LOW) {
buttonPressed = false;
}
// 返答受信処理
while (Serial.available() > 0) {
char c = Serial.read();
if (c == '\n') {
Serial.print("[AI]: ");
Serial.println(responseBuffer);
responseBuffer = "";
} else {
responseBuffer += c;
}
}
delay(100);
}
これでボタンを押すたびに最新の温湿度データがClaudeに送られ、AIが状況に合わせたアドバイスを返すスマートデバイスが完成します。
💡 さらに発展させるアイデア
今回の仕組みを応用すれば、こんなデバイスも作れます。
- 🌿 植物管理デバイス:土壌水分センサー+光センサーの値をClaudeに送って「今日の水やりは必要?」を自動判断
- 💪 運動補助デバイス:加速度センサーで運動量を計測し「今日の運動ログ」をClaudeに渡して健康アドバイスを取得
- 🚪 ドア開閉ログAI:磁気センサーで入退室を記録 → 「今日は何時間外出しましたか?」に答えてもらう
- 🔊 音声出力対応:ClaudeのテキストをPythonのText-to-Speechで音声化(
pyttsx3等)してスピーカーから再生
Python側はロジックを追加するだけで機能拡張できるので、アイデア次第でどんどん育てられます。
⚠️ ハマりやすいポイントと対処法
この構成で詰まりやすい場所をあらかじめ押さえておきましょう。
- ❌ 「シリアルポートが開けない」エラー:Arduino IDEのシリアルモニタが開きっぱなしになっていないか確認。PythonとArduino IDEは同時に同じポートを開けません
- ❌ 文字化け:PythonとArduino側の文字コードを
utf-8に統一しているか確認。Arduinoのシリアルモニタも「UTF-8」に設定 - ❌ 最初のメッセージが届かない:
time.sleep(2)の起動待ちを入れているか確認。Arduinoのリセット直後は通信が不安定です - ❌ API返答が途中で切れる:
max_tokensが小さすぎる可能性。200〜300程度に増やしてみましょう
まとめ
今回は、ArduinoとClaude APIをPythonで橋渡しすることで、AIが返答するスマートデバイスを自作する方法を解説しました。
ポイントをおさらいすると、
- Arduinoはセンサー・UIを担当、AI処理はPython+Claude APIに分担する設計が肝
- シリアル通信(pyserial)でリアルタイムに双方向データをやりとりできる
- systemプロンプトとmax_tokensの調整でデバイス用途に最適化されたAI応答が得られる
「電子工作にAIを組み込む」というのが、もはや難しい話ではなくなってきているんですよね。今回の仕組みを土台にして、あなただけのオリジナルAIデバイスをぜひ作ってみてください!🎉
センサーの種類を変えたり、Claudeへの問いかけ文を工夫したりするだけで、まったく違う用途のデバイスが生まれます。一緒に電子工作×AIの世界を広げていきましょう!
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





