TurtleBot3のOpenCRとモータを交換した

Docker/Kubernetesベースのクラウド上のAIプログラムに、ラジコン戦車や動くフィギュアを繋ぐプロジェクトを実施しています。その一環として、TurtleBot3を組み立てたのですが、作業ミスにより壊してしまいました。復旧に苦労しましたが、TurtleBot3に関する知識も得られたので、まとめておきます。

## TurtleBot3 概要
TurtleBot3は、[ROS (Robot Operating System)](http://www.ros.org/) のリファレンス・プラットフォームに指定されている自律移動ロボットです。一番安価なBurgerモデルは、制御系がRaspberry Piベースで、簡単に購入できます。

TurtleBot3 Burgerは、Ubuntu MATEとROSをインストールして使うRaspberry Pi、これにmicro USBで接続されたArduinoベースの制御ボード OpenCR(以下ボード)、ボードからのコマンドで操作できるインテリジェントモータ（以下モータ）、測距センサ等から構成されています。

## 失敗の経緯
組み立てて、電源スイッチを入れてもウンともスンとも言いません。まず、ボードのフューズが切れていることを発見しました。フューズは10Aの表面実装用のもので、交換すると、ボードは起動しましたが、モータが動きません。

調査の結果、ボードとモータが壊れており、それらを全交換することになりました。以下は、その過程で必要になった知識のまとめです。TurtleBot3のメンテナンスや、機能追加に利用していただけますと幸いです。

## ボード概要
CPUはARMで、ソフトウェア的にはArduinoベースです。ドキュメントは [こちら](http://emanual.robotis.com/docs/en/parts/controller/opencr10/) です。ここにあるArduino IDEをLinuxにダンロードすると、ボードのプログラムを設定したり、変更したりできるようになります。

## モータ概要
モータは、Dynamixel社のXL430-W250-Tモデルです。このモータの仕様説明は、[ベストテクノロジー社のページ](http://www.besttechnology.co.jp/modules/knowledge/?Dynamixel%20XL430-W250) がとても親切です。TTL I/Fと呼ぼれるシリアル・インタフェースでボードと接続されており、接続ソケットはGND、電源(11.1V推奨)、双方向信号線（信号レベル5V）の3ピン構成です。

このモータは、内部に[コントロールテーブル](http://www.besttechnology.co.jp/modules/knowledge/?Dynamixel%20XL430-W250#y4bb6b9b)とよばれるパラメータ表があり、外部からコマンドで書き換えられる構造になっています。モータをTurtleBot3で使うためには、いくつかのパラメータを初期化しておく必要があります。

### PCとの接続

このモータを、PCに接続して初期化や動作テストを行うにはいくつかの方法があります。

- [USB2Dynamixel](http://support.robotis.com/jp/product/auxdevice/interface/usb2dxl_manual.htm) - ROBOTIS社のインタフェース
- [BTE080](http://www.besttechnology.co.jp/modules/knowledge/?BTE080%20USB2TTL%20dongle) - ベストテクノロジー社のドングル（今回はこちらを使用しました。）

上記2つの方法でPCと接続した場合、モータに電源は供給されないようなので、別途電源線が必要です。

もう一つの接続方法は、OpenCRボードに、ドングルと同じ機能を果たさせるための [Arduinoプログラム](https://github.com/ROBOTIS-GIT/OpenCR/blob/master/arduino/opencr_arduino/opencr/libraries/OpenCR/examples/10.%20Etc/usb_to_dxl/usb_to_dxl.ino) をロードして使用する方法です。この接続方法の場合、電源も供給されます。また、この方法を用いた場合は、コントロールテーブルの設定が完了すれば、 [OpenCR Setup](http://emanual.robotis.com/docs/en/platform/TurtleBot3/opencr_setup/#arduino-ide) に従い TurtleBot3用のファームウェアをロードして、TurtleBot3として通常使用が可能な状態にすることができます。

### コントロールテーブルの初期化

いずれかの方法でモータをPCに接続した後、Windows PC用の管理ソフト [R+ Manager2.0 light](http://support.robotis.com/en/software/roboplus2/r+manager2/roboplus_manager2.htm) を使用すると、パラメータを個別に設定したり、動作テストを行わせたりできます。

モータをTurtleBot3で使うためには、コントロールテーブルを以下の値に設定する必要があります。

| Address | Item | Value (ID1) | Value (ID2) |
|:---:|:---:|:---:|:---:|
| 64 | Torque | 0 | 0 |
| 7 | ID | 1 | 2 |
| 8 | Baudrate | 3(1Mbps) | 3(1Mbps) |
| 10 | Drive Mode | 0(Normal) | 1(Reverse) |
| 11 | Operating Mode | 1 | 1 |

前述の R+ Manager を利用せずに初期化を行う方法として、ボードで動くユーティリティ [TurtleBot3 Setup Dynamixels](http://emanual.robotis.com/docs/en/platform/TurtleBot3/faq/#TurtleBot3-setup-dynamixels) があります。しかし、Arduinoのランタイムライブラリのバージョンと合わず、プログラム自体が正常に動作しませんでした。

モータのコントロールテーブルの設定を終えたら、TurtleBot3は正しく動作しました。動作確認は、TurtleBot3 e-Manualの [Basic Oparation - Hardware Setup](http://emanual.robotis.com/docs/en/platform/TurtleBot3/hardware_setup/#basic-operation) や、[Keyboard - Teleoperation](http://emanual.robotis.com/docs/en/platform/TurtleBot3/teleoperation/#keyboard) にて行ました。

## 失敗の原因
冷静に考えてみると、モータとボードの間の接続ケーブルでは、12Vを供給する電源線と、5Vで動く信号線が隣り合っています。ボード側のソケットのところでは配線パターンがむき出しになっているので、誤って2つの線につながる回路をショートさせると、このような悲劇が起き得ます。今回は、このような事故で、信号線の両端となるモータとボード双方の信号回路が壊れたのだと思います。だれのせいにもできないので、皆さんも十分注意しましょう。