ショップページへ
概要
DXSHIELDはDynamixelシリーズと通信するためのI/F(RS-485・TTL)をArduinoに増設するシールドで、各I/F用のコネクタに電源を分配する機能も合わせ持ちます。
また、DXSHIELDのI/Fで通信できるデバイスであればいずれも適用可能です。
仕様
同梱内容
基本仕様
品番 | BTE074 |
PCBリビジョン | E133B (2層) |
動作温度範囲 | 0~60℃ 結露なきこと |
外形寸法 | 約52x53x14.5mm (ピンヘッダ除く) |
重量 | |
電源 | CN1:DC6~24V (Dynamixelが要求する電源) 内部ロジック:DC5V±5% (Arduinoより供給) |
コネクタ等 | E133B版 JST B2PS-VH x1 JST B4B-EH x5 JST B3B-EH x5 E133版 JST B2PS-VH x1 molex 22-03-5045 x5 molex 22-03-5035 x5 |
各I/F仕様 | RS-485 | 複信 半二重 最大通信速度 2Mbps 最大ノード数 256台 ESD保護 ±15kV ターミネータ装備済 |
TTL | 複信 半二重 最大通信速度 2Mbps ESD保護 ±2kV 信号ラインは47kΩにてプルアップ済 |
内部簡略ブロック
外観・レイアウト
※出荷時にピンヘッダは未装着
回路図
各機能詳細
J1,J5
- 2.54mmピッチ 10ピンシングルラインヘッダ用ランド
- 相互に並列接続
- Arduinoと接続する際はJ1に任意のヘッダを装着
Pin No. | Name | Connected |
1 | IO8 | yes |
2 | IO9 | yes |
3 | IO10/SS | no |
4 | IO11/MOSI | no |
5 | IO12/MISO | no |
6 | IO13/SCK | no |
7 | GND | yes |
8 | AREF | no |
9 | AD4/SDA | no |
10 | AD5/SCL | no |
J2,J6
- 2.54mmピッチ 8ピンシングルラインヘッダ用ランド
- 相互に並列接続
- Arduinoと接続する際はJ2に任意のヘッダを装着
Pin No. | Name | Connected |
1 | IO0/RX | yes |
2 | IO1/TX | yes |
3 | IO2 | no |
4 | IO3 | no |
5 | IO4 | no |
6 | IO5 | no |
7 | IO6 | no |
8 | IO7 | no |
J3,J7
- 2.54mmピッチ 8ピンシングルラインヘッダ用ランド
- 相互に並列接続
- Arduinoと接続する際はJ3に任意のヘッダを装着
Pin No. | Name | Connected |
1 | | no |
2 | IOREF | no |
3 | RESET | no |
4 | 3V3 | no |
5 | 5V | yes |
6 | GND | yes |
7 | GND | yes |
8 | Vin | yes |
J4,J8
- 2.54mmピッチ 6ピンシングルラインヘッダ用ランド
- 相互に並列接続
- Arduinoと接続する際はJ4に任意のヘッダを装着
Pin No. | Name | Connected |
1 | AD0 | no |
2 | AD1 | no |
3 | AD2 | no |
4 | AD3 | no |
5 | AD4/SDA | no |
6 | AD5/SCL | no |
JP1
- 2.54mmピッチ2ピンヘッダ用ランド
- DXSHIELDの電源をArduinoの外部電源として供給
- ショート:CN1に接続された電源をArduinoのVinに分配
CN1に供給する電圧はArduinoのVinが許容する電圧範囲を守ること
- オープン:CN1に接続された電源とArduinoのVinを切断
CN1とArduinoのVin各々に電源を供給するか、USBバスパワーで動作するArduinoであればPCとArduinoをUSBケーブルで常時接続すること
| JP1をショートした状態でArduinoのVinから電源を供給してはならない。 CN2~CN11の電源が弱いJP1を介して供給されるため、使用デバイスの負荷条件によってはジャンパや基板が損傷する。 |
| JP1をショートした状態でCN1とArduinoの外部電源に各々個別の電源を供給してはならない。 電源や負荷の条件によってJP1に過電流が流れると、ジャンパや基板が損傷する。 |
SW1
- 3Tスライドスイッチ
- シリアル通信に使用するArduinoの送受信端子を3パターンから選択
- 詳細はこちら
CN1
| 電源の逆接続は電源回路の即時破壊・全損扱いとなる。 |
CN2~CN6
- Dynamixel用
- JST B3B-EH
- TTL I/Fを搭載したDynamixelシリーズ用のコネクタ
- SIGNAL端子は47kΩの抵抗を介して内部の5V電源へプルアップ済
- 5つのコネクタはいずれも内部で並列に接続
- TTL I/Fと電源は以下の端子に接続
端子番号 | 信号名 |
1 | GND |
2 | VDD |
3 | SIGNAL(BIDIRECTION) |
- B3M/KRS用
- ピンヘッダ
- KONDO KRSシリーズ用のコネクタ
- SIGNAL端子は47kΩの抵抗を介して内部の5V電源へプルアップ済
- 5つのコネクタはいずれも内部で並列に接続
- TTL I/Fと電源は以下の端子に接続
端子番号 | 信号名 |
1 | SIGNAL(BIDIRECTION) |
2 | VDD |
3 | GND |
CN7~CN11
- Dynamixel用
- JST B4B-EH
- RS-485 I/Fを搭載したDynamixelシリーズ用のコネクタ
- D+/D-間にターミネータ装備
- 5つのコネクタはいずれも内部で並列に接続
- RS-485 I/Fと電源は以下の端子に接続
端子番号 | 信号名 |
1 | GND |
2 | VDD |
3 | RS-485 D+ |
4 | RS-485 D- |
- B3M/KRS用
- JST B4B-XH
- RS-485 I/Fを搭載したKONDO B3Mシリーズ用のコネクタ
- D+/D-間にターミネータ装備
- 4つのコネクタはいずれも内部で並列に接続
- RS-485 I/Fと電源は以下の端子に接続
端子番号 | 信号名 |
1 | GND |
2 | VDD |
3 | RS-485 D+ |
4 | RS-485 D- |
ユーザランド
- 2.54mmピッチランド
- 工作用
- 5V0のシルクの囲みはArdunioから供給される5V、GNDのシルクの囲みはGNDに接続済
それ以外のランドはフリー
使用方法
対応するデバイス
I/F | Device Name |
TTL | Dynamixel AX・MX(TTL版)・XLシリーズ全般, DXMIO(TTL), ToFセンサ(TTL) |
RS-485 | Dynamixel DX・RX・EX・MX(RS-485版)・XM・XH・PROシリーズ全般, UD3, UD3.5, USS3, DXMIO(RS485), ToFセンサ(RS485) |
要求される電源電圧が同じであれば、I/Fを問わず同時に使用することが可能です。
接続方法
ここでは予めJP1~JP4にピンヘッダが装着されているものとします。
- ArduinoにDXSHIELDをスタックさせる。その際に両基板のピンヘッダ以外が物理的に接触していないこと。他のシールドを同時に使用する際は、DXSHIELDが使用済みの端子に十分配慮しておくこと。
- Dynamixelのコネクタと同じDXSHIELD上のコネクタ同士を接続する。DXSHIELDにはTTL・RS-485 I/F共に各々5個のコネクタが装備されているが、I/Fの種類が一致してさえいればどのコネクタを使用しても構わない。
- DXSHIELDのCN1にDynamixelが要求する仕様の電源を供給する。この時絶対に電源の極性を間違えてはならない。
- DXSHIELDのJP1がオープンの場合はArduino本体への電源供給が必要なため、別途USBケーブルやACアダプタをArduinoへ接続して電源供給する。
DXSHIELDのJP1がショートの場合はCN1からの電源がArduinoへも分配されるので、別途ArduinoへACアダプタを使って給電する必要がない。
モード選択
Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDをArduino UNOに装着して使用する前提として3つのモードを説明します。
ソフトウェアシリアルモード
ArduinoのIO8・IO9ピンをソフトウェアシリアルで構成しDynamixelを制御するモードです。ArduinoのUSBシリアル通信機能(ハードウェアシリアル)はDynamixelの制御以外の目的に使用できます。
Arduinoには任意の端子をシリアル通信の送受信端子として使用するSoftwareSerialライブラリが用意されています。あまり高速な通信には向きませんが、57600bps程度であれば十分実用レベルです。
SW1を図の位置(SOFT)に切り替えます。
本設定によりArduinoのデジタル入出力端子のうちIO8とIO9をソフトウェアシリアル用の端子として使用するため、この2つの端子は他の目的で使用してはなりません。
また、Arduinoにユーザのスケッチを転送する際は、無条件に本モードに変更しておかないと転送に失敗します。
ハードウェアシリアルモード
ArduinoのIO0・IO1ピンをハードウェアシリアルで構成しDynamixelを制御するモードです。USBシリアル通信機能を犠牲にしても高速かつ安定した通信を要求する場合にの設定です。
予めソフトウェアシリアルモードにおいてライブラリによる制御の理解が得られ、スケッチの書き込み時以外にUSBシリアルによる通信を必要としない場合に本設定を選択します。
SW1を図の位置(HARD)に切り替えます。
本設定を行った場合は、自身のスケッチでSerialライブラリを使用してはなりません。また、IO0・IO1ピンとUSBシリアル通信機能は他の目的で使用する事ができません。
なお、スケッチをコンパイルして描き込む際は、本設定が電気的にUSBシリアル通信機能に影響を及ぼすため、その都度ソフトウェアシリアルモードに切り替える必要があります。
USBパススルーモード
Arduinoに搭載されたUSBシリアル通信機能を用いてPCなどからDXSHIELDをDXHUBライクに直接使用するモードです。Dynamixelの内部パラメータの変更や制御をPCから行う場合は本設定を行います。
まずArduino IDEにてデフォルトで生成されるコード(コードとしては意味を持たない無限ループするだけのスケッチ)をコンパイルし、予めArduinoに書き込んでおきます。このほぼ空のスケッチはDigital I/Oやシリアル通信を使用しないため、PCとDynamixel間の通信を阻害しません。なお、これに該当する独自スケッチであればこの限りではありません。
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
DXSHIELDをソフトウェアシリアルモードに設定してこの何もしないスケッチを書き込んだ後、USBパススルーモードにします。
SW1を図の位置(THROUGH)に切り替えます。
なお、ArduinoのUSBシリアルを担っているAVRに書き込まれているファームウェアの都合で、大きなデータを連続で送受信する事ができません。これはプロトコルV1を装備するDynamixelシリーズであれば概ね問題はありませんが、プロトコルV2を装備するDynamixelシリーズではこの問題が露見しやすくなります。
また、ArduinoのUSBシリアルとRoboPlus等との相性もよろしくないので、本モードを積極的に使用する事は推奨しません。
ソフトウェア
Dynamixel Configurator, RoboPlus
DXSHIELDをUSBパススルーに設定にする事で、Dynamixelのコントロールテーブルの状態をモニタしたりパラメータの変更や動作確認を簡便に行うソフトウェアであるDynamixel Configuratorが利用できます。
公開されているバージョンはWindows版のみとなります。
Dynamixel Configuratorの詳細はこちらにて。
またROBOTIS社提供のRoboPlus 1.0とRoboPlus 2.0が使用できます。
なお、ArduinoのUSBシリアル通信機能は過度なトラフィックがかかるとデータがドロップすることが頻繁に発生するようです。
Dynamixel Library for Arduino
Dynamixelを制御するためのプログラムを作成する際のライブラリを提供します。Arduino IDEにライブラリをインストールして使用します。
PC版DYNAMIXEL Protocol 1.0/2.0 Libraryと同様にコントロールテーブルへの読み書きを行うAPIを用意しています。なおAVRではメモリの都合からV1.5から追加されたライブラリは使用できないのと、クラスのインスタンス化の際の引数が以前のバージョンから大幅に変更されている点に注意が必要です。
- ライブラリのダウンロード
-
- 定義の修正を行ったため一部β版との互換性なし
- Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる8つのハンドラを新たに設置
- Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供
- AVRを除くターゲットに適用した場合、PCやARM系マイコン用に提供しているDXLIBに追加されたAPIが使用可能
詳細は追って公開
- 仕様変更に伴うサンプルプログラム修正
-
- チェックサムの検証を厳密化
- 新たにReadBlockDataとWriteBlockData関数を追加し、コントロールテーブルの読み出し及び書き込みはこの関数を介するように変更
- プロトコルV2の例外時(0xFF 0xFF 0xFDの並びでデータが現れた場合に末尾に0xFDを付与)の処理を全ての関数へ適用(一部制約あり)
- コンパイル時のwarningを抑止
- 多少サンプルプログラムの構成を変更
- Win版dxlibからアイテムのアドレスをマクロ定義したヘッダをコピー
-
- dxlib.cppのハードウェアシリアルポートの初期化不足修正
-
- Dynamixel Protocol V.2に対応
- 低位の送受信関数追加
- 32bitデータの送受信関数追加
- アドレスとサイズに関する引数は全て16bitに統一
DXLIBのインストールは、ArduinoのIDEの「スケッチ→ライブラリのインクルード→.ZIP形式のライブラリをインストール...」メニューを使用してダウンロードしたZIPファイルを選択するだけです。
インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。
DXLIB v1.5以降で使用できるヘッダファイルとAPIは以下の通りです。
- dxlib.h
DYNAMIXEL Communiation Protocol 1.0対応デバイスを対象とする場合、dxlib.hをスケッチにインクルードする事でDXLIBクラスが利用できるようになります。dx2lib.hとの共存は想定していません。
#include <dxlib.h>
#include "avr_uno_softserial.h"
const DXLIB::TDXHost_ConfParam param {
us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush
};
DXLIB dxif ((DX2LIB::TDXHost_ConfParam *)¶m);
void setup() {
dxif.begin (57600);
}
- dx2lib.h
DYNAMIXEL Communiation Protocol 2.0対応デバイスを対象とする場合、dx2lib.hをスケッチにインクルードする事でDX2LIBクラスが利用できるようになります。dxlib.hとの共存は想定していません。
#include <dx2lib.h>
#include "avr_uno_softserial.h"
const DX2LIB::TDXHost_ConfParam param {
us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush
};
DX2LIB dxif ((DX2LIB::TDXHost_ConfParam *)¶m);
void setup() {
dxif.begin (57600);
}
- DXLIB/DX2LIB::TDXHost_ConfParam
ライブラリv1.5より導入された通信を担う8つの関数のポインタを保持する構造体で、クラスをインスタンス化する際に引数として渡します。
各メンバーの関数のプロトタイプに合わせた通信処理関数を予め作成しておく必要があります。
// Assuming HardwareSerial of Arduino UNO
#include <dx2lib.h>
// Initialize UART
uint32_t us_init (uint32_t baud) {
Serial.begin (baud);
Serial.setTimeout (20);
return baud;
}
// Terminate use of UART
void us_deinit (void) {
Serial.end();
}
// Changing the baudrate
uint32_t us_setbaudrate (uint32_t baud) {
us_deinit();
return us_init (baud);
}
// Purge receive buffer
void us_rxpurge (void) {
while (Serial.available()) Serial.read();
}
// Send one byte
void us_putc (uint8_t c) {
Serial.write (c);
}
// Send specified number of bytes
void us_puts (const uint8_t *buf, int len) {
Serial.write (buf, len);
}
// Receive specified number of bytes (Timeout must be set in advance)
int us_gets (uint8_t *buf, int len) {
return Serial.readBytes (buf, len);
}
// Waiting for transmission completion
void us_flush (void) {
Serial.flush();
}
// Enclose each communication function in a structure
const DX2LIB::TDXHost_ConfParam param {
us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush
};
DX2LIB dx2 ((DX2LIB::TDXHost_ConfParam *)¶m);
なおライブラリに同梱されるサンプルスケッチでは avr_uno_hardserial.h と avr_uno_softserial.h のヘッダファイルにArduino UNOを前提としたこれらの通信処理関数がまとめて記述してあります。
- DXLIB/DX2LIB (const PDXHost_ConfParam param)
ヘッダファイルに応じてDXLIBないしDX2LIBいずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体TDXHost_ConfParamを指定した上でオブジェクトを生成できます。
#include <dx2lib.h>
// Select SoftwareSerial
//#include "avr_uno_hardserial.h"
#include "avr_uno_softserial.h"
const DX2LIB::TDXHost_ConfParam param {
us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush
};
// Instantiate Dynamixel Protocol V.2 Library with the name dxif
DX2LIB dxif((DX2LIB::TDXHost_ConfParam *)¶m);
- void DXLIB/DX2LIB::begin (long baud)
ライブラリを使用可能にします。引数(baud)にはDynamixelに設定されたボーレートを指定します。
ボーレートの精度や範囲は使用するシリアルポートに依存します。
// Initialize dxif at 57143bps
void setup() {
dxif.begin (57143);
}
- bool DXLIB/DX2LIB::TxPacket (uint8_t id, uint8_t inst, uint8_t *param, uint16_t len)
指定されたID(id)・インストラクション(inst)・パラメータ(param)・パラメータ長(len)のインストラクションパケットを送信します。
// Send ping instruction packet to ID=1
dxif.TxPacket (1, 0x01, NULL, 0);
- bool DXLIB/DX2LIB::RxPacket (uint8_t *rdata, uint16_t rdatasize, uint8_t *rid, uint16_t *rlen, uint8_t *err)
ステータスパケットを受信します。成功するとパケット内のパラメータがrdataへコピーされ、そのパラメータのサイズがrlenに返されます。なお、ステータスパケットを受信するのに十分なサイズを確保し、そのポインタをrdataへ、サイズをrdatasizeに指定します。ridにはID、errにはDynamixelのエラーが返ります。
uint8_t buf[10], id, err;
uint16_t len;
// Send ping instruction packet to ID=1
dxif.TxPacket (1, 0x01, NULL, 0);
// Receive status packet
dxif.RxPacket (buf, sizeof (buf), &id, &len, &err)
- bool DXLIB/DX2LIB::ReadBlockData (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)
指定されたID(id)・アドレス(addr)から8ビットのデータをdataへlenの長さ分読み出します。errにはDynamixelのエラーが返ります。
なおDX2LIBで4バイト以上を読み出す場合、まずサフィックスが付与された状態でdataへ読み出し、その後に必要に応じてサフィックス削除が行われます。そのため実際に必要なサイズよりも大きめにdataを確保しておく必要があります(最大で1.34倍)。
// Get Compliance for AX-12 with ID=1
uint8_t compliance[4];
dxif.ReadBlockData (1, 26, &compliance, 4, NULL);
- bool DXLIB/DX2LIB::ReadByteData (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)
指定されたID(id)・アドレス(addr)から8ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
// Get the status of the LED on AX-12 with ID=1
uint8_t led;
dxif.ReadByteData (1, 25, &led, NULL);
- bool DXLIB/DX2LIB::ReadWordData (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)
指定されたID(id)・アドレス(addr)から16ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
// Get PresentPosition from AX-12 with ID=1
uint16_t ppos;
dxif.ReadWordData (id, 36, &ppos, NULL);
- bool DXLIB/DX2LIB::ReadLongData (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)
指定されたID(id)・アドレス(addr)から32ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
- bool DXLIB/DX2LIB::WriteBlockData (uint8_t id, uint16_t addr, const uint8_t *data, uint16_t len, uint8_t *err)
指定されたID(id)・アドレス(addr)・8ビットのデータ(data)・指定バイト数(len)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
// Set Compliance for AX-12 with ID=1
uint8_t err;
uint8_t compliance[4] = {1,1,32,32};
dxif.WriteBlockData (1, 26, &compliance, 4, &err);
- bool DXLIB/DX2LIB::WriteByteData (uint8_t id, uint16_t addr, uint8_t data, uint8_t *err)
指定されたID(id)・アドレス(addr)・8ビットのデータ(data)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
// Lights up the LED of AX-12 with ID=1
uint8_t err;
dxif.WriteByteData (id, 25, 1, &err);
- bool DXLIB/DX2LIB::WriteWordData (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)
指定されたID(id)・アドレス(addr)・16ビットのデータ(data)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
// Set GoalPosition of AX-12 with ID=1 to 511
dxif.WriteWordData (id, 30, 511, NULL);
- bool DXLIB/DX2LIB::WriteLongData (uint8_t id, uint16_t addr, uint32_t data, uint8_t *err)
指定されたID(id)・アドレス(addr)・32ビットのデータ(data)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
- bool DXLIB/DX2LIB::WriteSyncByteData (const uint8_t *pid, uint16_t addr, const uint8_t *pdata, int num)
指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・8ビットのデータ配列(pdata)をDynamixelに書き込みます。
// Lights up AX-12 LEDs with ID=1 to 5
uint8_t ids={1,2,3,4,5};
uint16_t leds={1,1,1,1,1};
dxif.WriteSyncByteData (ids, 30, leds, 5);
- bool DXLIB/DX2LIB::WriteSyncWordData (const uint8_t *pid, uint16_t addr, const uint16_t *pdata, int num)
指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・16ビットのデータ配列(pdata)をDynamixelに書き込みます。
// Set different GoalPositions for each AX-12 with ID=1-5
uint8_t ids={1,2,3,4,5};
uint16_t poss={100,200,300,400,500};
dxif.WriteSyncWordData (ids, 30, ppos, 5);
- bool DXLIB/DX2LIB::WriteSyncLongData (const uint8_t *pid, uint16_t addr, const uint32_t *pdata, int num)
指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・32ビットのデータ配列(pdata)をDynamixelに書き込みます。
- bool DXLIB/DX2LIB::Ping (uint8_t id, uint16_t *err)
指定されたID(id)のDynamixelを検索します。errにはDynamixelのエラーが返ります。
- bool DXLIB/DX2LIB::Reset (uint8_t id, uint16_t *err)
指定されたID(id)のDynamixelを出荷時状態に戻します。errにはDynamixelのエラーが返ります。
以降のAPIはライブラリv1.5から新設されたAPIで、AVRシリーズを除いたターゲットで使用できます。詳細はこちらを参照してください。
- int DXLIB/DX2LIB::ScanDevices (uint8_t *ids)
- PDXL_ModelInfo DXLIB/DX2LIB::GetModelInfo (uint8_t id)
- bool DXLIB/DX2LIB::PrintDevicesList (int (*pf) (const char *, ...))
- void DXLIB/DX2LIB::InitDevicesList (void)
- TErrorCode DXLIB/DX2LIB::GetErrorCode (uint8_t id)
- bool DXLIB/DX2LIB::GetHWErrorCode (uint8_t id, uint8_t *hwerr)
- bool DXLIB/DX2LIB::SetDriveMode (uint8_t id, uint8_t mode)
- bool DXLIB/DX2LIB::SetDriveModesEquival (const uint8_t *ids, int num, uint8_t mode)
- bool DXLIB/DX2LIB::SetOperatingMode (uint8_t id, uint8_t mode)
- bool DXLIB/DX2LIB::SetOperatingModesEquival (const uint8_t *ids, int num, uint8_t mode)
- bool DXLIB/DX2LIB::GetOperatingMode (uint8_t id, uint8_t *mode)
- bool DXLIB/DX2LIB::SetLED (uint8_t id, bool en)
- bool DXLIB/DX2LIB::SetTorqueEnable (uint8_t id, bool en)
- bool DXLIB/DX2LIB::SetTorqueEnables (const uint8_t *ids, const bool *ens, int num)
- bool DXLIB/DX2LIB::SetTorqueEnablesEquival (const uint8_t *ids, int num, bool en)
- bool DXLIB/DX2LIB::GetTorqueEnable (uint8_t id, bool *en)
- bool DXLIB/DX2LIB::GetTorqueEnables (const uint8_t *ids, bool *en, int num)
- bool DXLIB/DX2LIB::SetGoalAngle (uint8_t id, double angle)
- bool DXLIB/DX2LIB::SetGoalAngles (const uint8_t *ids, const double *angles, int num)
- bool DXLIB/DX2LIB::GetPresentAngle (uint8_t id, double *angle)
- bool DXLIB/DX2LIB::GetPresentAngles (const uint8_t *ids, double *angles, int num)
- bool DXLIB/DX2LIB::StandStillAngle (uint8_t id)
- bool DXLIB/DX2LIB::StandStillAngles (const uint8_t *ids, int num)
- bool DXLIB/DX2LIB::SetGoalVelocity (uint8_t id, double velocity)
- bool DXLIB/DX2LIB::SetGoalVelocities (const uint8_t *ids, const double *velocities, int num)
- bool DXLIB/DX2LIB::GetPresentVelocity (uint8_t id, double *velocity)
- bool DXLIB/DX2LIB::GetPresentVelocities (const uint8_t *ids, double *velocities, int num)
- bool DXLIB/DX2LIB::SetGoalAngleAndVelocity (uint8_t id, double angle, double velocity)
- bool DXLIB/DX2LIB::SetGoalAnglesAndVelocities (const uint8_t *ids, PAngleVelocity anglevelocity, int num)
- bool DXLIB/DX2LIB::SetGoalAngleAndTime (uint8_t id, double angle, double sec)
- bool DXLIB/DX2LIB::SetGoalAnglesAndTime (const uint8_t *ids, const double *angles, int num, double sec)
- bool DXLIB/DX2LIB::SetGoalAngleAndTime2 (uint8_t id, double angle, double sec)
- bool DXLIB/DX2LIB::SetGoalAnglesAndTime2 (const uint8_t *ids, const double *angles, int num, double sec)
- bool DXLIB/DX2LIB::SetGoalCurrent (uint8_t id, double current)
- bool DXLIB/DX2LIB::SetGoalCurrents (const uint8_t *ids, const double *currents, int num)
- bool DXLIB/DX2LIB::GetPresentCurrent (uint8_t id, double *current)
- bool DXLIB/DX2LIB::GetPresentCurrents (const uint8_t *ids, double *currents, int num)
- bool DXLIB/DX2LIB::SetGoalPWM (uint8_t id, double pwm)
- bool DXLIB/DX2LIB::SetGoalPWMs (const uint8_t *ids, const double *pwms, int num)
- bool DXLIB/DX2LIB::GetPresentPWM (uint8_t id, double *pwm)
- bool DXLIB/DX2LIB::GetPresentPWMs (const uint8_t *ids, double *pwms, int num)
その他
DXSHIELDのTTL・RS-485 I/Fについて
- 送信はTTL・RS-485の両I/Fに対して同時に行われ、受信はTTL・RS-485の両I/FがOR接続されているため同時に受信できない。
- TTL・RS-485の両I/Fはいずれも半二重で、無通信時(回路内のTX信号がHigh)は受信回路を活性化し受信待ち状態になり、送信時(回路内のTX信号がLow)は送信回路を活性化し送信状態になる。なお半二重の方向制御として送信信号に10usのオフディレイを設けた信号を用いており、Arduino自信はスケッチ及び回路共に半二重を意識することは無い。
- 半二重の方向制御を行うオフディレイ回路よりも高速に応答するデバイスを使用するとバスの切り替えタイミングが間に合わず、デバイスからの応答を正常に受信する事ができない。
- TTL・RS-485のいずれのI/Fにかかわらず同じIDを持ったDynamixelが存在してはならない。
- TTLとRS-485のI/F間をまたいだ送受信はできないため、TTL・RS-485の両I/FにDynamixelが接続された環境において一部のインストラクションが正常動作しない。
- RS-485 I/FのD+/D-ライン間に挿入されているターミネータ(R1)により正常な通信が行えないデバイスが存在する。ターミネータを除去しても正常な通信が行えない場合は、バイアス抵抗等を挿入してみる事。
Arduino MEGAでの使用
少しの改造でDXSHIELDをArduino MEGAで使用する事ができます。DXSHIELDは次の図の位置に装着します。
ハードウェアシリアルモード
デフォルトのSerialを利用する限りUNOと同様の運用で利用できます。しかし、MEGAには追加でSerial1~Serial3のハードウェアシリアルポートが備わっていますので、それらのポートを利用する事で最大のパフォーマンスを発揮できます。
- ハードウェアシリアルモードではあるが、SW1を常時SOFTの位置にしておく。
- Serial3を利用する際は、DXSHIELDのIO8とIO9をMEGAのIO15とIO14にジャンパ線でつなぐ。Seral1ならIO17とIO16、Serial2の場合はIO19とIO18にジャンパする。
- ジャンパ先のSerial??に合わせてクラスの初期化を変更(DXLIB v1.2以降でサポート)。
DXLIB dxif (false, &Serial3);
DX2LIB dxif (false, &Serial3);
- IO8・IO9は使用不可
ソフトウェアシリアルモード
次の作業が必要です。
- SW1を常時SOFTの位置にしておく。
- Arduino MEGAではIO8はソフトウェアシリアルの受信端子として使用できないため、ジャンパ線でIO8とIO10を短絡。
- 入れ替えた端子に合わせてクラスの初期化を変更。
DXLIB dxif (true, NULL, 10, 9); // rxpin IO8->IO10, txpin IO9
DX2LIB dxif (true, NULL, 10, 9); // rxpin IO8->IO10, txpin IO9
- IO8・IO9・IO10は使用不可
注意事項
- いずれの端子も絶縁されていない。そのためArduinoとPCをUSBケーブルで活線接続した際に、突入電流などでPCがArduinoを認識しない問題が生じる事がある。そういった場合は、USBISOでPCのUSBポートを絶縁する事で解消する。
- Dynamixelシリーズがサポートする2M[bps]を超えるボーレートは、Arduino UNOの機能に依存するため使用できない。必ず2M[bps]以下で運用する事。
- E133(初期リリース版)とE133B(Rev.B)の相違点
- 一部抵抗の定数修正
- Dynamixel用コネクタをmolexからJST製EHに
- JST製XHコネクタの装備に対応
- PCBのレジスト色を青から緑に
- FUTABA社製コマンド式サーボのうち、JST社B4B-EHコネクタを装備してるものはDynamixelのそれとはピンアサインが異なるため、絶対に接続しない事。