WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【設計・パーツ選定編】

#電子工作#生成AI#ESP32#Arduino
WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【設計・パーツ選定編】

「人間が音声で『赤い缶に近づいて』と指示すると、障害物を自律的に回避しながらターゲットへ移動する小型ロボット」の制作に今回挑戦します。

レトロPC風の卓上時計ケースに2.4インチ液晶を埋め込み、表情のアニメーションを表示しながら、足回りにはタミヤのカムプログラムロボットを流用した機体を目指します。

完成イメージ
完成イメージ

*▲ 目指す完成イメージ(レトロPC風ケース+走行シャーシ+表情表示)*

筆者について&この連載について

普段はWebエンジニアとしてWebアプリケーションの開発を行っている@mstmst37です。

電子回路や組み込み開発の専門知識は持っていませんでしたが、ここ数年は趣味としてArduinoでセンサーを動かしたり、小型液晶への描画やWi-Fi経由のAPI連携など、初歩的な実験を重ねてきました。

そうした工作経験とGemini APIなどの生成AIを組み合わせることで、個人開発でも自律走行ロボットを組み立てられるのではないかと考え、この制作を始めました。

本記事は、構想から完成までを記録する全3回の連載の第1回です。

  • 第1回: WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【設計・パーツ選定編】
  • 第2回: WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【機体と回路の構築編】
  • 第3回: WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【AI連携・自律走行編】

これまでの電子工作経験

これまでは以下のような初歩的な実験にとどまっていましたが、今回はこれらの技術を組み合わせて機体を構築します。

  • Arduinoの基本的な動作確認
  • 温度センサーの利用
  • 小型液晶への情報表示
  • 自作携帯ゲーム機の試作
  • カメラモジュールの接続
  • Wi-Fi経由で天気予報APIからデータを取得し、サーボモーターの指針で天気を指し示す仕組み
作ってみた
作ってみた

Web開発とハードウェア開発の大きな違い

Webアプリケーション開発では、実行時エラーが発生してもコードを修正して再実行すれば復旧できます。一方でハードウェア開発では、電源ラインの逆配線や5VとGNDの短絡(ショート)を起こすと、一瞬の過電流でマイコンやドライバーICが物理的に焼損し、基板そのものを買い直すことになります。そのため、通電前にテスターで配線の導通を確認する手順や、データシートに記載された許容電圧と最大電流量の確認作業が作業工程の中で大きな比重を占めます。

今回作るロボットの目標について

最初の段階として、次の仕様を目標に設定します。

人間が目標物を音声で指示し、AIを用いて障害物を避けながら目標物へ向かう。

初期段階で過大な要件を課すと制作が滞りやすいため、まずはこの単一の機能に絞ります。その先にある、障害物の回避ルート生成や走行速度の加減といった状況判断までAIに委ねる自律走行を見据えつつ、まずは次のシナリオの実現を目指します。

利用者が「赤い缶に近づいて」と音声で指示すると、機体が障害物を自律的に回避しながら赤い缶の位置まで移動します。

リモコンを避けながら赤い缶に向かう事を目指す
リモコンを避けながら赤い缶に向かう事を目指す

最初の設計

目標とする動作シナリオから、必要となる要素を分解します。

人間が「赤い缶に近づいて」と音声で指令すると ロボは障害物を避けながら赤い缶まで走って欲しい。

上記の動作を実現するために、大まかに次の機能群を整理しました。

  1. 音声入力の取得と処理
  2. 周囲を撮影するカメラ画像の取得
  3. 外部AIモデル(Gemini FlashなどのAPIを想定)との通信
  • 音声データをテキスト化し、プロンプトとして成形する
  • 画像データから対象物と障害物を識別する
  • 指示テキストと画像解析結果に基づいて走行ルートを算出する
  • 走行計画を「右へ旋回」「直進」「左へ向き直す」といった個別のアクションへ分解する
  1. 生成された個別動作指示を受け取り、モーター等を制御して実行する車体側の制御

これらの各要素について、実現可能性と具体的な実装手段を検討していきます。

AIとの対話による課題整理

構想段階の粗い要件をもとに、設計上の課題を生成AIへ相談しながら具体的な技術選定へ落とし込みました。対話を通じて得られた知見は次のとおりです。

  • マイコンのGPIOピンから出力される信号は電流量が小さく、モーターを直接駆動させることはできません。低電力の制御信号で外部電源からの電流をモーターへ供給するため、モータードライバを介在させる必要があります。
  • 音声指示の認識をすべてクラウドAIに委ねる構成は、常時音声を送信し続けることによる通信帯域やコストの面で課題があります。実用上は、まずマイク側で特定の呼びかけ(ウェイクワード)を検知し、その後に続く発話のみを切り出して送信する構成が一般的です。開発の初期段階では、機体単独での音声認識に固執せず、スマートフォンのPWA(Progressive Web Apps)経由で音声を送信して代用する進行も現実的です。
  • リソースの制約から、機体側で軽量な言語モデルを常時動かすことは困難です。そのため、数アクションごとに外部AIと通信する構成が現実的です。外部AIからの指示が「右へ35度旋回」のような離散的な命令になる場合、機体側でその角度を正確に実行できなければ位置の誤差が累積します。スリップなどによるズレを補正するため、ジャイロセンサーを搭載して車体の回転量を実測しながら制御する機構が有効です。

未知の領域であっても、前提知識をAIとの対話で補うことで、回路構成や制御方式の選定を円滑に進められます。

Raspberry PiからESP32への変更理由

当初は小型のシングルボードコンピュータであるRaspberry Piの採用を検討しましたが、価格や入手性の課題がありました。Raspberry Pi Zero 2 Wも品薄が続いていたため、メモリリソースは大幅に制限されるものの、低価格かつWi-Fiモジュールを内蔵しているESP32を採用することにしました。

2マイコン構成による機能分散

検討を進めるにつれて、接続するセンサーや周辺機器に対して、単一のマイコンではピン数が不足することが判明しました。そこで、役割を次のように二分する構成を採用します。

  • ESP32:Wi-Fi経由でのAI API通信、音声の送受信、カメラ画像の取得、液晶画面への描画といった処理(頭脳側)
  • Arduino:モーターのPWM制御、ジャイロセンサーを用いた姿勢維持、段差検出といったリアルタイム制御(運動機能側)
  • 両マイコン間の連携:シリアル通信を用いたコマンドの授受

このような役割分担により、必要なピン数と処理負荷の問題を分散できます。

脳内整理として手書きの図
脳内整理として手書きの図

手書きでまとめた回路や構成のスケッチも、AIツールを用いて整理されたブロック図へ清書できます。

AIによる清書
AIによる清書

前述の走行シナリオを要素技術へと分解していくことで、当初は曖昧だった目標も実現可能な設計として輪郭を帯びてきます。

筐体と足回りの選定

実装へ入る前に外観や機構のベースを具体化しておくことは、設計の整合性を保つ上で有効です。

レトロなパーソナルコンピュータを模した卓上時計の筐体は、内部に小型の液晶ディスプレイが収まりやすい構造をしています。

MacClockと2.4inch液晶
MacClockと2.4inch液晶

駆動系については、左右のモーターの個体差や車輪の摩擦抵抗によって直進すら困難になる場合があり、自作機構では機械的要因とプログラムの不具合の切り分けに時間を費やしがちです。そのため足回りには実績のあるタミヤのカムプログラムロボット工作セットを採用し、シャーシとギアボックスを流用します。

タミヤのカムプログラムロボット
タミヤのカムプログラムロボット

この足回りの上に時計型ケースを組み合わせることで、個性的な外観のロボットを構成できます。

組み合わせ後の外観イメージ
組み合わせ後の外観イメージ

液晶ディスプレイの選定とUI設計

ロボットの表情やステータスを表示する視覚的要素として、2.4インチ液晶ディスプレイを選定しました。

こんなフェイスにしたい
こんなフェイスにしたい

画面設計にはGUI設計ツールのEEZ Studioを活用します。画面レイアウトを事前にビジュアルで構築できるため、表示の調整を効率的に進められます。

EEZ Studio
EEZ Studio

マイコンと液晶の配線作業においても、基板表面に印刷されたピン名(GND、CS、RSTなど)が写った写真をAIに提示することで、接続先ピンの割り振りを支援してもらえます。

筐体への配置計画と表示構想

選定した液晶ディスプレイは、時計型ケースの開口部に収まるよう配置を検討します。固定方法や干渉箇所の調整を行い、画面がケース正面に正しく露出する構造を計画します。

画面のグラフィックには、ロボットの目にあたるアニメーションを表示させつつ、開発中は内部ステータスやログ情報もオーバーレイ表示できる構成を想定しています。具体的なケースの加工や描画プログラムの実装は、第2回で進めていきます。

まず顔だけはできた
まず顔だけはできた

採用部品の一覧

前述の走行シナリオを実現するために選定した部品の一覧を紹介します。同等の機能を持つ互換品は多数存在するため、要件に応じて柔軟に選択できます。

マイコン

主制御基板にはカメラ付きのESP-32S(写真左)を採用しました。小型でありながらデュアルコア(最大240MHz動作)、内蔵SRAM 512KB、外部PSRAM 8MB、Flashメモリ16MBを備え、Wi-Fi通信にも対応しています。
写真中央は運動制御を担当するArduino Nanoです。16MHz動作のマイコンで、SRAM 2KB、Flashメモリ32KBを備えています。

ESP32とArduino
ESP32とArduino

モータードライバ

2個のDCモーターを正逆転制御するため、DRV8833を搭載したドライバ基板を採用しました。マイコンからの低電力なPWM信号を入力することで、外部電源からモーターへの給電量を調整し、回転速度と回転方向を制御します。

モータードライバ:DRV-8833(160円)
モータードライバ:DRV-8833(160円)

3軸の姿勢センサ

車体の旋回角や傾きを実測するため、3軸加速度・3軸ジャイロを統合したMPU-6050モジュールを搭載します。車輪のスリップによる回転角度の誤差をI2C経由で検出し、目標姿勢への正確な旋回を補正します。

ジャイロ:MPU-6050(420円)
ジャイロ:MPU-6050(420円)

赤外線距離センサ

車体前方下部を監視し、4cm以上の段差(階段や机の端など)を検知した際に即座に停止させるためのセンサーです。正確な距離測定値を取得する用途ではなく、基板上の可変抵抗で設定した閾値に応じてHigh/Low信号を出力する仕様のものを利用します。

赤外線距離センサ(190円)
赤外線距離センサ(190円)

ちょっとしたブザー

起動完了やエラー発生、待機中といった内部状態を音で通知するための小型圧電ブザーです。

圧電ブザー(80円くらい)
圧電ブザー(80円くらい)

音声入力のマイク

機体単独での音声認識を試行する後続フェーズ向けに用意した、I2S通信対応のデジタルマイク(INMP441)です。アナログ信号の増幅やAD変換回路を別途組む必要がなく、PCM音声データを直接ESP32のバッファへ取り込めます。

デジタルマイク:INMP441(210円)
デジタルマイク:INMP441(210円)

USB-Cの口

電源には一般的なモバイルバッテリーを利用する予定です。端子規格を統一するためにUSB Type-Cの受電用ブレークアウト基板を用意しました。
USB Type-C給電規格(USB PD対応電源など)では、CC1およびCC2ピンに5.1kΩのプルダウン抵抗が検出されて初めて受電機器(シンク)として認識され、電源ライン(VBUS)に5Vが出力される仕組みになっています。そのため、両CCピンにプルダウン抵抗が実装された基板(写真右)を採用し、安定した給電を確保しました。

USBの口
USBの口

次回:WebエンジニアがGemini API×ESP32で「音声指示で動く自律走行ロボット」を作ってみた【機体と回路の構築編】

mstmst37

mstmst37

Web Engineer / AI Engineer