Rover製作10 Ardupirotでバンパースイッチ、外付けステータスLEDの設定

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| OS | Windows10 |
| MissionPlanner | v1.3.80 |

| 項目 | 値 |
|:-:|:-:|
| Board| Pixhawk(v2.4.8) |
| Ardupilot | Rover V4.2.3 |

# 概要

ardupilotには外部スイッチ、外部LEDを追加で接続可能です。
ここでは押すとDisarmを行うバンパースイッチと、外付けステータスLEDを増設します。

![10_aux.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/e3eb68af-4afe-2f5f-2048-11e060a0ef2c.jpeg)

# 予備知識

## IOポート
Pixhawkのサーボレール（側面のサーボコネクタが多数並んでいるコネクタ）の一部のポートをGPIOとして利用することが可能です。Main1~8はPWM専用で、AUX1~6のみがGPIOとして利用できます。
AUX2~6はすでに駆動軸のエンコーダーように使っているために、AUX1に外付けステータスLED、AUX2にバンパースイッチを接続します。

## 外付けスイッチ
スイッチを押すとDisarmするようにします。ロボットが物に当たると移動が止まるバンパーセンサーに使えます。
Ardupilotにはbutton機能という、GPIOに接続されたボタンが押されたときに特定のアクションを起こすことが出来ます。実行できるアクションは[ardupilotのドキュメント](https://ardupilot.org/rover/docs/common-auxiliary-functions.html#common-auxiliary-functions)に一覧があります。
今回はバンパーに組み込み予定のマイクロスイッチを使い、アクションでDisarmをします。これで押すとモーターを停止する(=disarm)するボタンを実現できます。

## 外付けLED
pixhawkの表面にはフルカラーLEDが搭載されていて、モードなどによって色が変わります。筐体内にpixhawkを入れると色が見えなくなるので外部LEDを接続します。
今回はLEDはNeopixelの「WS2812B」を使います。amazonや秋月などでモジュールが良く売っています。

WS2812Bの入力電圧(Vcc)は3.5~5.3Vで、信号線のHi判定0.7Vccからになります。Pixhawkは5V給電ですが、ロジックは3.3Vです。このためPixhawkのHi出力3.3[V] < 3.5(=5.0x0.7)[V]となり、WS2812Bで正常にHiを認識できません
公式サイトではダイオードをかませて5Vの電源電圧を下げることが推奨されていますが、これだとノイズに弱く不具合が起る場合があります。
![led_convert1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/24aea772-53d1-edc2-3e03-2007702d95ba.png)

以下のようにレベル変換ICを挟むほうがより確実です。
![led_convert2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/92c77273-cd71-03c8-e69a-3a25da893e3b.png)

モジュールを2つ以上カスケード接続することもできます。最大30個のLEDまで接続できます(8個のLEDが入っているモジュール基板なら3ボードまで接続できます)。

# 事前条件

以下の機器が必要です。

* WindowsPC
    * MissionPlanner導入済み
    * 以下のPixhawkと接続可能なこと
* Pixhawk
    * 電源供給可能なこと
    * MissionPlanenrと接続可能なこと
* 分配基板用部材
* LEDモジュール(WS2812Bのアレイ基板)
* マイクロスイッチ(D2FW-G)

# 手順

## マイクロスイッチの接続

* マイクロスイッチのa接点（作動するとクローズになる）とPixahwkのGNDとAUX2のシグナルを分配基板経由で接続する。

![bumper_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/8961775b-104f-cd68-53bb-37546ed71777.png)

## スイッチのパラメーターの設定

* MissionPlannerにてArdupilotに接続して、以下のパラメーターを設定する。

|パラメーター名|値|説明|
|:--|:--|:--|
|SERVO10_FUNCTION|-1|AUX2をGPIOとして用いる|
|BTN_ENABLE|1|ボタン機能を有効にする|
|BTN_FUNC1|81|ボタンを押した時の機能はDisarm|
|BTN_OPTIONS1|2|bit1:InvertInputのみチェック（Hi->Loで機能）|
|BTN_PIN1|51|使用するピンはAUX2|

## Disarm動作の確認

* RCプロポ等を使ってArdupilotをARM状態にする。
* バンパースイッチを押して、Disarm状態に遷移することを確認する。

## 外付けLEDの接続

* LEDモジュールとPixHawkの電源、AUX1端子を以下のように分配基板経由で接続する。

![LED_modue_conection.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/442af4ba-f08a-2a75-e992-9fa2b95a8405.jpeg)

## 外付けLEDの設定

* MissionPlannerにてArdupilotに接続して、以下のパラメーターを設定する。

|パラメーター名|値|説明|
|:--|:--|:--|
|SERVO9_FUNCTION|120|AUX1(=Servo9)の設定はNeoPixel1|
|NTF_LED_TYPES|258|Internal ToshibaLED(2) + NeoPixel(256)|
|NTF_LED_LEN|24|NeoPixelで接続しているLEDの数|

* Pixhawkに電源を再投入する。

## 外付けLEDの確認

* 再起動後に、Pixhawk本体のLEDと同じ色で光ることを確認する

# 参考

[ardupilot buttons](https://ardupilot.org/rover/docs/common-buttons.html)
[ardupilot external LED](https://ardupilot.org/copter/docs/common-external-leds.html)
[ardupilot NeoPixel LED](https://ardupilot.org/copter/docs/common-serial-led-neopixel.html)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
[ROS2講座の目次へのリンク](https://qiita.com/srs/items/5f0d765343ca78f524ed)