3 ポイント 投稿者 GN⁺ 2025-02-03 | 1件のコメント | WhatsAppで共有
  • ESP32 RC Carsは、ESP32-CAMベースの遠隔操作カメラシステムで、WebSocketを通じてリアルタイム映像ストリーミングとモーター・サーボ制御を同時に実装する
  • PythonサーバーアプリケーションがWebSocket通信を管理し、ブラウザでESP32デバイスの映像を見ながら制御できるWebインターフェースを提供する
  • 主な機能は、ESP32-CAMのライブビデオストリーミング、WebSocketコマンドによるモーター・サーボ制御、制御コマンドを受信しない場合にデフォルト状態へ戻す自動タイムアウト、複数クライアントの映像キャンバス
  • ハードウェアには、AI Thinkerまたは互換ESP32-CAM、GPIOに接続されたモーター・サーボ、安定した5V電源、Wi-Fiネットワークが必要で、SDカードは任意
  • 制御コマンドは MOTOR:<speed>SERVO:<angle>CONTROL:<speed>:<angle> 形式で、サーバーは複数のESP32クライアントの映像フレームをグリッド状に配置し、Webインターフェースへストリーミングする

プロジェクト概要

  • ESP32 RC Carsは、ESP32ベースの遠隔操作カメラシステムの例
  • ESP32-CAMがリアルタイム映像をWebSocketで送信し、モーターとサーボはWebSocketコマンドで制御される
  • PythonサーバーアプリケーションはWebSocket通信を管理し、WebインターフェースからESP32デバイスを見て制御できるようにする
  • デモ動画: https://youtu.be/OubYFXmvA1E

主な機能

  • ESP32-CAMからWebサーバーへライブビデオストリーミングを送信する
  • WebSocketコマンドでモーターとサーボを遠隔制御する
  • 一定時間制御コマンドがない場合、モーターとサーボがデフォルト状態へ自動復帰する
  • サーバーは複数クライアントの映像フィードを動的にキャンバスへ配置する

ハードウェアと材料

  • 必要なハードウェア
    • ESP32-CAM、AI Thinkerモジュールまたは互換ボード
    • 適切なGPIOピンに接続されたモーターとサーボ
    • ESP32-CAM用の安定した5V電源
    • 通信用Wi-Fiネットワーク
    • 他の機能に必要な場合は任意でSDカード
  • 使用材料はAliExpressで購入したキットの構成品
    • 車体シャーシ
    • 電子スピードコントローラー
      • 30A版を使用し、BEC出力が5V 3Aだったため、ESCとサーボを駆動するのに十分な電流に見えた
    • バッテリーホルダー
    • 2本の18650 3.6Vセル、または7.4Vバッテリーパック
      • どちらも使用したが、セルのほうが他のプロジェクトでより柔軟に使える
    • ESP32-CAM
      • 外部アンテナ付きモデルが非常に重要で、170度魚眼カメラを使用した
    • Bluetooth Gamepad
      • PS4コントローラーを使用した

配線方法

  • 車体シャーシに含まれるサーボの3ピンJSTアダプターを取り外し、ESP32に接続できるよう4ピンJSTプラグへ移した
  • サーボのプラス・マイナスリードをつなぎ合わせ、圧着工具で3ピンのメスJSTプラグを追加した
  • ESCの白い制御線を4ピンJSTプラグと3ピンメスプラグに接続した

ソフトウェア構成

  • ESP32コードで使用するライブラリ
    • WiFi.h: Wi-Fi接続
    • ArduinoWebsockets.h: WebSocket通信
    • esp_camera.h: ESP32-CAMカメラ制御
    • ServoControl.h, Esc.h: サーボとモーター制御
    • Arduino.h: 標準Arduino関数
  • Pythonサーバーの依存関係は次のコマンドでインストールする
sudo apt install python3-aiohttp python3-opencv python3-numpy

設定と実行

  • ESP32ファームウェア設定
    • secrets.hにWi-Fi認証情報とWebSocketサーバーURLを設定する
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
  • カメラGPIOピンはAI Thinker ESP32-CAMボード用に事前設定されている
  • 必要に応じて、モーターとサーボのピンをハードウェア構成に合わせて修正する
  • Pythonサーバー設定
    • サーバースクリプトをWebインターフェース用のindex.htmlファイルと同じディレクトリに置く
    • 次のコマンドでサーバーを実行する
python3 app.py

使い方とWebSocketコマンド

  • ESP32の使用手順
    • Arduino IDEまたは互換プラットフォームで、提供されたスケッチをESP32-CAMにアップロードする
    • シリアル出力を確認し、Wi-FiとWebSocketサーバーへの接続が成功したか確認する
  • サーバーの使用手順
    • Pythonサーバースクリプトを実行する
    • ブラウザでWebインターフェースを開き、ライブ映像ストリームを見る
    • WebSocket接続を通じて制御コマンドを送る
  • 対応コマンド
    • MOTOR:<speed>: モーター速度設定、範囲は-255から255
    • SERVO:<angle>: サーボ角度設定、範囲は0から180
    • CONTROL:<speed>:<angle>: モーター速度とサーボ角度を同時に制御する

動作詳細とトラブルシューティング

  • ESP32初期化ステップ
    • 指定されたWi-Fiネットワークに接続する
    • 映像ストリーミングに合わせてESP32-CAMを設定する
    • サーバーとのWebSocket接続を確立する
  • タイムアウト処理は、一定時間制御コマンドがない場合にモーター速度を0、サーボ角度を90へ戻す
  • Pythonサーバーは複数のESP32クライアントとWebSocketで通信する
  • サーバーは入力される映像フレームを処理し、グリッド形式で動的に配置したうえでWebインターフェースへストリーミングする
  • 接続に問題がある場合は、secrets.hのWi-Fi認証情報を確認し、WebSocketサーバーが実行中でアクセス可能か確認する
  • 映像ストリームに問題がある場合は、ESP32-CAMの電源が適切か、カメラ初期化設定を確認する
  • プロジェクトはMIT Licenseで公開されている

1件のコメント

 
GN⁺ 2025-02-03
Hacker News のコメント
  • Arduino はあったが ESP32 はなかった12年前に、似たようなものを作ったことがある: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    古い HTC Magic 携帯をカメラ+Wi-Fi 送信機として使い、シリアルポートとレベルシフタで Arduino に接続してサーボと RGB LED を制御していた
    接続はそれほど安定していなかったが、かなり楽しかったし、今なら次世代のマイコンでプロジェクトを復活させてみる時期かもしれない
  • プロジェクトへのフィードバックに感謝しているし、今後も続けたい。PR も受け付けてみたい
    プロジェクトを気に入ったなら、リモート開発者を探している人に紹介してもらえるのが一番の助けになる
    本業は Ruby on Rails 開発者だが、ロボティクスの仕事も検討できる
  • ESP32 CAM を買う前に、外部アンテナ付きモデルを検討したほうがいい
    この記事は読む価値がある: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
    いくつかの助言を適用するまでは、フレームレートがかなり悪かった
    • ルーターの管理画面上では、抵抗をはんだ付けし直してアンテナを接続した途端、不安定な 1Mbps から安定した 20Mbps に一気に上がった
      0Ω抵抗をはんだ付けし直すのはほとんど冒険のようだったが、とにかく正しいピンにつなげられた。結果はこんな感じ: https://imgur.com/a/LJflZ80
    • このプロジェクトをやった経験では、外部アンテナはほぼ必須だった
      使ったアンテナへのリンクを README に追加した
    • 正確なモデルをおすすめしてもらえる?
  • いいね。ESP32 で動く無限軌道の RC 戦車を作り、Bluetooth で PlayStation 4 コントローラーに接続して操縦していた
    基本ソフトウェアは Bluetooth コントローラーライブラリを使えば、C コード20行ほどで簡単に始められる
    その後、操作しやすくするために機能を追加した。2本のトラックを2本のスティックで制御する方式は低速では問題ないが、ドローン用モーター2基でほぼ20km/hまで出るようになると、別の制御方式が必要だった
    最終的には、DualShock コントローラーのトリガーで回転数制限付きの直接トラック制御を行い、高速走行では左スティック上下を加速、右スティック左右をステアリングに使って、普通の RC カーのように運転できるようにした
    ベースにした同じ 3D プリントモデルの動画で、00:50 から速度がよく分かる: https://www.youtube.com/watch?v=3Mv_tDY89Zw
    • 本当に印象的だ
      RC 制作には詳しくないのだが、普通はどうやって制御するの? PS4 コントローラーを ESP に直接接続する方式なのか?
  • FPV の大きな問題であり、長い間アナログ技術にとどまっていた理由はレイテンシだ
    このプロジェクトのレイテンシがどの程度なのか気になる
    • 最近の FPV はたいてい ExpressLRS[0] を使う。FPV クアッドコプターの制御リンク向けのオープンプロトコルで、通常 ESP32 も使われる
      一方で、FPV クアッドコプターの映像は分かれている。信号が途切れるときに完全に切断して再接続するのではなく徐々に悪化するという理由でアナログを使う人もいれば、802.11 ベースの通信を使う人もいて、実際かなり競争力がある
      例えば Walksnail Goggles は映像リンクに 802.11 を使っており、非常にオープンだったり文書化が充実していたりするわけではないが、Chris Rosser の取り組みのように内部を掘り下げている人たちもいる
      こうした構成のレイテンシは、高速な競技用クアッドコプターのレースにも十分な水準に見える
      [0] https://www.expresslrs.org
    • 関連プロジェクト: https://github.com/wooky/esp32-analog-video-over-wifi
      それから: https://github.com/gyrex/CrystalVideo
    • FPV ドローンでの経験のような比較基準はないが、自宅の無線ネットワークでは、他の家庭用機器がすべて接続されている状態でもレイテンシは問題にならなかった
      フレームレートは概ね、ESP32 が画像をどれだけ速くキャプチャできるかに制限されているようだ
      Python スクリプトで FPS を測定したところ、ESP32 群から約 50fps を受け取っており、最近は家の外で試すためにトラベルルーターを買った
  • 似たようなプロジェクトをやってみようかと考えているので、レイテンシの経験が気になる
    映像フィードを見ながら遠隔操縦できるのか? ほとんどの速度で障害物を避けるには遅すぎるのではないか、というのが一番の懸念だ
  • 去年同じキットを買い、最近は小さなディスプレイ付きの ESP32 ゲームコントローラーも買った: https://github.com/01studio-lab/pyController
    時間ができたら両方を組み合わせて、車を操縦しながらディスプレイでカメラフィードも見たい
  • 成果物のほうが重要で、作る楽しさはそれほど重要でないなら、最近 AliExpress ではまともな2.5インチ RC カーが30ドル、独立型の 5.8GHz アナログカメラが25ドルで買える
    • 独立型というのが一体型カメラのことなら、内蔵 VTX 付きカメラは通常のアナログよりもさらに微妙なことが多く、それでもアナログゴーグルが必要だ
      度付き眼鏡が不要、またはコンタクトレンズを使う人なら、DJI O4 ‘lite’ と N3 ゴーグルの組み合わせのほうがずっと良い選択だ
  • RC カーを自動化したいなら、楽しく読めるはず
    数年前の記事なので、今なら似た結果をもっと簡単に、またはもっと良い方法で出せるかもしれない: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
  • 戦場で使われる FPV クアッドコプターは誰もが知っているが、地上車両への関心も徐々に高まっている
    映画に出てくる Boston Dynamics のロボット犬と Terminator を混ぜたような姿とはまったく違うが、地雷敷設、地雷爆破、前線のどこかに潜んでいる兵士へ少量の補給物資を運ぶといった、目立たない「退屈な」作業では非常に有用だ