トップ > 技術ナレッジのアーカイブ > 工作キット×AI技術でここまでできる!顔認識機能搭載移動体の開発記録~電子工作編

2025.09.24

工作キット×AI技術でここまでできる!顔認識機能搭載移動体の開発記録~電子工作編

#電子工作 #AI #顔認証 #開発 #Raspberry Pi #MJPG-Streamer #webIOPi

現在公開中のYouTube動画「ロボット×ゲームでARブロック崩し作ってみた」(詳しくはこちら)。こちらは「電子工作」「通信」「組込制御」などの技術を駆使して、ゲームでお馴染みのブロック崩しをリアルの場で再現したものです。
その中でブロック崩しの「バー」の役割を果たす「移動体」をさらにアップデートしてみました。
動画でご覧いただくと分かる通り、移動範囲が左右のみで自由度がありませんでした。 しかし、「もっと自由に操作できたら、新しい使い方やアイデアが広がるのでは?」という思いから、新しい移動体の開発をスタートしました。
今回はスマホでより直感的な操作性、映像配信、顔認識機能を搭載し機能性を向上させた移動体を完成させました。その製作過程と技術的ポイント、そして失敗から学んだ改善方法を紹介します。

    「電子工作編」技術ポイント

  • 電子工作での移動体の作成とノイズ対策
  • webIOPiで移動体とスマホ(コントローラー)の通信
  • MJPG-Streamerで顔認証をさせる(次回「顔認証編」で詳細)

筆者紹介

NAKANO

1999年に中途入社。ディスプレー製造装置および成膜装置の電気制御設計に携わりました。
趣味は電子工作で、電子部品専門店からパーツを取り寄せては、半田付けや組立行うのを日々の楽しみにしています。筋トレにもはまっており最近は週2回のペースでパーソナルジムにも通いはじめました。
今年は12年振りにAI対応ハイスぺPCの制作を計画しています。


技術概要~改良ポイントと追加機能

本プロジェクトでは以下6点の改良・機能追加を行いました。

<改良ポイント>

①剛性強化

シャーシをアルミ板からタミヤのユニバーサルプレートへ変更し耐久性と組立の自由度を向上しました。

②旋回性能追加

足回りを四論駆動からキャタピラに変更したことで、凹凸のある走行面で走破性能が向上し、狭い範囲での旋回も可能になりました。

③電源効率化

モータドライバーを見直したことで、使用電圧が下がり昇圧回路を省略できたことで、回路を簡略化できました。

④操作性

画面上の矢印をタッチする方法から、進みたい方向に指をスライドさせる方法に変更したことで、直感的で滑らかな操作が可能になりました。


<追加機能>

①映像配信

MJPG-Streamerでリアルタイム映像を配信しスマホの画面を見ながら操縦が可能にしました。

②顔認識機能

Open-CVのカスケード分類器を利用し、顔検出機能を実装しました。

移動体のシステム構成

全体の仕組み

このシステムはRaspberry Pi4を中心に構成されており、スマホ操作や映像配信、顔認識によるLED制御を組み合わせています。 大きく分けると以下の3つの要素があります。

  1. スマホによるモータ制御(WebIOPi経由)
  2. カメラ映像の配信(MJPG-Streamer)
  3. 顔認識によるLED制御(Open-CV)
移動体のシステム構成 移動体のシステム構成

続いて回路図です。

移動体の回路図 回路図

では、各パーツについて解説します。

スマホとモータ制御(WebIOPi)

スマホのブラウザから操作すると、WebIOPiがRaspberry Pi4上で指示受け取り、GPIOを通してモータドライバーへ命令を送ります。 その結果、左右のモータが動き、移動体が前進や旋回を行います。
操作画面はスマホに表示されるので、スマホ画面を見ながら操作可能です。

映像配信(MJPG-Streamer)

Raspberry Pi4に接続したUSB Webカメラ から映像を取得します。
その映像はMJPG-Streamerを使ってWi-Fi 経由でスマホへ配信されます。
これにより、スマホでリアルタイムで映像を確認しながらロボットを操作できます。

顔認識とLED制御(Open-CV)

Raspberry Pi4上で動作するOpen-CVがUSB Webカメラの映像を解析します。
顔を検出した場合、GPIO 出力を使って赤色LEDを点灯させます。
図の中にある「たぬきの置物」は、人の顔と無関係な物体を区別するための例として表示しています。

    移動体のスペック(ハード・ソフトウェア)

  • Raspberry Pi4(8GB)
  • マイクロSDカード(64GB)
  • Raspberry Pi OS(32bit)Bookworm
  • WebIOPi
  • MJPG-Streamer
  • Open-CV

    材料の紹介

  • タミヤ ダブルギヤボックス(左右独立4速):左右の駆動輪を独立制御
  • タミヤ タンク工作基本セット:キャタピラにより足回りを実現
  • タミヤ ユニバーサルプレート:各部品を固定するベースフレーム
  • Raspberry Pi4(8GB):制御用マイクロコンピュータ
  • USB Webカメラ:映像入力
  • DRV8835モータードライバー:モータ制御基板
  • ニッケル水素電池+電池BOX:駆動用電源
  • モバイルバッテリー: Raspberry Pi4用電源
  • ブレッドボード&ジャンパーワイヤー:基板、配線用
  • 赤色LED:顔検出時のインジケータ

移動体の組立

まずはこれらの部材を組み立てていきます。

移動体の組立

ギアBOX組立時の注意点

このギアBOXは組立前にギア比を予め決めておく必要があります。
今回は前回の移動体よりも重量が増しているのでトルクを重視しました。意外と知られていないのが付属のグリス塗布。 付属以外のグリスを塗布すると、使用中に油切れになったりしてギアBOXが簡単に壊れてしまいます。実は繊細なパーツです。

続いてモータードライバを半田付けしブレッドボードに組付けしていきます。

ブレッドボードに組付け

モータドライバーの組立

モータドライバーだけでなく電子部品は基本的に静電気に弱いです。
今回は「ESDグローブ」と「導電性マット」に接地を行い静電気対策をしっかりと行った上で半田付けを行いました。

ESDグローブ

導電性繊維を編み込んだ電気を通す手袋で腕に装着したアース線からアースに静電気を逃がしています。

導電性マット

2層構造になっており、表面の緑色部分は高抵抗で静電気をゆっくり逃がし、電子部品への静電気による急激な放電による影響を抑えています。裏面の黒い部分は低抵抗で、静電気を速やかにアースへ逃がします。

半田付け

写真には写っていませんが半田付け時には「フラックス」を塗布しています。 フラックスを塗布することで半田付けを綺麗に仕上げることができます。

そのモータードライバーとRaspberry Pi4を移動体に搭載し配線作業を行って完成です。

ブレッドボードに組付け

モータのノイズ対策

使用するブラシモータは整流時に高周波ノイズを発生します。このノイズはマイコン制御に悪影響を与える可能性があります。
一般的にはモータの端子付近に0.1μF程度のセラミックコンデンサを接続しますが、今回はより効果の高いEMI除去フィルタを採用しました。

モータのノイズ対策

    EMI除去フィルタの原理

    EMI除去フィルタは「インダクタ」で高周波成分を遮断し「コンデンサ」で残った交流成分をGNDに逃がしてノイズを除去しています。

    モータのノイズ対策
    • インダクタ:高周波電流を遮断し、直流成分のみを通す(ローパスフィルタ)
    • コンデンサ:高周波成分をGNDに逃がす(ハイパスフィルタ)

動かしてみた~試運転

では、実際に動かしてみましょう。
スマホ画面のタッチ操作で、前進・後退・左右旋回、指をスライドすることで加速・減速を滑らかに制御できることができます。
オシロスコープでPWM信号の波形が加速、減速に追従しているかも確認できました。
実際の様子がこちら。

試走の動画

PWM波形の様子

<技術解説>外部通信の仕組み(webIOPi)

WebIOPi(ウェブアイオーピーアイ)とは、Raspberry Piを使って、インターネット経由で電子部品を操作できるようにするソフトウェアです。
具体的には、Raspberry Piに接続されたLEDやセンサーなどの電子部品を、Webブラウザ(ChromeやEdgeなど)から簡単に操作・監視できるようになります。
今回の移動体でも以下のような動作をしています。

  1. Raspberry Pi4を起動するとWebIOPiがサーバーとして動作
  2. スマホのブラウザからアクセスすると、HTML+JavaScriptの操作画面を読み込み
  3. タッチ操作により、JavaScriptがHTTPリクエスト(REST API)を送信
  4. WebIOPiがPythonスクリプト(script.py)を介してGPIOを制御

この動作を分かりやすくレストランに例えると
①お店の受付窓口が開店

②お店からメニューを受け取る

③メニューを基に厨房に指示が行く

④ その指示を基にコックさんが作業する

のような動きになります。

外部通信の仕組み(webIOPi)

いかがでしたでしょうか?ここまでで移動体が動作するまでを記載しました。次回は移動体に搭載したカメラで顔認証をさせる仕組みについて解説いたします。

失敗談(WebIOPi)

Raspberry Pi4に「WebIOPi」をインストールし、ワクワクしながらスマホの操作画面をタッチしました。しかし何度押しても移動体はピクリとも動きません。画面は固まったまま。
「配線ミスか?コードの間違いか?」と配線やソースを何度も見直しても異常なし。ターミナル上でエラーメッセージも表示されず原因の特定が困難な状況でした。
期待は徐々に焦りに変わっていきました。調査の結果以外な事実が判明しました。

原因の背景

WebIOPi は Raspberry Pi4のGPIOを簡単に制御できる便利なフレームワークですが、

  • 開発が終了しており公式サポートがない、有志が作成したパッチは存在するものの、環境によってはそれでも動作しない
  • WebIOPiはPython2専用であるため、Python3の環境ではそもそも動かない
  • 最新のRaspberry Pi OS(32bit)BookwormではPython2が削除されていてそもそも動かない、私の環境が最新のRaspberry Pi OS(32bit)Bookwormだった
  • 参考にした資料がRaspberry Pi ZERO向けだったこともこれらのミスを誘発する原因だった。そもそもRaspberry Pi ZEROとRaspberry Pi4はハード構成やOSの仕様が異なる

といった環境面の制約が主な原因でした。

トラブルシューティング手順

  • 動作環境の確認:Python のバージョン、Raspberry Pi OS の種別(Bookworm / Bullseye / Legacy)を確認
  • 有志パッチの適用:GitHub などで公開されているRaspberry Pi4対応パッチをダウンロードし適用
  • OSの選定:Python2が利用可能な「Raspberry Pi OS Legacy 32bit (Bullseye)」に切り替え
  • 再インストール&テスト:WebIOPi 再インストール後、スマホブラウザから動作確認
最終解決

最終解決

Raspberry Pi OS Legacy 32bit (Bullseye) をクリーンインストールし、 有志パッチを適用することで正常に動作。スマホからのタッチ操作無事動作できるようになりました。

再発防止

そもそも何故WebIOPiを使ったのか?
私が手に取った最初の書籍「名刺サイズの魔法のパソコン ラズベリー・パイ で遊ぼう! / 著:林和孝」で紹介されていたのがきっかけでした。後にこのWebIOPiについて調べてみたのですがメリット、デメリットとして以下の特徴があるそうです。

<メリット>

  • WebインターフェースでGPIO制御が可能

    ブラウザからRaspberry PiのGPIOを操作できるため、初心者でも扱いやすいです。
  • REST API対応

    HTTPリクエストを使ってGPIOを制御できるため、外部アプリやスマホからも簡単に連携できます。
  • Pythonベースでカスタマイズ性が高い

    Pythonでスクリプトを組めるので、柔軟な制御や自動化が可能です。
  • 軽量でインストールが簡単

    Raspberry Pi上で動作する軽量なフレームワークで、セットアップも比較的容易です。
  • 複数のGPIOピンを同時に制御可能

    複雑な制御にも対応できるため、センサーやアクチュエーターの同時制御が可能です。

<デメリット>

  • 開発が2014年がら停止している

    公式の更新が止まっているため、セキュリティや互換性の面で問題がある。
  • Python 3非対応

    Python 2系に依存しているため、Python 3環境では動作しないことがあります。
  • ドキュメントが少ない

    情報が古かったり、公式ドキュメントが不十分なため、トラブルシューティングが難しいことがあります。

などの特徴のあるWebIOPiですが、今回はこのデメリットで悩まされました。
WebIOPi代替案として「Flask + RPi.GPIO」なども紹介されていました。 次回機会があれば改良版として是非チャレンジしてみたいと思います。

閉じる