ページへ戻る

− Links

 印刷 

BTE074 DXSHIELD のバックアップソース(No.3) :: Besttechnology

knowledge:BTE074 DXSHIELD のバックアップソース(No.3)

« Prev[4]  Next »[5]
TITLE:DXSHIELDマニュアル
#norelated
#contents
[[ショップページへ>http://www.besttechnology.co.jp/modules/onlineshop/index.php?fct=photo&p=175]]
**概要 [#i9b1c92f]
DXSHIELDはDynamixelシリーズと通信するためのI/F(RS485・TTL)をArduinoに増設するシールドで、各I/F用のコネクタに電源を分配する機能も合わせ持ちます。~

また、DXSHIELDのI/Fで通信できるデバイスであればいずれも適用可能です。

**仕様 [#w1fc9eab]
***同梱内容 [#t8074694]
| 型式等 | 数量 | 備考 |
|本体 | 1|- |
|電源コネクタキット | 1式|ハウジング [[JST VHR-2N>http://www.jst-mfg.com/product/pdf/jpn/VH.pdf]] x1 &br;コンタクト [[JST SVH-21T-P1.1>http://www.jst-mfg.com/product/pdf/jpn/VH.pdf]] x2|
|シールド用ピンヘッダ| 1式|< |
|JP1用ピンヘッダ及びジャンパ| 1式|< |

***基本仕様 [#k2975a33]
|品番 |BTE074 |<|
|PCBリビジョン |E133 (2層) |<|
|動作温度範囲 |0~60℃ 結露なきこと|<|
|外形寸法 |約52x53x14.5mm (ピンヘッダ除く) |<|
|重量 | |<|
|電源 |CN1:DC6~24V (Dynamixelが要求する電源)&br;内部ロジック:DC5V±5% (Arduinoより供給) |<|
|コネクタ等|JST B2PS-VH x1&br;MOLEX 22-03-5045 x6 &br;MOLEX 22-03-5035 x6 |<|
|各I/F仕様 |RS485|複信 半二重&br;最大通信速度 2Mbps&br;最大ノード数 256台&br;ESD保護 ±15kV&br;ターミネータ装備済 |
|^|TTL|複信 半二重&br;最大通信速度 2Mbps&br;ESD保護 ±2kV&br;信号ラインは4.7kΩにてプルアップ済 |

***内部簡略ブロック [#gbb4d2b7]
#ref(E133_block.png,60%)
***外観・レイアウト [#k37b8ee0]
| top | side |h
| #ref(E133_TOP.png,27%) | #ref(E133_SIDEp.png,27%) |
※出荷時にピンヘッダは未装着

| 3D |h
| [[3D pdf>http://www.besttechnology.co.jp/download/3D/E133_3D.pdf]] |

#ref(E133_LAYOUT.pdf,100%)
***回路図 [#k1a3e31b]
#ref(E133_SCH.pdf)

***各機能詳細 [#r071b4b9]
****J1,J5 [#j5c9c0ef]
#ref(E133_J1_J5.png)
-2.54mmピッチ 10ピンシングルラインヘッダ用ランド
-相互に並列接続
-Arduinoと接続する際はJ1に任意のヘッダを装着
| Pin No. | Name | Connected |h
| 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 [#o639f73a]
#ref(E133_J2_J6.png)
-2.54mmピッチ 8ピンシングルラインヘッダ用ランド
-相互に並列接続
-Arduinoと接続する際はJ2に任意のヘッダを装着
| Pin No. | Name | Connected |h
| 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 [#l3a39046]
#ref(E133_J3_J7.png)
-2.54mmピッチ 8ピンシングルラインヘッダ用ランド
-相互に並列接続
-Arduinoと接続する際はJ3に任意のヘッダを装着
| Pin No. | Name | Connected |h
| 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 [#b2714017]
#ref(E133_J4_J8.png)
-2.54mmピッチ 6ピンシングルラインヘッダ用ランド
-相互に並列接続
-Arduinoと接続する際はJ4に任意のヘッダを装着
| Pin No. | Name | Connected |h
| 1 | AD0 | no |
| 2 | AD1 | no |
| 3 | AD2 | no |
| 4 | AD3 | no |
| 5 | AD4/SDA | no |
| 6 | AD5/SCL | no |

****JP1 [#a37455c9]
#ref(E133_JP1.png)
-2.54mmピッチ2ピンヘッダ用ランド
-DXSHIELDの電源をArduinoの外部電源として供給
-ショート:[[CN1>#f7942cf7]]に接続された電源をArduinoのVinに分配~
[[CN1>#f7942cf7]]に供給する電圧はArduinoのVinが許容する電圧範囲を守ること
-オープン:[[CN1>#f7942cf7]]に接続された電源とArduinoのVinを切断~
[[CN1>#f7942cf7]]とArduinoのVin各々に電源を供給するか、USBバスパワーで動作するArduinoであればPCとArduinoをUSBケーブルで常時接続すること

|CENTER:BGCOLOR(red): :idea:|JP1をショートした状態でArduinoのVinから電源を供給してはならない。&br;CN2~CN11の電源が弱いJP1を介して供給されるため、使用デバイスの負荷条件によってはジャンパや基板が損傷する。|

|CENTER:BGCOLOR(red): :idea:|JP1をショートした状態でCN1とArduinoの外部電源に各々個別の電源を供給してはならない。&br;電源や負荷の条件によってJP1に過電流が流れると、ジャンパや基板が損傷する。|

****SW1 [#g3d6a682]
#ref(SW1.png)
-3Tスライドスイッチ
-シリアル通信に使用するArduinoの送受信端子を3パターンから選択
-詳細は[[こちら>#c8763faf]]

****CN1 [#f7942cf7]
#ref(CN1.png)
-[[JST B2P-VH-B>http://www.jst-mfg.com/product/detail.php?series=262]]
-[[CN2~6>#w4e5b4bc]],[[CN7~11>#q21ef0ec]]のVDD/GND端子へ接続
-[[JP1>#a37455c9]]をショートすることでArduinoへ本電源を供給可~
その場合はArduinoのVinが許容する電圧範囲である事
#ref(PWR_connector.png)

|CENTER:BGCOLOR(red): :idea:|電源の逆接続は電源回路の即時破壊・全損扱いとなる。|

****CN2~CN6 [#w4e5b4bc]
#ref(CN2-6.png)
-[[MOLEX 22-03-5035>http://www.molex.com/molex/products/datasheet.jsp?part=active/0022035035_PCB_HEADERS.xml&channel=Products&Lang=ja-JP&lang=ja-JP]]
-TTL I/Fを搭載したDynamixelシリーズ用のコネクタ
-SIGNAL端子は4.7kΩの抵抗を介して内部の5V電源へプルアップ済
-5つのコネクタはいずれも内部で並列に接続
-TTL I/Fと電源は以下の端子に接続
#ref(TTL_connector.png)

****CN7~CN11 [#q21ef0ec]
#ref(CN7-11.png)
-[[MOLEX 22-03-5045>http://www.molex.com/molex/products/datasheet.jsp?part=active/0022035045_PCB_HEADERS.xml&channel=Products&Lang=ja-jp]]
-RS485 I/Fを搭載したDynamixelシリーズ用のコネクタ
-D+/D-間にターミネータ装備
-5つのコネクタはいずれも内部で並列に接続
-RS485 I/Fと電源は以下の端子に接続
#ref(RS485_connector.png)

****ユーザランド [#jfa751e7]
#ref(URAND.png)
-2.54mmピッチランド
-工作用
-5V0のシルクの囲みはArdunioから供給される5V、GNDのシルクの囲みはGNDに接続済~
それ以外のランドはフリー

**使用方法 [#be654865]

***対応するデバイス [#r3b9fa50]
| I/F |  Device Name |h
|TTL|Dynamixel AX・XL・MX(TTL版)シリーズ全般|
|RS485|Dynamixel DX・RX・EX・MX(RS485版)・XL・XM・XH・PROシリーズ全般, UD3, UD3.5, USS3, DXMIO|
要求される電源電圧が同じであれば、I/Fを問わず同時に使用することが可能です。

***接続方法 [#g7d8744a]
ここでは予めJP1~JP4にピンヘッダが装着されているものとします。
+ArduinoにDXSHIELDをスタックさせる。その際に両基板のピンヘッダ以外が物理的に接触していないこと。他のシールドを同時に使用する際は、DXSHIELDが使用済みの端子に十分配慮しておくこと。
+Dynamixelのコネクタと同じDXSHIELD上のコネクタ同士を接続する。DXSHIELDにはTTL・RS485 I/F共に各々5個のコネクタが装備されているが、I/Fの種類が一致してさえいればどのコネクタを使用しても構わない。
+DXSHIELDのCN1にDynamixelが要求する仕様の電源を供給する。この時絶対に電源の極性を間違えてはならない。
+DXSHIELDのJP1がオープンの場合はArduino本体への電源供給が必要なため、別途USBケーブルやACアダプタをArduinoへ接続して電源供給する。~
DXSHIELDのJP1がショートの場合はCN1からの電源がArduinoへも分配されるので、別途ArduinoへACアダプタを使って給電する必要がない。

#ref(E133_ASM.png,60%)

***モード選択 [#c8763faf]
Arduinoの種類に依存する部分が多々ありますが、ここではDXSHIELDを[[Arduino UNO>https://www.arduino.cc/en/Main/ArduinoBoardUno]]に装着して使用する前提として3つのモードを説明します。

****ソフトウェアシリアルモード[#ee08b548]
ArduinoのIO8・IO9ピンをソフトウェアシリアルで構成しDynamixelを制御するモードです。ArduinoのUSBシリアル通信機能(ハードウェアシリアル)はDynamixelの制御以外の目的に使用できます。~
Arduinoには任意の端子をシリアル通信の送受信端子として使用するSoftwareSerialライブラリが用意されています。あまり高速な通信には向きませんが、57600bps程度であれば十分実用レベルです。~
SW1を図の位置(SOFT)に切り替えます。
#ref(mode1.png)
本設定によりArduinoのデジタル入出力端子のうちIO8とIO9をソフトウェアシリアル用の端子として使用するため、この2つの端子は他の目的で使用してはなりません。~
また、Arduinoにユーザのスケッチを転送する際は、無条件に本モードに変更しておかないと転送に失敗します。

****ハードウェアシリアルモード [#ce79cebb]
ArduinoのIO0・IO1ピンをハードウェアシリアルで構成しDynamixelを制御するモードです。USBシリアル通信機能を犠牲にしても高速かつ安定した通信を要求する場合にの設定です。~
予めソフトウェアシリアルモードにおいてライブラリによる制御の理解が得られ、スケッチの書き込み時以外にUSBシリアルによる通信を必要としない場合に本設定を選択します。~
SW1を図の位置(HARD)に切り替えます。
#ref(mode2.png)
本設定を行った場合は、自身のスケッチでSerialライブラリを使用してはなりません。また、IO0・IO1ピンとUSBシリアル通信機能は他の目的で使用する事ができません。~
なお、スケッチをコンパイルして描き込む際は、本設定が電気的にUSBシリアル通信機能に影響を及ぼすため、その都度ソフトウェアシリアルモードに切り替える必要があります。

****USBパススルーモード [#c1027f1a]
Arduinoに搭載されたUSBシリアル通信機能を用いてPCなどからDXSHIELDを[[DXHUB>BTE068B]]ライクに直接使用するモードです。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)に切り替えます。
#ref(mode3.png)

***ソフトウェア [#v2bf51a5]
****Dynamixel Configurator, RoboPlus[#va576864]
DXSHIELDを[[USBパススルー>#c1027f1a]]に設定にする事で、Dynamixelのコントロールテーブルの状態をモニタしたりパラメータの変更や動作確認を簡便に行うソフトウェアである[[Dynamixel Configurator>DXCONF]]が利用できます。~
公開されているバージョンはWindows版のみとなります。
#ref(dxconf.png,100%)
Dynamixel Configuratorの詳細は[[こちら>DXCONF]]にて。

ROBOTIS社提供のRoboPlusは[[こちら>http://support.robotis.com/jp/software/roboplus_main.htm]]。

****Dynamixel Library for PC [#x91df052]
DXSHIELDを[[USBパススルー>#c1027f1a]]にする事で、[[Dynamixel Library]]を併用してシリアル通信やプロトコルを意識せずにPCから制御する事ができます。

Dynamixel Libraryの詳細は[[こちら>Dynamixel Library]]にて。

****Dynamixel Library for Arduino [#t98a44bc]
DXSHIELDを[[ソフトウェアシリアル>#ee08b548]]もしくは[[ハードウェアシリアル>#ce79cebb]]モードに設定した場合、ArduinoのスケッチでDynamixelを制御するためのライブラリが利用できます。~
本家Dynamixel Library同様にスケッチではシリアル通信である事を意識すること無くコントロールテーブルへの読み書きが行えますが、Arduino版はコードを端折り機能を限定したサブセット版となります。

-ライブラリのダウンロード(Arduino UNOを想定)~
--
#ref(dxlib1.1_for_arduino.zip)
Dynamixel Protocol V.2に対応~
低位の送受信関数追加~
32bitデータの送受信関数追加~
アドレスとサイズに関する引数は全て16bitに統一

--
#ref(dxlib1.0_for_arduino.zip)
初期リリース

DXLIBのインストールは、ArduinoのIDEの「スケッチ→ライブラリのインクルード→.ZIP形式のライブラリをインストール...」メニューを使用してダウンロードしたZIPファイルを選択するだけです。~
インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。

DXLIB v1.1で使用できるAPIは以下の通りです。
-&color(#0099ff){''DXLIB'' (bool ss, uint8_t txpin, uint8_t rxpin)};~
ソフトウェアシリアルの使用('''ss''')・送信端子('''txpin''')・受信端子('''rxpin''')を指定した上でオブジェクトを生成します。~
'''ss'''にtrueを指定したら[[ソフトウェアシリアルモード>#ee08b548]]、falseを指定したら[[ハードウェアシリアルモード>#ce79cebb]]にDXSHIELDを設定しなくてはなりません。~
'''txpin'''と'''rxpin'''はDXSHIELDを使用する限り指定は省略します。
 // dxifの名前でインスタンス化
 // ソフトウェアシリアルモードで使用
 DXLIB dxif(true);
-&color(#0099ff){void DXLIB::''begin'' (long baud)};~
ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~
なお、選択したモードにより使用できるボーレートに制限があります。
 // 生成されたdxifを57143bpsで初期化
 void setup() {
   dxif.begin (57143);
 }
-&color(#0099ff){bool DXLIB::''TxPacket'' (uint8_t id, uint8_t inst, uint8_t *param, uint16_t len)};~
指定されたID('''id''')・インストラクション('''inst''')・パラメータ('''param''')・パラメータ長('''len''')のインストラクションパケットを送信します。
-&color(#0099ff){bool DXLIB::''RxPacket'' (uint8_t *rdata, uint16_t rdatasize, uint16_t *rlen, uint8_t *err)};~
ステータスパケットを受信します。成功するとパケット内のパラメータが'''rdata'''へコピーされ、そのパラメータのサイズが'''rlen'''に返されます。なお、ステータスパケットを受信するのに十分なサイズを確保し、そのポインタを'''rdata'''へ、サイズを'''rdatasize'''に指定します。'''err'''にはDynamixelのエラーが返ります。
-&color(#0099ff){bool DXLIB::''ReadByteData'' (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')から8ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。
 // ID=1のAX-12のLEDを取得
 uint8_t led;
 dxif.ReadByteData (1, 25, &led, NULL);
-&color(#0099ff){bool DXLIB::''ReadWordData'' (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')から16ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。
 // ID=1のAX-12からPresentPositionを取得
 uint16_t ppos;
 dxif.ReadWordData (id, 36, &ppos, NULL);
-&color(#0099ff){bool DXLIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')から32ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。
-&color(#0099ff){bool DXLIB::''WriteByteData'' (uint8_t id, uint16_t addr, uint8_t data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')・8ビットのデータ('''data''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。
 // ID=1のAX-12のLEDを点灯
 uint8_t err;
 dxif.WriteByteData (id, 25, 1, &err);
-&color(#0099ff){bool DXLIB::''WriteWordData'' (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')・16ビットのデータ('''data''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。
 // ID=1のAX-12のGoalPositionを511に変更
 dxif.WriteWordData (id, 30, 511, NULL);
-&color(#0099ff){bool DXLIB::''WriteLongData'' (uint8_t id, uint16_t addr, uint32_t data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')・32ビットのデータ('''data''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。
-&color(#0099ff){bool DXLIB::''WriteSyncByteData'' (const uint8_t *pid, uint16_t addr, const uint8_t *pdata, int num)};~
指定されたid数('''num''')分のIDの配列('''pid''')・アドレス('''addr''')・8ビットのデータ配列('''pdata''')をDynamixelに書き込みます。
 // ID=1~5の5個のAX-12のLEDへ点滅を指令
 uint8_t ids={1,2,3,4,5};
 uint16_t leds={1,1,1,1,1};
 dxif.WriteSyncByteData (ids, 30, leds, 5);
-&color(#0099ff){bool DXLIB::''WriteSyncWordData'' (const uint8_t *pid, uint16_t addr, const uint16_t *pdata, int num)};~
指定されたid数('''num''')分のIDの配列('''pid''')・アドレス('''addr''')・16ビットのデータ配列('''pdata''')をDynamixelに書き込みます。
 // ID=1~5の5個のAX-12に個別のGoalPositionを指令
 uint8_t ids={1,2,3,4,5};
 uint16_t poss={100,200,300,400,500};
 dxif.WriteSyncWordData (ids, 30, ppos, 5);
-&color(#0099ff){bool DXLIB::''WriteSyncLongData'' (const uint8_t *pid, uint16_t addr, const uint32_t *pdata, int num)};~
指定されたid数('''num''')分のIDの配列('''pid''')・アドレス('''addr''')・32ビットのデータ配列('''pdata''')をDynamixelに書き込みます。
-&color(#0099ff){bool DXLIB::''Ping'' (uint8_t id, uint16_t *err)};~
指定されたID('''id''')のDynamixelを検索します。'''err'''にはDynamixelのエラーが返ります。
-&color(#0099ff){bool DXLIB::''Reset'' (uint8_t id, uint16_t *err)};~
指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。

また、Arduino IDEのバージョンによっては「SoftwareSerial.h: No such file or directory」のコンパイルエラーが発生しますので、その場合は自信のスケッチの先頭に以下の1行を挿入してコンパイルします。
 #include <SoftwareSerial.h>

**その他 [#w7e62a68]
***DXSHIELDのTTL・RS485 I/Fについて [#k759b64e]
-送信はTTL・RS485の両I/Fに対して同時に行われ、受信はTTL・RS485の両I/FがOR接続されているため同時に受信できない。
-TTL・RS485の両I/Fはいずれも半二重で、無通信時(回路内のTX信号がHigh)は受信回路を活性化し受信待ち状態になり、送信時(回路内のTX信号がLow)は送信回路を活性化し送信状態になる。なお半二重の方向制御として送信信号に10usのオフディレイを設けた信号を用いており、Arduino自信はスケッチ及び回路共に半二重を意識することは無い。
-半二重の方向制御を行うオフディレイ回路よりも高速に応答するデバイスを使用するとバスの切り替えタイミングが間に合わず、デバイスからの応答を正常に受信する事ができない。
-TTL・RS485のいずれのI/Fにかかわらず同じIDを持ったDynamixelが存在してはならない。
-TTLとRS485のI/F間をまたいだ送受信はできないため、TTL・RS485の両I/FにDynamixelが接続された環境において一部のインストラクションが正常動作しない。

***注意事項 [#o2f97e11]
-いずれの端子も絶縁されていない。そのためArduinoとPCをUSBケーブルで活線接続した際に、突入電流などでPCがArduinoを認識しない問題が生じる事がある。そういった場合は、[[USBISO]]でPCのUSBポートを絶縁する事で解消する。
-Dynamixelシリーズがサポートする2M[bps]を超えるボーレートは、Arduino UNOの機能に依存するため使用できない。必ず2M[bps]以下で運用する事。

« Prev[4]  Next »[5]