12: 2017-06-25 (日) 13:32:38 takaboo ソース 現: 2018-12-02 (日) 21:33:36 takaboo ソース
Line 23: Line 23:
|重量 | |<| |重量 | |<|
|電源 |CN1:DC6~24V (Dynamixelが要求する電源)&br;内部ロジック:DC5V±5% (Arduinoより供給) |<| |電源 |CN1:DC6~24V (Dynamixelが要求する電源)&br;内部ロジック:DC5V±5% (Arduinoより供給) |<|
-|コネクタ等|E133B版&br; JST B2PS-VH x1&br; JST B4B-EH x6&br; JST B3B-EH x6&br;E133版&br; JST B2PS-VH x1&br; molex 22-03-5045 x6&br; molex 22-03-5035 x6 |<|+|コネクタ等|E133B版&br; JST B2PS-VH x1&br; JST B4B-EH x5&br; JST B3B-EH x5&br;E133版&br; JST B2PS-VH x1&br; molex 22-03-5045 x5&br; molex 22-03-5035 x5 |<|
|各I/F仕様 |RS-485|複信 半二重&br;最大通信速度 2Mbps&br;最大ノード数 256台&br;ESD保護 ±15kV&br;ターミネータ装備済 | |各I/F仕様 |RS-485|複信 半二重&br;最大通信速度 2Mbps&br;最大ノード数 256台&br;ESD保護 ±15kV&br;ターミネータ装備済 |
|^|TTL|複信 半二重&br;最大通信速度 2Mbps&br;ESD保護 ±2kV&br;信号ラインは47kΩにてプルアップ済 | |^|TTL|複信 半二重&br;最大通信速度 2Mbps&br;ESD保護 ±2kV&br;信号ラインは47kΩにてプルアップ済 |
Line 186: Line 186:
****ユーザランド [#jfa751e7] ****ユーザランド [#jfa751e7]
-#ref(URAND.png)+#ref(E133C_URAND.png)
-2.54mmピッチランド -2.54mmピッチランド
-工作用 -工作用
Line 203: Line 203:
ここでは予めJP1~JP4にピンヘッダが装着されているものとします。 ここでは予めJP1~JP4にピンヘッダが装着されているものとします。
+ArduinoにDXSHIELDをスタックさせる。その際に両基板のピンヘッダ以外が物理的に接触していないこと。他のシールドを同時に使用する際は、DXSHIELDが使用済みの端子に十分配慮しておくこと。 +ArduinoにDXSHIELDをスタックさせる。その際に両基板のピンヘッダ以外が物理的に接触していないこと。他のシールドを同時に使用する際は、DXSHIELDが使用済みの端子に十分配慮しておくこと。
 +#ref(E133B_uno.png,70%)
+Dynamixelのコネクタと同じDXSHIELD上のコネクタ同士を接続する。DXSHIELDにはTTL・RS-485 I/F共に各々5個のコネクタが装備されているが、I/Fの種類が一致してさえいればどのコネクタを使用しても構わない。 +Dynamixelのコネクタと同じDXSHIELD上のコネクタ同士を接続する。DXSHIELDにはTTL・RS-485 I/F共に各々5個のコネクタが装備されているが、I/Fの種類が一致してさえいればどのコネクタを使用しても構わない。
+DXSHIELDのCN1にDynamixelが要求する仕様の電源を供給する。この時絶対に電源の極性を間違えてはならない。 +DXSHIELDのCN1にDynamixelが要求する仕様の電源を供給する。この時絶対に電源の極性を間違えてはならない。
Line 236: Line 237:
   // put your setup code here, to run once:    // put your setup code here, to run once:
 }  }
 + 
 void loop() {  void loop() {
   // put your main code here, to run repeatedly:    // put your main code here, to run repeatedly:
Line 243: Line 244:
SW1を図の位置(THROUGH)に切り替えます。 SW1を図の位置(THROUGH)に切り替えます。
#ref(mode3.png) #ref(mode3.png)
 +
 +なお、ArduinoのUSBシリアルを担っているAVRに書き込まれているファームウェアの都合で、大きなデータを連続で送受信する事ができません。これはプロトコルV1を装備するDynamixelシリーズであれば概ね問題はありませんが、プロトコルV2を装備するDynamixelシリーズではこの問題が露見しやすくなります。~
 +また、ArduinoのUSBシリアルとRoboPlus等との相性もよろしくないので、本モードを積極的に使用する事は推奨しません。
***ソフトウェア [#v2bf51a5] ***ソフトウェア [#v2bf51a5]
Line 251: Line 255:
Dynamixel Configuratorの詳細は[[こちら>DXCONF]]にて。 Dynamixel Configuratorの詳細は[[こちら>DXCONF]]にて。
-ROBOTIS社提供のRoboPlusは[[こちら>http://support.robotis.com/jp/software/roboplus_main.htm]]+またROBOTIS社提供の[[RoboPlus 1.0]]と[[RoboPlus 2.0]]が使用できます。 
 +#ref(RoboPlus 2.0/r+2_top.png,40%) 
 + 
 +なお、ArduinoのUSBシリアル通信機能は過度なトラフィックがかかるとデータがドロップすることが頻繁に発生するようです。
****Dynamixel Library for PC [#x91df052] ****Dynamixel Library for PC [#x91df052]
-DXSHIELDを[[USBパススルー>#c1027f1a]]にする事で、[[Dynamixel Library]]を併用してシリアル通信やプロトコルを意識せずにPCから制御する事ができます。+DXSHIELDを[[USBパススルー>#c1027f1a]]にする事で、Dynamixel Libraryを併用してシリアル通信やプロトコルを意識せずにPCから制御する事ができます。
-Dynamixel Libraryの詳細は[[こちら>Dynamixel Library]]にて。+詳細は[[DYNAMIXEL Protocol 1.0 Library>Dynamixel Library]]と[[DYNAMIXEL Protocol 2.0 Library>Dynamixel Protocol 2 Library]]にて。
****Dynamixel Library for Arduino [#t98a44bc] ****Dynamixel Library for Arduino [#t98a44bc]
-DXSHIELDを[[ソフトウェアシリアル>#ee08b548]]もしくは[[ハードウェアシリアル>#ce79cebb]]モードに設定した場合、ArduinoのスケッチでDynamixelを制御するためのライブラリが利用できます。~ +#include(DXLIB_Arduino,notitle)
-本家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.h''};~ +
-Dynamixel Protocol V.1のデバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、V.2との共存はできません。 +
- #include <dxlib.h> +
- DXLIB dxif (true); // select software serial +
- void setup() { +
-   dxif.begin (57600); +
- } +
--&color(#0099ff){''dx2lib.h''};~ +
-Dynamixel Protocol V.2のデバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、V.1との共存はできません。 +
- #include <dx2lib.h> +
- DX2LIB dxif (true); // select software serial +
- void setup() { +
-   dxif.begin (57600); +
- } +
--&color(#0099ff){''DXLIB/DX2LIB'' (bool ss, uint8_t rxpin, uint8_t txpin)};~ +
-ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。同時にソフトウェアシリアルの使用('''ss''')・受信端子('''rxpin''')・送信端子('''txpin''')を指定した上でオブジェクトを生成できます。~ +
-なお、'''ss'''にtrueを指定したら[[ソフトウェアシリアルモード>#ee08b548]]、falseを指定したら[[ハードウェアシリアルモード>#ce79cebb]]にDXSHIELDを設定しなくてはなりません。~ +
-また、'''rxpin'''と'''txpin'''は通常指定する必要はありませんが、他のSHIELDやArduinoの機能の都合で使用できない場合に限り指定します。 +
- #include <dx2lib.h> +
- // dxifの名前でDynamixel Protocol V.2 Libraryをインスタンス化 +
- // ソフトウェアシリアルモードで使用 +
- DX2LIB dxif(true); +
--&color(#0099ff){void DXLIB/DX2LIB::''begin'' (long baud)};~ +
-ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~ +
-なお、選択したモードにより使用できるボーレートに制限があります。 +
- // 生成されたdxifを57143bpsで初期化 +
- void setup() { +
-   dxif.begin (57143); +
- } +
--&color(#0099ff){bool DXLIB/DX2LIB::''TxPacket'' (uint8_t id, uint8_t inst, uint8_t *param, uint16_t len)};~ +
-指定されたID('''id''')・インストラクション('''inst''')・パラメータ('''param''')・パラメータ長('''len''')のインストラクションパケットを送信します。 +
- // ID=1へPingインストラクションパケットを送信 +
- dxif.TxPacket (1, 0x01, NULL, 0); +
--&color(#0099ff){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; +
- // ID=1へPingインストラクションパケットを送信 +
- dxif.TxPacket (1, 0x01, NULL, 0); +
- // ステータスパケットを受信 +
- dxif.RxPacket (buf, sizeof (buf), &id, &len, &err) +
--&color(#0099ff){bool DXLIB/DX2LIB::''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/DX2LIB::''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/DX2LIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~ +
-指定されたID('''id''')・アドレス('''addr''')から32ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。 +
--&color(#0099ff){bool DXLIB/DX2LIB::''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/DX2LIB::''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/DX2LIB::''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/DX2LIB::''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/DX2LIB::''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/DX2LIB::''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/DX2LIB::''Ping'' (uint8_t id, uint16_t *err)};~ +
-指定されたID('''id''')のDynamixelを検索します。'''err'''にはDynamixelのエラーが返ります。 +
--&color(#0099ff){bool DXLIB/DX2LIB::''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] **その他 [#w7e62a68]
Line 371: Line 275:
-TTL・RS-485のいずれのI/Fにかかわらず同じIDを持ったDynamixelが存在してはならない。 -TTL・RS-485のいずれのI/Fにかかわらず同じIDを持ったDynamixelが存在してはならない。
-TTLとRS-485のI/F間をまたいだ送受信はできないため、TTL・RS-485の両I/FにDynamixelが接続された環境において一部のインストラクションが正常動作しない。 -TTLとRS-485のI/F間をまたいだ送受信はできないため、TTL・RS-485の両I/FにDynamixelが接続された環境において一部のインストラクションが正常動作しない。
 +-RS-485 I/FのD+/D-ライン間に挿入されているターミネータ(R1)により正常な通信が行えないデバイスが存在する。ターミネータを除去しても正常な通信が行えない場合は、バイアス抵抗等を挿入してみる事。
 +
***Arduino MEGAでの使用 [#z23d4b7d] ***Arduino MEGAでの使用 [#z23d4b7d]
-少しの改造でDXSHIELDをArduino MEGAでも使用する事ができます。+少しの改造でDXSHIELDをArduino MEGAで使用する事ができます。DXSHIELDは次の図の位置に装着します。 
 +#ref(E133B_mega.png,80%) 
****ハードウェアシリアルモード [#aaf5bd9a] ****ハードウェアシリアルモード [#aaf5bd9a]
-UNO同様にハードウェアシリアルモードではSerialを利用する限りUNOと同様の運用で利用できます。しかしMEGAには追加でSerial1~Serial3のハードウェアシリアルポートが備わっていますので、それらのポートを利用する事で最大のパフォーマンスを発揮できます。 +デフォルトのSerialを利用する限りUNOと同様の運用で利用できます。しかし、MEGAには追加でSerial1~Serial3のハードウェアシリアルポートが備わっていますので、それらのポートを利用する事で最大のパフォーマンスを発揮できます。 
--例えばSerial3を利用する際は、DXSHIELDのIO8とIO9をMEGAのIO14とIO15にジャンパ等でつなぐ。 +-ハードウェアシリアルモードではあるが、SW1を常時SOFTの位置にしておく。 
-#ref(E133B_mega_hard.png) +#ref(mode1.png,60%) 
--+-Serial3を利用する際は、DXSHIELDのIO8とIO9をMEGAのIO15とIO14にジャンパ線でつなぐ。Seral1ならIO17とIO16、Serial2の場合はIO19とIO18にジャンパする。 
 +#ref(E133B_mega_hard.png,80%
 +-ジャンパ先のSerial??に合わせてクラスの初期化を変更(DXLIB v1.2以降でサポート)。 
 + DXLIB dxif (false, &Serial3); 
 +  
 + DX2LIB dxif (false, &Serial3); 
 +-IO8・IO9は使用不可 
****ソフトウェアシリアルモード [#b9557fa4] ****ソフトウェアシリアルモード [#b9557fa4]
次の作業が必要です。~ 次の作業が必要です。~
--Arduino MEGAではIO8は[[ソフトウェアシリアルの受信端子>https://www.arduino.cc/en/Reference/Sof​twareSerial]]として使用できないため、ジャンパなどでIO8とIO10を短絡。+-SW1を常時SOFTの位置にしておく。 
 +#ref(mode1.png,60%) 
 +-Arduino MEGAではIO8は[[ソフトウェアシリアルの受信端子>https://www.arduino.cc/en/Reference/Sof​twareSerial]]として使用できないため、ジャンパ線でIO8とIO10を短絡。
#ref(E133_mega_jumper.png) #ref(E133_mega_jumper.png)
-入れ替えた端子に合わせてクラスの初期化を変更。~ -入れ替えた端子に合わせてクラスの初期化を変更。~
- DXLIB dxif (true, 10, 9); // rxpin IO8->IO10, txpin IO9 + DXLIB dxif (true, NULL, 10, 9); // rxpin IO8->IO10, txpin IO9 
- DX2LIB dxif (true, 10, 9); // rxpin IO8->IO10, txpin IO9+  
 + DX2LIB dxif (true, NULL, 10, 9); // rxpin IO8->IO10, txpin IO9 
 +-IO8・IO9・IO10は使用不可
-なお、そもそもArduino MEGAはハードウェアシリアルポートを複数備えていますので、機能の制約が大きいソフトウェアシリアルを利用する利点は皆無です。送受信端子をSerial1(TX:18,RX:19)、Serial2(TX:16,RX:17)、Serial3(TX:14,RX:15)等に割り振り直し、ライブラリを適宜修正する事で最大限のパフォーマンスを発揮できるでしょう。+****USBパススルーモード [#f2ca6d5c] 
 +[[UNOのUSBパススルーモード>#c1027f1a]]と同様です。他のモードで強いられるジャンパ等の措置は必要ありません。
***注意事項 [#o2f97e11] ***注意事項 [#o2f97e11]


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom