小型Ardupilot Roverの制作

## まえがき

X(Twitter)でArdupilotを用いたローバータイプの機体で草刈りをしている人を見かけたり、  
個人的に、知り合いが家の傾きを気に病んでおり、床下の傾き調査をしたいという状況もあり...  

### 手作りの小型のArduRoverを作成するってのは？  

というわけで、作ってみることにしました!  
(あと飛ばすタイプのドローンの練習になかなかいけなくてフラストレーション貯まってたのもある...)

## 機体作成

![IMG_4394.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/e31732d8-1744-2671-b886-531541d7726e.jpeg)


### ベース車体

- [タミヤ 楽しい工作シリーズ（セット） No.211 アームクローラー工作セット](https://www.tamiya.com/japan/products/70211/index.html)
- [タミヤ 楽しい工作シリーズ（ユニット） No.97 ツインモーターギヤーボックス](https://www.tamiya.com/japan/products/70097/index.html)

![IMG_4393.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/0176f88b-a73a-c393-1e99-08dee92e53e2.jpeg)


(余談)  
Amazonで8年前に買ったもの...  
当時はRaspberryPi3でラジコン作って遊んで、バラしてずっと家に放置されていたものを発掘(笑)

- [Raspberry Piで学ぶ電子工作 超小型コンピュータで電子回路を制御する (ブルーバックス 1891)](https://amzn.asia/d/elF7BDM)

### ESC

- [dm-esc001](https://ja.aliexpress.com/item/1005002959267827.html)
  - 電圧: 3.5-6v
  - 連続電流: 1a、最大電流1.5a
  - Pwm範囲: 1000〜2000us

ツインモーターギヤーボックスに採用されているモーターは`FA-130`モーター(ミニ四駆のデフォモーターとかでよくあるやつ。)  
このモーターは[ここ](https://product.mabuchi-motor.co.jp/detail.html?id=9)と[ここ](https://www.mabuchi-motor.co.jp/motorize/branch/motor/)に諸元あり

- 動作電圧：1.5 -3.0v
- 定格負荷電流：0.66A
- 適正電圧・負荷時の消費電流	500mA

なので、ESCは与えた電圧で電気を送るので`3v`で送れば問題ないし、  
ESCの電流未満のモーターの定格電流なのでESCはこれで燃えないと判断。


(余談)  
4年前にこの機体を作る際、モーターも制御しなきゃいけないと思って買ったが、結局ブラシAIOを使ってしまったので未開封でずっと家に放置されていたものを発掘(笑)

- [Tiny TANK](https://rotorbuilds.com/build/24175)

### 電源回り

- [可変電圧レギュレータ](https://amzn.asia/d/dJT4UZq)
  - ESCに電源を共有する。
  - 出力電流：2A、ピーク3Aのため、モーターの消費電流500mAの2個分でも超えないため電力供給元として適すると判断
- [(Optional)APM電源モジュール](https://amzn.asia/d/0wZm9iy)
  - FC・レギュレータへバッ直でも良いが、他にも機器を繋げたく、+-のパッドを大きくしたくて使用
  - 電流電圧出力パッドがあるが、無理して使わなくてもバッテリーパッドから電流電圧をFCは出してくれる。。

### ドローンパーツ

- [FC:Omnibus F4 Nano V6.1](https://ardupilot.org/copter/docs/common-omnibusnanov6.html)
  - たまたま家に転がってたArdupilot対応FC。
  - UARTの数が足りず、Wifiモジュールを付けるまでパッドが足りないと思うので、皆さんは他のFC使った方が良いと思う。。
- [GPS/Mag: GEPRC M10-DQ GPS](https://caverta.base.shop/items/78250975)
  - CaveRTAさんのところでGet!!今回はこのパーツだけは最新式です！

## 組み立て

配線した写真です

![IMG_4386.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/354d4fd9-bb52-a137-0a59-8f4c1d67d20d.jpeg)

![IMG_4387.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/b4490a39-6629-d67b-082a-c48c8760055b.jpeg)


- APM電源モジュール
  - → (●)FC
  - → (▲)レギュレータ

- (●)FC
  - →レシーバー(UART)
  - →GPS/Mag(UART+SCL/SDA)
  - →MOTORパッドを(■)ESCの信号入力パッドへ

- (▲)レギュレータ
  - → (■)ESCの+-入力

- (■)ESC+-出力
  - → ツインモーターギヤーボックスの`FA-130`モーター

組み立ててなんやかんやした写真がこちらです

![IMG_4395.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/bdb7395a-12d9-6d11-4c42-4a3a4f8d5a80.jpeg)

![IMG_4396.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/b2b4e221-2028-138d-1dc3-310dce9456b4.jpeg)


組みつけた板もタミヤ製の[ユニバーサルプレート](https://www.tamiya.com/japan/products/70157/index.html)です。  
20*20mmのFCマウントホールを穴を使ってきれいに固定できました！  
その他パーツは適当に結束バンドで止めました。

## Ardupilotの設定

[前記事](https://qiita.com/keraFPV/items/c7811e8d5932f5a92396)でドローン作った時と大筋は変わりません。  
むしろモーター少ないし飛ばないから異常が起きて墜落するとかないし安全です。

### PC用設定ソフト

[Mission Planner](https://ardupilot.org/planner/index.html#home)

### ファーム書き込み

- 初回は、`.hex`ファイルをbetaflightなどのファームフラッシャーで書き込む
- アップデートは`.apj`ファイルをMission Plannerの`ファームウェアインストール Leg..`の`カスタムファームウェアの選択`より選んで書き込む
- ファームウェアは[ここ](https://firmware.ardupilot.org/Rover/)で配布されている(ローバー用)。アップデート時に個別のFC向けのファームウェアファイルをダウンロードしてくる
- 今回はOmnibus F4 Nano V6.1を使っているので、対象ファームは`OmnibusNanoV6`の名前の物を選んだ

### (事前知識)フルパラメータで扱うSERIALの番号について

- 0:USB
- 1～:各UART

### レシーバーの接続

- 予めBetaflightFCのパススルーなどでELRSを更新・プロポとレシーバーのバインドを済ませたレシーバーを使うと楽。  
  
ELRSレシーバーをFCにつなげる  
TX2/RX2にはんだ付けした場合、Mission Plannerでの設定手順は以下  

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `SERIAL2`の項目のツリーを開き、`SERIAL2_PROTOCOL`の値を`23`にする(レシーバーを付けてFC・レシーバーの電源を入れた場合、自動で設定されているので確認のみで良い。違ったら23が設定されているポートは`2`などにし、レシーバーのシリアルポートに本値`23`を入れる)
1. `SERIAL2`の項目のツリー内、`SERIAL2_BAUD`の値を`115`にする
1. `RC`の項目のツリーを開き、`RC_OPTIONS`の値をクリック。ダイアログが立ち上がり、`Use 420kbaud for ELRS protocol`と`Suppress CRSF mode/rate message for ELRS systems`を選択する(ほかのは選択を解除)
1. `RSSI`の項目のツリーを開き、`RSSI_TYPE`の値を`3`にする

[(参考)](https://www.expresslrs.org/quick-start/ardupilot-setup/)

### ラジオキャリブレーション(プロポからの信号範囲設定)

1. プロポの電源を入れ、レシーバーの電源をいれバインドされている状態にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `ラジオキャリブレーション`のメニューを選択
1. `ラジオキャリブレーション`のボタンを押す
1. 表示メッセージに従い、スティックを動かしてキャリブレーションする

### モードの選択スイッチの設定

モードの選択スイッチの割り当てを行う  

|モード名|説明|
|----|----|
|Hold|モーターを停止させるモード|
|Manual|スティック軸の値をそのまま出力して操縦するモード|
|Acro|自己位置のフィードバックをしながら操縦するモード|
|Guided|自律運転モード|

※レシーバーがバインドされ、Mission Planner上でプロポからの操作がFCで受け付けられていること

1. プロポの電源を入れ、レシーバーの電源をいれバインドされている状態にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `ラジオキャリブレーション`のメニューを選択
1. モード選択スイッチに割り当てたいチャンネル番号を、プロポのボタンを操作して特定する
1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `MODE_CH`の値を`割り当てたいチャンネル番号`にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `フライトモード`のメニューを選択
1. フライトモード選択スイッチを操作し、操作に応じてプルダウンメニューのフォーカスが移ることを確認する
1. 操作してフォーカスを移すことができるプルダウンより、割り当てたいフライトモードを選択する

### Armスイッチ設定

アーム/ディスアームはスロットル0+ヨー右5秒/ヨー左2秒でも行えるが、プロポのスイッチに割り当てることもできる

1. プロポの電源を入れ、レシーバーの電源をいれバインドされている状態にする
1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `ラジオキャリブレーション`のメニューを選択
1. アームスイッチに割り当てたいチャンネル番号を、プロポのボタンを操作して特定する
1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `RCn`(nはアームスイッチに割り当てたいチャンネル番号)のツリーを開き、`RCn_OPTION`の値を`153`にする

[RC_OPTION設定値の詳細](https://ardupilot.org/rover/docs/common-auxiliary-functions.html)

### スロットル設定

ドローンと違い、スロットル中立が停止で、上げて前進・下げて後進である

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ リスト`を開く
1. `RC3_TRIM`を`1500`にする

- RC3がスロットルである
- ドローン用プロポを(MODE2で)使っている人の場合は、プロポ側のモデル設定で、
  - ピッチをRC3
  - ロールをRC1
  - になるようにした方が操作が直感的で使いやすいかも

### (Option)バッテリーフェイルセーフ閾値の解除

電圧起因でのアーム不許可が嫌だったため、閾値を解除した。  
やらなくてもよい

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `フェイルセーフ`のメニューを選択
1. `電池`セクションの値を使用するバッテリーの電圧・容量に応じて調整する。
1. モード設定は`Hold`にすれば機体をその場に停止できる

(今回自分は、2S,3Sバッテリーを適当に使うので、上記設定はスキップした)

バッテリー電圧1次閾値を設定する  
アーム許可閾値、2次閾値は解除する

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ リスト`を開く
1. `BAT_ARM_VOLT`の値を`0`にする
1. `BAT_CAPACITY`の値を`使っているバッテリーの容量`にする
1. `BAT_CRT_VOLT`の値を`0`にする

### 必須ハードウェア-Accel Calibration

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`の`Accel Calibration`メニューを選択
1. `Calibrate Accel`ボタンを押す
1. ちょっと待つとボタンの下にメッセージが出てくる
1. メッセージに対応した姿勢にFCを傾け、`Calibrate Accel`ボタンの位置のボタンを再度押す
1. 次のメッセージが出てくるので、再度姿勢を変えてボタンを押す。最後まで繰り返す
1. キャリブレーションが完了する

- 姿勢の説明図は[ここ](https://ardupilot.org/rover/docs/common-accelerometer-calibration.html)を参照

### 必須ハードウェア-Servo Output

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`の`Servo Output`メニューを選択
1. 右モーター・左モーターの設定を行う。`ThrottleLeft`、`ThrottleRight`を設定する

![servooutput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3341104/e91ed987-0953-a8e8-743a-add7c037ebab.png)

公式ドキュメントではモーター`1`、`3`を対象にモーター左右を設定しているが、これはドローン用ESCレイアウトに従ったとき、後ろ2モーターを想定して言っている物と思われる  
ドローン用ESCを気にせずモーターを`1`、`2`につなげた場合、Servo Outputの対象は当然`1`、`2`となる

### ブラシモーターESC設定

今回はブラシモーターを使っているため、以下の設定を行う

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `MOT_PWM_TYPE`を`0`(Nomal)にする

### オプションハードウェア-モーターテスト

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `オプションハードウェア`のメニューを選択
1. `モーターテスト`のメニューを選択
1. スロットルを`30%`くらいにする
1. モーターCDのテストボタンを押し、モーターの位置と回転方向を整える(今回は`Skid-Steer Rover`形状のため、ABは使わない)

- 正解

|モーター|位置|用途|
|----|----|----|
|A|-|スロットル用(ステアリング+駆動輪の駆動輪の方)|
|B|ステアリング|ステアリング用(ステアリング+駆動輪のステアリングの方)|
|C|左|2モーターの回転方向によるステアリングを行う機体の左モーターを前進させる|
|D|右|2モーターの回転方向によるステアリングを行う機体の右モーターを前進させる|

- 位置が合わない場合

モーターのポートの割り当てを変更する(BetaFlightのリソースリマッピング相当)  
`必須ハードウェア-Servo Output`の1から4のFunction、`ThrottleLeft`、`ThrottleRight`のタブを選んで変更できる  

- 回転方向が合わない場合

`必須ハードウェア-Servo Output`の1から4のFunction、`ThrottleLeft`、`ThrottleRight`のReverseチェックボックスのon/offで回転方向を変更できる  

## デッドゾーンと回転方向

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `オプションハードウェア`のメニューを選択
1. `モーターテスト`のメニューを選択
1. スロットルを正方向に増やし、何%でモーターが始動するか？何%でギリギリモーターが動かないかを調べる。動かない%をメモする
1. スロットルを負方向に増やし、何%でモーターが始動するか？何%でギリギリモーターが動かないかを調べる。動かない%をメモする

### スロットルデッドバンドから最低値を設定する

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1. `MOT_THR_MIN`の値を動かない%に合わせるように上げる

### スロットル開放で、機体がまっすぐ進むように調整する

調べた%にズレがある場合、左右をトリムする

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `Servo Output`のメニューを選択
1. 各モーターの`Trim`の値をずらして調整する

### 必須ハードウェア-コンパス

コンパスのキャリブレーションを行う  
機体を手で持って回転させるため、ノートパソコンなどでやるとよい

1. Mission Plannerの上部メニュー`初期設定`をクリック
1. `必須ハードウェア`のメニューを選択
1. `コンパス`のメニューを選択
1. コンパスモジュールがリストに出現していることを確認
1. Onbord Mag Calibrationメニュー、`Fitness`を`Relaxed`に
1. `Start`ボタンを押下、ダイアログを閉じ、Mag1のゲージを貯める
1. ゲージのため方はAccel Calibrationの6姿勢それぞれで機体を縦を軸に360度回転させる(DJI機のキャリブレーションをイメージする)

- (機体を組み立ててから行う必要がある。FCの加速度計とコンパスの方向を関連付けてキャリブレーションをしているため。)

### その他パラメータ

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く

- `MOT_SLEWRATE`：モーター出力変化率の最大値。好みで増やす
- `ARMING_CHECK`：SET BITMASKでアーム時のチェック。Baro/Compass/INS/Parameter/Battery Levelがよいみたい(値:310)
  - が、自動航行より操縦重視であれば、やっぱりアームされないのが怖いので全OFFでいいかも(値：0)

## 走行！

- 機体の電源を入れ、平地に置く
- アームスイッチON
- スロットルを入力すると前後進
- ロールを入力すると左折・右折
- スロットル中立 & ロール入力でその場で回頭する

### 動いている様子の動画👇
https://youtu.be/2o_yFHDfrGk?si=sntGTCbtqSUKZooY

### プロポからの信号調整

スティック操作と逆に機体が動く場合

1. Mission Plannerの上部メニュー`設定/調整`をクリック
1. `フルパラメータ ツリー`を開く
1．`RCn`(nはスティック操作のチャンネル)の項目のツリーを開き、`RCn_REVERSED`の値を`1`にする

## 参考

- [配線概要(公式ドキュメント)](https://ardupilot.org/rover/docs/common-flight-controller-wiring.html)
- [ArdupilotのRoverで作成可能な車両形態(公式ドキュメント)](https://ardupilot.org/ardupilot/docs/common-all-vehicle-types.html)
  - 今回作成したのは`Skid-Steer Rover`
- [ブラシモーターに関して(公式ドキュメント)](https://ardupilot.org/copter/docs/common-brushed-motors.html)
- [モーター設定(公式ドキュメント)](https://ardupilot.org/rover/docs/rover-motor-and-servo-configuration.html)
- [基礎的なこと(DAYSCAPE様記事)](https://dayscape.jp/blogs/all-blogs/ardupilot-rover-make-1-tamiya-land-cruiser-40)
- [設定の画面例。イメージしやすかった(スプレッドナレッジ様動画)](https://youtu.be/KQ3OpY0cHF4?si=TU5EK-W9AwxsMws8)
- [FCのMOTORパッドはPMWポートである](https://blog.unmanned.tech/how-to-connect-motors-and-esc/)
  - よって、ブラシレスESC・ブラシESCどちらもつなげればモーターを動かせる
- [参考になるかも①](https://qiita.com/srs/items/2ab8f7f6e8371c6cfba4)
- [参考になるかも②](https://kazuki-room.com/how_to_start_automatic_operation_of_rover_with_pixhawk/)