1: 2009-11-12 (木) 04:01:46 takaboo ソース 2: 2009-11-12 (木) 04:58:15 takaboo ソース
Line 1: Line 1:
TITLE:Dynamixel Library Sample Code TITLE:Dynamixel Library Sample Code
-#+*ダウンロード [#uf2a87aa] 
 +*一覧 [#d1404b55] 
 +ほぼ全てのサンプルプログラムに共通なシリアルコンソール部分は、shareフォルダのus.cにまとめた。USBやBluetoothといったコンソールの違いがあっても、1行修正すればどの環境にも対応する。 
 + 
 +USBをコンソールとして使うなら、 
 + #define __UDP__ 
 + #include "share\us.c" 
 +Bluetoothをコンソールとして使うなら、 
 + #define __DBGU2__ 
 + #include "share\us.c" 
 +RS232C(SAM7S I/Oのみ)をコンソールとして使うなら、 
 + #define __US1__ 
 + #include "share\us.c" 
 +といった具合にサンプルプログラム中の#defineの部分を任意に変更してコンパイルし直せば対応は完了する。~ 
 +あくまでサンプルプログラムの便宜上分けただけなので、全てのポートを使ったアプリケーションを作成する場合は無視して結構。 
 + 
 +**init.c [#w4fae568] 
 +ライブラリを使用するにあたって必要最低限の手順を示す。次の2行は必須。 
 + enableIRQ ();    // ARMの割り込み許可 
 + DX_Init (1000000, 7.4, NULL, NULL);  // DXLIBの初期化 
 +割り込みを許可した後、DX_InitでDynamixelとの通信速度[bps]、電源電圧低下アラーム閾値[V]、DX_PrintBuffer APIで送信対象となるコンソール、200Hz周期で起動される外部関数、を指定すれば初期化は完了となる。後述の2つは使わない限りNULLを指定しておけば大概問題は無い。 
 + 
 +**led.c [#sc7ea69e] 
 +Dynamixelに装備されるモニタLEDを明滅させる。特にモータが動くといった訳ではく危険が少ないので、ひとまずDynamixelとの通信のベースとして参照の事。 
 + int j, l2; 
 + uint8_t  param[128]; 
 + static uint8_t tbuf[150], rbuf[150]; 
 + 
 + param[0] = ADDRESS_LED; 
 + param[1] = f & 1; 
 + j = DX_TxPacket(tbuf, id, INST_WRITE, param, 2); 
 + DX_PrintBuffer(" <-",tbuf,j); 
 + j = DX_RxPacket(rbuf, &l2, _DX_READ_RESPONSE_TIME); 
 + if (id != BROADCASTING_ID) DX_PrintBuffer(" ->",rbuf,j); 
 +ちょっと面倒だが、インストラクションパケットの送信とステータスパケットの受信を行うには最低限これだけの記述が必要。また、DX_TxPacket及びDX_RxPacketの内部処理は非同期に行われるため、バッファはstaticな物を与える事。 
 + 
 +もちろんこんなまどろっこしい記述をやめて、以下の様にDX_WriteByteDataでさらっと済ませても良い。 
 +  DX_WriteByteData (id, ADDRESS_LED, f); 
 + 
 +**goalpos.c [#d892e62c] 
 +Dynamixelのモータを実際に動かして任意の位置にホーンを移動させる。一応ID:1~3の3台のDynamixelが存在している事を想定しているが、1台でも動作確認は可能。~ 
 +送信の仕方として3種類用意されており、1軸毎に処理(個別IDへインストラクションパケット送信)、軸数関係なく全て同時に処理(BROADCAST IDでインストラクションパケット送信)、軸数を意識して全て同時に処理(同期インストラクションパケットを使って送信)を行っている。~ 
 +手始めは1軸ずつちまちま送信してみて、軸数を増やして1軸毎にインストラクションパケットを処理した際にオーバヘッドが気になるようになってきたら同期インストラクションパケットで一気に指令するといった具合に移行すれば良いかと。 
 + 
 +ここでも面倒だがインストラクションパケットを直に生成している部分が多々あるが、DX_ReadWordDataやDX_SetPositionに置き換えれば見通しが良くなる。 
 + 
 +**presentpos.c [#x536b294] 
 +Dynamixelのホーンの位置を取得しモニタする。 
 + 
 +ここでも更に面倒だがインストラクションパケットを直に生成しているが、DX_ReadWordDataを使えばこれまたすっきりする。 
 + short GetPos (uint8_t id) { 
 +   uint16_t result; 
 +   return DX_ReadWordData (id, ADDRESS_PRESENT_POSITION, &result) ? result : -1; 
 + } 
 + 
 +**compliance.c [#s50584f8] 
 +位置決め制御時の柔らかさを任意に設定しその違いを把握する。手で止まっているホーンを動かしてみて、感触の違いを感じる。 
 + 
 +**mml.c [#z87652aa] 
 +ブザーで音階を奏でる。 
 + 
 +**uss3.c [#x38a70ac] 
 +USS3で計測している距離を取得しモニタする。 
 + 
 +**changeparam.c [#cfa56087] 
 +出荷時にIDは全て1のDynamixelだが、複数台つないで使うときは全て異なる数値にする必要がある。通常コンフィギュレータを使用してPCから設定するものとしているが、IDと数個のパラメータだけだが変更できるプログラムを作ってみた。~ 
 +動作チェックも可能。 
 + id:1baud:34(UNKNOWN) >? 
 + ----Command List---- 
 +  [p/P] Ping                [s/S] Scan 
 +  [i] Change host id        [I] Change target id 
 +  [b] Change host baudrate  [B] Change target baudrate 
 +  [R] Change target return delay time [t/T] Test run 
 +こんな感じでいくつかの機能を提供している。 
 + 
 +使い方は、コントローラが対象としたいidとボーレートを「i」と「b」で設定し、「p」で通信できるかを確認。idもボーレートも分からなければ「s」でスキャンをかけ、見つかったidとボーレートを設定すれば良い。通信出来る事が確認できたらidやボーレートを「I」と「B」で変更する。といった具合。 
 + 
 +**through.c [#ec558d0c] 
 +FDIII-HCには既に備わっているConfiguratorコンパチモードだが、それをソースに起こしてみた。全くDynamixelライブラリを使用していないので参考にならないかもしれない。 
 +*その他 [#ld1e98d0] 
 +ここまで書いておいて何だが、大抵の場合はdx.hに宣言されているDynamixel専用のAPIを使えばいちいちインストラクションパケットを意識する必要はない。位置指令であれば、 
 + bool DX_SetPosition (uint8_t id, int p); 
 +を使えば任意のIDへ任意の位置を指定できるし、 
 + bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result); 
 +を使えば任意のIDの任意のアドレスに保存されている16bit幅までの値を簡単にかつ少ないコード量で取り出す事ができる。~ 
 +詳細はライブラリのソースで確認してほしい。


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