Rover製作04 ArdupirotにXBeeで接続する

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

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

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

# 概要
ここまでUSBケーブルでPC-Pixhawkを接続してきました。今後機体を動かしながら調整するにあたり、無線でMissionPlannerで接続した方が便利です。無線の形式は色々ありますが、ここではXBeeを使います。

![04_xbee.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/beae0c1e-4d1c-524b-e37e-229e73f285c8.jpeg)

# 予備知識

## XBee

海外サイトでPixhawkとセットでテレメトリー無線が多々販売されていますが、技適対応品かが怪しいです。XBeeなら秋月電子などで技適対応品が販売されています。
XBeeはメジャーな無線通信モジュールです。ZigBeeという通信規格を使っています。ZigBee自体はメッシュネットワーク等高度な機能がおおいのですが、ここではただUART通信を無線化する用途で使います。XBeeそれぞれにはユニークなIDが振られていて、2つのXBeeにそれぞれ相手のIDを書き込むことで相互通信ができます。

XBeeの設定をするWindowsソフトが「XCTU」です。これを使って2つのXBee同士のペアリングなどを行います。
またXBeeは2mmピッチのDIPコネクタという独特なコネクタをしています。USB&2.56mmピッチ変換基板を用意する必要があります。以下の物が良く売っていて安いので使います。(USB-mminiBコネクタなのが玉に瑕ですが...)
![XBeeアダプター.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/68094f65-bfe7-f8ca-a38c-144e5d05a81b.jpeg)

Xbeeの無線HWでのbaudrateはドキュメントの記載では「250kbps」と記載されています。安定してUART通信するためには、XbeeのUARTのbaudrateをその1/5程度に設定するのが良いかと思います。

# 事前条件

以下の機材が必要です。

* WindowsPC
* pixhawk
* USBA-microBケーブル
* USBモバイルバッテリー
* XBeeS2C x2
    * それぞれに「cordinator」、「rooter1」というラベル貼って、容易に区別できるようにすることを推奨
* XBeeシリアルアダプター x2
* USB-miniBケーブル x2
* pixhawk-Xbeeアダプターケーブル用の部材
    * ケーブル（AWG26推奨）
    * PHコネクタ(5Pハウジングx1、ピンx5)
    * 2550コネクタ(5Pハウジングx1、ピンx5)

# 手順

## XBeeIDの確認

* 「cordinator」、「rooter1」のそれぞれのXBeeについて、裏のラベルの「MAC」の項の値をにメモする（後々の設定に使う）。 

![XBee_mac.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/450f93f1-d78d-6073-c3a9-d27c7c78189a.jpeg)

## XCTUのインストール

* windowsPCにて、[XCTUダウンロードページ](https://hub.digi.com/support/products/xctu/)の下方の「XCTU v.X.X.X Windows x86:x64」をダウンロードする。
* ファイルを開き画面の指示に従ってインストールをする。

## 「cordinator」のXBeeの接続・設定

* 「cordinator」のXBeeを変換基板に乗せて、WindowsPCとUSB接続する。
* XCTUを起動する。

![XCTU1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/d94460f0-ce50-7574-5f78-c60a253c892b.png)

* 左上の「Add device」を押す。
* 出現した「Add radio device」デバイス選択ウィンドウで以下の操作をする。
    * 「Resfresh ports」を押す。
        * 「Select the Serial/USB port」の下に接続したデバイスが表示される。
    * 「Baud Rate」で「9600」を選択する。
    * 「Finish」を押す。

![XCTU2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/67fb7976-a06c-0c81-7cb9-8d877fc4ac44.png)

* 以下のようにデバイスが追加されたことを確認する。
* 画面右の「Radio Configuration」でパラメーターを選択する。以下の表の「#1」の値を選択する。
* パラメーターの選択後「Write」ボタンを押す。

![XCTU3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/58e53235-7159-3610-40cf-69811d3808dd.png)

|項目|#1|#2|説明|
|:--|:--|:--|:--|
|ID(Pan ID)|1234|←同じ|ネットワークのIDで2つで同じ値にする必要がある|
|JV (Channel Verification)|Enabled[1]|←同じ|接続channelにかかわる設定|
|CE Coordinator Enable|Enabled[1]|Disabled[0]|片方だけをEnableにします。|
|DH (Destination Address High)|#2のSH|#1のSH|相手のアドレスの上位8桁|
|DL (Destination Address Low)|#2のSL|#1のSL|相手のアドレスの下位8桁|
|NI (Node Identifier)|cordinator|rooter1|任意の両者を区別するための値（Option）|
|BD (Baud Rate)|57600[6]|←同じ|シリアル接続IFのbaudrate|
|D7 (Pon 12 - DIO7/nCTS Configuration)|Disabled[0]|←同じ|CTS信号を無効にします|

## 「router1」のXBeeの接続・設定

* 「cordinator」の時と同じように「router1」のXBeeをXCTUと接続します。
* 同様にパラメーターを書き込みます。この時に上表の#2の値を設定します。

## XBee同士の導通確認


* 「cordinator」のXBeeをXCTUと接続して、シリアルターミナルの設定をする。
    * 「cordinator」のXBeeをWindowsPCに接続する
    * XCTUを起動する
    * 「Add device」の操作をする。
    * 右上のボタンで「(1)ターミナルモード」を選択する。
    * ウィンドウ中の「(2)Open」ボタンを押す。
    * 「Send packets」内の「(3)＋」ボタンを押す。
    * 出てくるウィンドウに適当な文字列を入れる。
    * 「(4)Send selected packet」を押すことで実際にUARTにデータが送信される。
        * まだこの段階では受信側がいないので、効果は起こらない
* 「router1」のXBeeをXCTUと接続して、シリアルターミナルの設定をする。
    * 「router1」のXBeeをWindowsPCに接続する
    * 「cordinator」と同様にXCTUを設定をする。
* 通信確認を行う
    * 片方のXCTUのウィンドウで文字の送信をすると、もう1つのXCTUのウィンドウで受信をすることを確認する。

![XCTU4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/7fff3f8c-042f-5d26-7981-a910366868d3.png)

## XBee-Pixhawkの接続ケーブル作成

* 以下の接続でXBeeアダプターとpichawkの接続をするケーブルを作成する。長さは15cmあれば十分。
    * XBeeアダプター側のピンは、アダプター上の表示を確認して合わせる。
    * pixhawkのコネクタは種類があるが、一番メジャーなものがmolexのPicoblade仕様のもの。
        * このPicobladeコネクターはハウジングのピンをひっかける穴がある方を見て**右から1ピン**となる（ヒロセコネクタとは逆なので注意）。

|#|pixhawk側||#|XBeeアダプター側|
|:--|:--|:--|:--|:--|
|1|VCC||1|VCC|
|2|TX(OUT)||3|TX(IN)|
|3|RX(IN)||4|RX(OUT)|
|4|CTS||5|RST|
|5|RTS||-|---|
|6|GND||2|GND|


## Ardupilotの通信設定

* XBee関連の接続はすべて解除する
* WindowsPCとPixhawkをUSBケーブルで接続する。
* MissionPlannerを起動して、Pixhawkと「接続」する。
* MissionPlannerで「設定/調整」->「パラメーターツリー」から以下のパラメーターを設定します。
    * 注：これらのパラメーターを反映するにはpixhawkの再起動が必要

|パラメーター名|値|説明|
|:--|:--|:--|
|BRD_SER1_RTSCTS|0|rtsピンを用いたフロー制御を無効にします|
|SERIAL1_BAUD|57(デフォルト)|57600bps|

## XBee経由でのMissionPlannerの接続の確認

* WindowsPC側の操作
    * WindowsPCとPixhawkを接続しているUSBケーブルを抜く。
    * WindowsPCとXbeeの片方をUSBケーブルで接続する。
    * MissionPlannerを立ち上げる。
    * MissionPlannerの右上のポート指定でXbeeとつながっているポートを選択する。
    * baudrateで「57600」を指定する。
    * 「接続」を押す。
* Pixhawk側にの操作
    * PixhawkにXbeeを接続する。
    * PixhawkのUSBにモバイルバッテリーをつなげて電源供給をする。
* MissionPlannerでArdupilotとの接続がされていることを確認する。

※ 筆者の環境ではPixhawkの電源ON -> MissionPlannerで「接続」の順番では接続が確立しないことが多いです。

# 参考
[pixhawkのコネクタ事情](https://www.lambdrive.com/depot/Robotics/Controller/PixhawkFamily/Connector/index.ja.html)

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