3: 2009-11-20 (金) 17:29:27 takaboo ![ソース](http://www.besttechnology.co.jp/modules/knowledge/skin/loader.php?src=page_white_text.png) |
現: 2011-04-08 (金) 21:11:54 takaboo ![ソース](http://www.besttechnology.co.jp/modules/knowledge/skin/loader.php?src=page_white_text.png) |
| TITLE:Dynamixel Library Sample Code | | TITLE:Dynamixel Library Sample Code |
| + | *適用 [#p596db75] |
| + | -ハードウェア~ |
| + | --[[FDIII-HC]]~ |
| + | フル機能お試し可能 |
| + | --[[AT91SAM7S256EVB]]~ |
| + | ブザーやLEDを使用しているものは機能しない |
| + | -ソフトウェア~ |
| + | [[GCC Developer Lite]] |
| + | |
| *ダウンロード [#uf2a87aa] | | *ダウンロード [#uf2a87aa] |
| + | サンプルプログラムは以下のURLにZIP形式の圧縮ファイルで設置。適宜アーカイバにて解凍して使用の事。 |
| + | |
| + | -''2011/04/08 Ver.1.4''~ |
| + | --最新ライブラリ(GCC Developer Lite 2.4.0.0)に対応する修正(主にAPIにタイムアウトとエラーの引数が追加)~ |
| + | --move.cとthrough_bt_to_485.cを追加 |
| + | #ref(http://www.besttechnology.co.jp/download/DXLIBSMPL1.4.ZIP) |
| + | |
| + | -2010/08/04 Ver.1.3~ |
| + | --最新ライブラリに対応する修正 |
| + | #ref(http://www.besttechnology.co.jp/download/DXLIBSMPL1.3.ZIP) |
| + | |
| + | -2009/11/20 Ver.1.2~ |
| + | --changeparam.cを追加 |
| #ref(http://www.besttechnology.co.jp/download/DXLIBSMPL1.2.ZIP) | | #ref(http://www.besttechnology.co.jp/download/DXLIBSMPL1.2.ZIP) |
| + | |
| + | *実行するにあたり [#hc5d6e97] |
| + | サンプルソースをGCC Developer Liteで開き、ツールメニューのコンパイルオプションをクリックしコンパイラオプションダイアログボックス上端にある設定リストから「FREEDOM III library for FDIII-HC (Bootloader)」を選択してOKボタンを押したら環境の設定は完了。~ |
| + | GCC Developer Liteのコンパイルメニューから「ビルド」をクリックするとコンパイルが開始され、成功すればSIMPLE TERMが開く。FDIII-HCのブートローダがコマンドモードになっていれば、SIMPLE TERMの転送メニューから「スクリプト実行」をクリックしコンパイル済みのファイルを転送する。転送が完了したらブートローダの「g」コマンドで実行。 |
| + | |
| + | なお、ほとんどのサンプルがコンソールとしてUSBを使用するため、動作状況はSIMPLE TERMのターミナルウィンドウで確認できる。また、ほとんどのサンプルプログラムは、実行中にターミナルウィンドウ上でESCキーを押すか、FDIII-HCの場合はPB1を押すと実行を終了しブートローダに戻る。 |
| | | |
| *一覧 [#d1404b55] | | *一覧 [#d1404b55] |
| uint8_t param[128]; | | uint8_t param[128]; |
| static uint8_t tbuf[150], rbuf[150]; | | static uint8_t tbuf[150], rbuf[150]; |
| + | uint16_t err; |
| | | |
| param[0] = ADDRESS_LED; | | param[0] = ADDRESS_LED; |
| param[1] = f & 1; | | param[1] = f & 1; |
- | j = DX_TxPacket(tbuf, id, INST_WRITE, param, 2); | + | j = DX_TxPacket(tbuf, id, INST_WRITE, param, 2, &err); |
| DX_PrintBuffer(" <-",tbuf,j); | | DX_PrintBuffer(" <-",tbuf,j); |
- | j = DX_RxPacket(rbuf, &l2, _DX_READ_RESPONSE_TIME); | + | j = DX_RxPacket(rbuf, sizeof(rbuf), &l2, _DX_READ_RESPONSE_TIME, &err); |
| if (id != BROADCASTING_ID) DX_PrintBuffer(" ->",rbuf,j); | | if (id != BROADCASTING_ID) DX_PrintBuffer(" ->",rbuf,j); |
| ちょっと面倒だが、インストラクションパケットの送信とステータスパケットの受信を行うには最低限これだけの記述が必要。また、DX_TxPacket及びDX_RxPacketの内部処理は非同期に行われるため、バッファはstaticな物を与える事。 | | ちょっと面倒だが、インストラクションパケットの送信とステータスパケットの受信を行うには最低限これだけの記述が必要。また、DX_TxPacket及びDX_RxPacketの内部処理は非同期に行われるため、バッファはstaticな物を与える事。 |
| | | |
| もちろんこんなまどろっこしい記述をやめて、以下の様にDX_WriteByteDataでさらっと済ませても良い。 | | もちろんこんなまどろっこしい記述をやめて、以下の様にDX_WriteByteDataでさらっと済ませても良い。 |
- | DX_WriteByteData (id, ADDRESS_LED, f); | + | uint16_t err; |
| + | DX_WriteByteData (id, ADDRESS_LED, f, 100, &err); |
| | | |
| **goalpos.c [#d892e62c] | | **goalpos.c [#d892e62c] |
| short GetPos (uint8_t id) { | | short GetPos (uint8_t id) { |
| uint16_t result; | | uint16_t result; |
- | return DX_ReadWordData (id, ADDRESS_PRESENT_POSITION, &result) ? result : -1; | + | uint16_t err; |
| + | return DX_ReadWordData (id, ADDRESS_PRESENT_POSITION, &result, 100, &err) ? result : -1; |
| } | | } |
| | | |
| **compliance.c [#s50584f8] | | **compliance.c [#s50584f8] |
| 位置決め制御時の柔らかさを任意に設定しその違いを把握する。手で止まっているホーンを動かしてみて、感触の違いを感じる。 | | 位置決め制御時の柔らかさを任意に設定しその違いを把握する。手で止まっているホーンを動かしてみて、感触の違いを感じる。 |
| + | |
| + | **move.c [#dc39f773] |
| + | スムーズに位置を遷移させるにはA地点からB地点の間に移動する速度を与えて指令すれば解決するが、移動時間はその速度の分解能に依存してしまう。~ |
| + | ここではA地点からB地点へ移動する時間を指定して動作させているが、結局小刻みに位置を変化させて指令しているに過ぎない。~ |
| + | なお3軸まで対応させているが、便宜上ID=1だけを対象に動作するようにしている。 |
| | | |
| **mml.c [#z87652aa] | | **mml.c [#z87652aa] |
| 使い方は、コントローラが対象としたいidとボーレートを「i」と「b」で設定し、「p」で通信できるかを確認。idもボーレートも分からなければ「s」でスキャンをかけ、見つかったidとボーレートを設定すれば良い。通信出来る事が確認できたらidやボーレートを「I」と「B」で変更する。といった具合。 | | 使い方は、コントローラが対象としたいidとボーレートを「i」と「b」で設定し、「p」で通信できるかを確認。idもボーレートも分からなければ「s」でスキャンをかけ、見つかったidとボーレートを設定すれば良い。通信出来る事が確認できたらidやボーレートを「I」と「B」で変更する。といった具合。 |
| | | |
- | **through.c [#ec558d0c] | + | **through_usb_to_485.c [#ec558d0c] |
- | FDIII-HCには既に備わっているConfiguratorコンパチモードだが、それをソースに起こしてみた。全くDynamixelライブラリを使用していないので参考にならないかもしれない。 | + | FDIII-HCには既に備わっているパケットスルーモードだが、USB限定でユーザプログラムとしてソースに起こしてみた。全くDynamixelライブラリを使用していないので参考にならないかもしれない。~ |
| + | FDIII-HCのブートローダにおいてUSBを介したパケットスルーモードが正常に動作しない場合はこのプログラムを試してほしい。 |
| + | |
| + | **through_bt_to_485.c [#ec558d0c] |
| + | 先のthrough_usb_to_485.c同様にブートローダに予め備わっているBluetoothによるパケットスルーをコーディングしたもの。~ |
| + | Bluetoothを介してボーレートを変更する事が出来ないので、とりあえず1Mbpsで初期化している。 |
| *その他 [#ld1e98d0] | | *その他 [#ld1e98d0] |
| ここまで書いておいて何だが、大抵の場合はdx.hに宣言されているDynamixel専用のAPIを使えばいちいちインストラクションパケットを意識する必要はない。位置指令であれば、 | | ここまで書いておいて何だが、大抵の場合はdx.hに宣言されているDynamixel専用のAPIを使えばいちいちインストラクションパケットを意識する必要はない。位置指令であれば、 |
| bool DX_SetPosition (uint8_t id, int p); | | bool DX_SetPosition (uint8_t id, int p); |
| を使えば任意のIDへ任意の位置を指定できるし、 | | を使えば任意のIDへ任意の位置を指定できるし、 |
- | bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result); | + | bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, uint16_t *errcode); |
| を使えば任意のIDの任意のアドレスに保存されている16bit幅までの値を簡単にかつ少ないコード量で取り出す事ができる。~ | | を使えば任意のIDの任意のアドレスに保存されている16bit幅までの値を簡単にかつ少ないコード量で取り出す事ができる。~ |
| 詳細はライブラリのソースで確認してほしい。 | | 詳細はライブラリのソースで確認してほしい。 |