研究室内のアドベントカレンダー用の記事になります(今日は12/5!)
去年のアドベントカレンダーで「DDProでM5BugC2を動かしてみた」DDProの出力データの一部を解析し、M5BugC2をWi-Fi+UDPで操作しました。
本記事はその続きになります。
目次
M5BugC2が想定通りの挙動にならない!
→ おそらくゴム足が問題
この問題を解決するのは難しそうだし、本来の目的であるラジコン操作にシフトした方が良さそう
ラジコンをDDProで操作できるようにする!
<aside> 💡
本記事の到達点
展望
忙しい人向け


ラジコンは元々ニカド電池で動作していたが、使用できないため、余っていたエアガンのバッテリーを使用することにした。
コネクタはタミヤミニコネクタのため、気にせず接続したところ降圧モジュールが煙を立てて破損+ラズパイも文鎮化することに…
どうやらエアガンのバッテリは±が逆になっているものがあるらしい。実際画像のように、赤いビニールのようなものがコネクタからはみ出ている….
安定化電源を使用して、後輪が想定通りの動作をするかを確認した
ソフトウェアシリアルを使い、ラズパイのGPIO23/24をモータードライバーのin1/2に接続してpwmを適当に流してみた
問題なく動作しており、回路や接続に問題がないことも確認できた
前輪は次の「ステアリングの可動範囲をMCP3008で取得する」で可動範囲の実装を行った後に確認する
作成した回路の画像
実際の動作映像
ギアボックスから出ている4本の信号線をMCP3008に接続することでラズパイからステアリングの状態を確認する
実際に取得できたデータは以下
ステアリング:中央
| CH0(raw) | CH0(V) | CH1(raw) | CH1(v) | CH2(raw) | CH2(v) | CH3(raw) | CH3(v) |
|---|---|---|---|---|---|---|---|
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 63 | 0.203 | 0 | 0.000 | 39 | 0.126 | 0 | 0.000 |
| 130 | 0.419 | 0 | 0.000 | 82 | 0.265 | 0 | 0.000 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 134 | 0.432 | 0 | 0.000 | 90 | 0.290 | 0 | 0.000 |
ステアリング:右
| CH0(raw) | CH0(V) | CH1(raw) | CH1(v) | CH2(raw) | CH2(v) | CH3(raw) | CH3(v) |
|---|---|---|---|---|---|---|---|
| 0 | 0.000 | 87 | 0.281 | 79 | 0.255 | 0 | 0.000 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 0 | 0.000 | 71 | 0.229 | 66 | 0.213 | 0 | 0.000 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 0 | 0.000 | 66 | 0.213 | 61 | 0.197 | 0 | 0.000 |
ステアリング:左
| CH0(raw) | CH0(V) | CH1(raw) | CH1(v) | CH2(raw) | CH2(v) | CH3(raw) | CH3(v) |
|---|---|---|---|---|---|---|---|
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 64 | 0.206 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 0 | 0.000 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 43 | 0.139 |
| 0 | 0.000 | 0 | 0.000 | 0 | 0.000 | 20 | 0.065 |
この結果から、CH2とCH3が左右の判断材料になりそう。また、CH0が可動範囲内かどうかを識別するのに使えそう。
CH1は何に使われているのか現在もわかっていない。
値は安定しておらず、左右に傾いているのに0となったりしている。
「ステアリングの可動範囲をMCP3008で取得する」でわかったことから、前輪の制御コードを軽く実装して、前輪と後輪の動作確認を行った
MCP3008で取得した値が安定していないため、値を元にしたステアリングの舵角調整は難しそう。
そこで、時間ベースの舵角推定を実装した
目標位置 (DDPRO入力)
↓
誤差計算 (target - current)
↓
比例制御でモーター駆動
↓
経過時間から位置を推定・更新
position += direction × rate × dt
rate = (LIMIT / full_swing_time) × (speed / 100)
position: 現在の推定位置 (-100 〜 +100)
direction: 回転方向 (-1: 左, 0: 停止, +1: 右)
rate: 速度に応じた位置変化率
dt: 前回更新からの経過時間(秒)
full_swing_time: 100%速度で端から端まで動く時間
実際の動作映像
前章までの結果と前回の記事を元にDDProの入力値でラジコンを動かしつつ、ラズパイに搭載したカメラ映像をブラウザで確認する
操作のアルゴリズムは前回の記事と異なるが、DDProの値の受け渡しは同様のため、説明をカット
Raspberry Pi Camera Module v3 Wideで撮影した映像を、MJPEG(Motion JPEG)形式でブラウザにストリーミング配信する。
[Camera Module v3] --CSI--> [rpicam-vid] --pipe--> [ffmpeg] --MJPEG--> [Flask] --HTTP--> [ブラウザ]
| --- | --- | --- |
ラジコン操作ではリアルタイム性が重要なため、低遅延なMJPEGを採用したが、
ラズパイにはH.264のハードウェアエンコードがあるため、GStreamerなどで配信する方が低遅延かもしれない。
作成したブラウザの画面