「Arduinoで電子工作はできるようになってきた。でも、もっとインテリジェントなデバイスを作りたい…」

そんな気持ち、ありませんか?

センサーで値を読んでLEDを光らせる、モーターを動かす——これだけでも十分楽しいんですが、「AIと組み合わせたら何かすごいものが作れそう」という直感、あると思うんです。

今回は、ArduinoとClaude APIを組み合わせて「AIが返答する音声応答スマートデバイス」を自作する方法を解説します。仕組みはシンプルで、Arduinoが取得したセンサーデータや入力をPythonスクリプトに送り、PythonがClaude APIに問い合わせ、その応答をArduinoに返す——というパイプラインです。

✅ 対象読者:Arduino基礎経験あり・Python初〜中級者
✅ 難易度:★★★☆☆(中級者向け)

難しそうに見えますが、ざっくりとした流れをつかめば一気に「作れそう」に変わるはずです。一緒に進めていきましょう!

🔧 今回作るものの全体像

Arduino electronics IoT
Arduino electronics IoT / Photo by Chengxin Zhao via Pexels

まず完成イメージを整理しておきましょう。

今回作る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:実際に動かしてみよう


では実際に動かしてみましょう。手順はこの通りです。

  1. Arduinoスケッチをボードに書き込む(Arduino IDEで「マイコンボードに書き込む」)
  2. シリアルモニタは一旦閉じる(PythonとArduino IDEで同時にシリアルポートを開けないため)
  3. Pythonスクリプトを実行する
  4. 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コースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。