ArduinoとPythonで作るAIアシスタントロボット「ジャウndice」
必要な部品と材料
| Arduino Nano R3 | ×1 | |
| SG90 マイクロサーボモーター | ×3 | |
| 超音波距離センサー HC-SR04 | ×1 | |
| PCBWay カスタムPCB | ×1 | 共有プロジェクトページ |
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
イントロダクション
映画「アイアンマン」シリーズのAIアシスタント「ジャービス」に憧れ、自分専用のAIアシスタントロボットを作成しました。PythonでAI部分を実装し、さらに物理的なアバターロボットを制作することで、会話だけでなく動作もできる「体を持ったAI」を実現します。ArduinoとPythonの連携で、PC制御と簡単な雑談が可能なAIロボットを作りましょう。
ロボット名を「ジャウndice(黄疸)」とした理由? 全身を黄色、それも鮮やかな黄色に塗装したからです!
パーツリスト
電子部品
- Arduino Nano – 1個
- マイクロサーボ SG90 – 3個
- 超音波センサー HC-SR04 – 1個
ボディ材料
- PVCシート(白推奨、塗装しやすい。私は青を使用)
- サーボホイール(スタンド用)
工具
- カッターナイフ、ハサミ、グルーガン、スプレー塗料
ソフトウェア
- Python 3
- Arduino IDE
動作原理
メインのAIコードはPC上で実行します。理由はPython対応かつ処理能力がArduinoより高く、PC操作自動化もPC上で行う必要があるためです。ArduinoはUSBケーブルでPCと接続します。
Pythonプログラムが音声認識(Speech-to-Text)、テキスト処理、音声合成(Text-to-Speech)を担当。ロボットが「聞き、理解し、話す」サイクルを実現します。ボディ動作はArduino側に関数として登録し、Pythonからシリアル通信でコマンドバイトを送信して実行させます。
例:「こんにちは」と言わせる場合、Pythonがバイト'h'を送信 → Arduinoがhi()関数を実行。これだけのシンプルな連携です。
回路と電子工作


配線ミスで高価なパーツを焼損するリスクを避けるため、マルチファンクションPCBをEasyEDAで設計し、PCBWayで製造しました。マイクロSDカードスロット、Bluetoothモジュールスロット、5V外部電源入力を備え、Arduino Nanoから給電可能です。300mmトレースで1A電流に対応。PCBファイルはこちらから入手可能。
はんだ付けと回路テスト

全部品をはんだ付け。フューム吸入は発がん性があるため注意してください。BluetoothとTFモジュールは未使用のため未実装。3サーボ+超音波センサーはUSB給電のみで動作し、別電源不要です。外部電池を使う場合は2S LiPo(7.4V)推奨。それ以上だとサーボ焼損の恐れがあります。
ボディ製作


PVCシートでボディを箱組み構造で製作(段ボールでも可)。メインボックスに基板とサーボを収納、ヘッドにも同様にセンサー用穴(目)を開けました。片腕はレンチ形状、もう片方はプラグ形状にし、実物プラグをホットグルーで接着。寸法は自由です。あなたのロボットなので好きな形・サイズで作れます。
重要: ボディを閉じる前に全電子部品を収納してください。私は組み立て後に塗装したためArduinoまで黄色くなってしまいました。先に塗装・乾燥させてから電子部品を入れるのが正解です。
コーディング1: Python側

Pythonを公式サイトからダウンロードし、インストール時に「Add Python to PATH」を有効化してください。
以下のライブラリをコマンドプロンプト/ターミナルでインストール:
pip install speechrecognition
pip install pyaudio
pip install pyttsx3
pip install pywhatkit
pip install pyserial
PythonコードはGitHubからダウンロード、または以下を参照。メインループで音声認識し、ウェイクワード「jaundice」検出後にコマンド処理。YouTube再生、Google検索、情報取得、URL開封、各種アクション(アッパーカット、スマッシュ、パンチ、挨拶、別れ)に対応。Arduinoへシリアルコマンド送信で動作連携。
コーディング2: Arduino側
Arduino IDEで書き込みのみ。シリアルデータ受信待機し、コマンドバイトに応じて動作関数を実行。'u'受信で両手上げ、'h'で挨拶、'p'でダブルパンチ、'U'で右アッパーカット、's'でスマッシュ、'l'で待機・左向きなど。
/** JAUNDICE: AI Assistant robot with Arduino and Python
* author: ashraf minhaj, mail: ashraf_minhaj@yahoo.com
* License: GPL3+
*/
#include <Servo.h>
Servo head, l_hand, r_hand;
int trig = 4, echo = 5;
byte val = 0;
void setup() {
head.attach(2); l_hand.attach(3); r_hand.attach(4);
Serial.begin(9600);
}
void standby() { // 待機ポジション
head.write(90);
int r_pos = 30;
int l_pos = map(r_pos, 0, 180, 180, 0);
l_hand.write(l_pos); r_hand.write(r_pos);
}
void hi() { // 挨拶:右手を振る
head.write(90);
for(int i=30; i<=170; i++){ r_hand.write(i); delay(5); }
for(int i=170; i>=100; i--){ r_hand.write(i); delay(5); }
for(int i=100; i<=170; i++){ r_hand.write(i); delay(5); }
for(int i=170; i>=30; i--){ r_hand.write(i); delay(5); }
standby();
}
void hands_up() { // 両手上げ
for(int i=30; i<=170; i++){
int r_pos=i, l_pos=map(r_pos,0,180,180,0);
l_hand.write(l_pos); r_hand.write(r_pos); delay(5);
}
delay(600);
for(int i=170; i>=30; i--){
int r_pos=i, l_pos=map(r_pos,0,180,180,0);
l_hand.write(l_pos); r_hand.write(r_pos); delay(5);
}
}
// 以下、weight_lift, confused, double_punch, r_upper_cut, smash等の動作関数が続く...
// (全文はGitHub参照)
void loop() {
standby();
while(Serial.available() > 0) {
val = Serial.read();
if(val == 'h') hi();
if(val == 'p') double_punch();
if(val == 'u') { hands_up(); delay(3000); }
if(val == 'l') { standby(); look_left(); delay(2000); }
if(val == 'U') { r_upper_cut(); delay(2000); }
if(val == 's') { smash(); delay(2000); }
}
}
完成と動作確認
ArduinoをUSBでPC接続し、Pythonプログラムを実行。Pythonコード内のArduinoポート(COM15等)を環境に合わせて修正してください。全手順正しければ、チャーミングなAIアシスタントロボットが動き出します。
コード
ソースコード
回路図

製造プロセス
- Raspberry Pi と Python でロボットを構築:完全ガイド
- Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- ArduinoとAndroidでRoomba Create 2をリモコン操作 ─ Bluetooth経由のステップバイステップガイド
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
- Arduino Dueでマスターする音声認識と音声合成
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- Arduinoロボットアーム「LittleArm」をAndroidアプリでBluetooth制御
- Python type()とisinstance()の理解:実例付き解説