本製品はDynamixelを扱うにあたり基本的な事項を把握する事を目的としたキットです。別途PCを用意するだけで、Dynamixelを運転する最低限の装置が一通り揃います。
PCをホストとしたプログラムによってDynamixelへの理解が進めば、Arduinoによる組み込みプログラミングにチャレンジしたり、Dynamixelを追加して自身のアプリケーションに組み込むといった事が可能です。
なおArduino UNOのUSBシリアル変換機能(主にATmega16U2を使用してるもの)はDynamixelとの通信に支障が生じる事がわかっているため、本製品ではFTDI社のUSBシリアル変換チップを使用しているNerOを採用しています。
型式等 | 数量 | 備考 |
DXSHIELD | 1 | BTE074B |
Arduino UNO互換機 | 1 | NerO-SP1 |
HOLDER TYPE UNO | 1 | X000018 |
Arduinoリセット回避基板 | 1 | Arduinoリセット回避基板(E197) |
Dynamixel | 3 | XL430-W250-T |
USBケーブル | 1 | type A <-> micro B |
ACアダプタ | 1 | IN:AC100~240V, OUT:DC12V/3A |
NerOに限らずArduinoはUSBシリアルI/Fを装備しており、シリアルデータの送受信信号の他にハードウェアフロー制御信号がArduinoのリセット端子に接続されています。主にArduino IDEからArduinoへプログラムを転送する前にATmega328Pをリセットさせる目的で備わっていますが、このハードウェアフロー制御信号は意図的なコードによる制御で変化する以外にも、USBケーブルの抜き差しや仮想COMポートのオープンだけでも変化するため、Arduinoでは暫し嫌われます。
USBシリアル変換チップとATmega328Pのリセット端子間に挿入されている直列コンデンサを取り外す事でハードウェアフロー制御信号によるリセットを抑止する事ができますが、プログラムを転送する度に再度コンデンサを装着するのは面倒です。
そこでコンデンサを取り外していても再びハードウェアフロー制御信号を用いてリセットできるようにするための基板(E197)を用意しました。回路は以下の通りとても単純です。
本基板をArduinoのISP端子に装着し、コンデンサを取り外した空きパターンにリード線をつないて使用します。結果的にジャンパの挿抜のみでコンデンサが装着された状態と取り外した状態を作り出します。
基本的にDXSHIELDのマニュアルに記載されている使用方法と同等ですが、改めて要点を紹介します。
各運用条件に共通する装置の接続を以下に示します。
なおNerOに備わっているDCジャック(CN2)は使用しません。またHOLDER TYPE UNOはNerOの端子が不用意に導電性のものに接触する事の無いよう必要に応じて使用します。
PCからNerOに搭載されたUSBシリアル通信機能を中継し、最終的にDXSHIELDのTTL/RS-485 I/Fを介してDynamixelを制御します。
まずNerOのCPUには何も仕事をさせないための設定を行っておく必要がありますが、 Arduino IDEにて以下のようなデフォルトで生成されるコード(GPIOやUARTを一切初期化や使用をしないスケッチ)を使用します。
void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
コンパイルができたらDXSHIELDをソフトウェアシリアルモード(SW1をSOFTの位置)に切り替えてからNerOに書き込みます。
書き込んだらDXSHIELDをパススルーモード(SW1をTHROUGHの位置)に切り替えます。
最後にNerOのISPコネクタに装着された基板(E197)のジャンパピンを取り外します。これによりUSBポートからNerOをリセットする事ができなくなるため、USBポートのオープンと連動したNerOのリセットを防ぐ事ができます。
特にDYNAMIXEL WizardはScan中のボーレートの切り替わるタイミングでもNerOをリセットさせてしまうため、この措置は必須となります。
なおジャンパピンは無くさないようくれぐれも注意してください。
これ以後NerO+DXSHIELDはDynamixel用のTTL/RS-485 I/Fボードかつ電源分配装置としてのみ機能し、操作の主役はPCに委ねられます。
概ねDYNAMIXEL basic tutorialに記載された運用ができます。
なお同梱されるDynamixelはいずれも出荷時の状態(ID=1, Baudrate=57600bps)となっています。複数台を同時に運用する場合は、個々のDynamixelのIDを異なる値に設定してから使用してください。
またNerOに装備されたUSBシリアル変換チップの最大通信速度は3Mbpsとなりますので、この値を超えた運用はできません。
NerOに書き込んだプログラムによってDynamixelを制御します。Dynamixelとの通信に使用するNerOの端子によって2つのモードを用意していますが、いずれも何らかの制約が生じます。UARTを1チャネルのみ内蔵しているATmega328Pであるが故に致し方ないところです。
またNerOのISPコネクタに装着された基板(E197)のジャンパピンが取り外されていると、Arduino IDEからプログラムを書き込む事ができません。書き込む前には必ずジャンパを装着しておきます。
なお本ジャンパが挿入されていると、NerOにUSBケーブルを接続したりPCからポートをオープンするタイミングでNerOは必ずリセットされます。NerOにプログラムが書き込まれた状態でそれらの操作によってNerOが再起動してしまう事が運用上問題になるのであれば、最終的にジャンパを外しても構いません。
NerOのIO8・IO9ピンを用いてDynamixelと通信するモードです。NerOのUARTはシリアルモニタ等の任意の目的で自由に使えますが、DynamixelとはGPIOのON/OFFをタイミングを見計らいながら通信の処理を行うため、他の割り込みの影響を受けて正しい送受信が行えなかったり通信速度が上げられない等の弊害が生じます。
SW1を図の位置(SOFT)に切り替えます。
本設定によりNerOのデジタル入出力端子のうちIO8とIO9をソフトウェアシリアル用の端子として使用するため、この2つの端子は他の目的で使用してはなりません。
またNerOへプログラムを転送する際は、無条件に本モードに変更しておかないと転送に失敗します。
NerOのIO0・IO1ピンを用いてDynamixelと通信するモードです。UART端子はNerOのUSBシリアル通信に接続されていますが、USBシリアル通信を犠牲にしても高速かつ安定したDynamixelとの通信を行いたい場合に選択します。
SW1を図の位置(HARD)に切り替えます。
本設定を行った後には、Dynamixelとの通信以外にIO0・IO1ピンとUSBシリアル通信機能を使用する事ができなくなります。シリアルモニタが使えないため、Serial.printの類を使用したデバッグができません。
なおスケッチをコンパイルして描き込む際は、本設定が電気的にUSBシリアル通信機能に影響を及ぼすため、その都度ソフトウェアシリアルモードに切り替える必要があります。
NerOはArduino UNO互換ですので、Dynamixel Library for Arduinoが利用できます。Arduino IDEにてNerOをホストとしたコーディングを行う場合の詳細はそちらを参照してください。
最新のGCC Developer LiteはArduino UNOをターゲットとしてサポートしています。UARTとDynamixel Libraryのみですがライブラリを同梱していますので、これらを用いてDynamixelを制御するプログラミングが可能です。
Arduino IDEで提供されるArduino用のライブラリは一切含まれていませんので、他のAVRマイコンボードシリーズと同様の扱いとなります。
大まかな使用方法は以下の通りです。
テストがてら次のようなプログラムを作りました。詳細はライブラリのソースを参考にしてください。
- TIMER2を割り込みなしでwait(ミリ秒待ち)とtickcount(実行時間測定)を作成
- プロトコルV2のサフィックス処理のいじわるテスト含む
- GDLに同梱のDX2LIBはクラス化されていないのでC言語でも利用可
- 初期化方法がDynamixel Library for Arduinoとは異なりDX2_Openを使用
- DX2_Openの引数であるTDX2Host_ConfParamにはポートの初期化・指定バイト数受信・受信バッファクリア・指定バイト数送信の4つのUART関連の関数を定義
- ソフトシリアルの場合は1Mbps固定とする(ライブラリのバグの都合)