9: 2023-03-15 (水) 07:21:59 takaboo | 現: 2023-03-21 (火) 18:09:15 takaboo | ||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:DXLIB for Arduino | TITLE:DXLIB for Arduino | ||
- | Dynamixelを制御するためのプログラムを作成する際のライブラリを提供します。Arduino IDEにインストールするだけで自身のスケッチからDynamixelを制御できます。~ | + | Dynamixelを制御するためのプログラムを作成する際のライブラリを提供します。Arduino IDEにライブラリをインストールして使用します。~ |
- | PC版DYNAMIXEL Protocol [[1.0>Dynamixel Library]]/[[2.0>Dynamixel Protocol 2 Library]] Libraryと同様にプロトコルやシリアル通信を意識せずともコントロールテーブルへの読み書きが行えます。なおAVRではメモリの都合からV1.5から追加されたライブラリは使用できません。また当該バージョンからクラスのインスタンス化の際の引数が変更されていますので注意が必要です。 | + | PC版DYNAMIXEL Protocol [[1.0>Dynamixel Library]]/[[2.0>Dynamixel Protocol 2 Library]] Libraryと同様にコントロールテーブルへの読み書きを行うAPIを用意しています。なおAVRではメモリの都合からV1.5から追加されたライブラリは使用できないのと、クラスのインスタンス化の際の引数が以前のバージョンから大幅に変更されている点に注意が必要です。 |
-ライブラリのダウンロード~ | -ライブラリのダウンロード~ | ||
-- | -- | ||
- | #ref(dxlib1.5beta_for_arduino.zip)~ | + | #ref(dxlib1.5_for_arduino.zip)~ |
- | ---現時点で想定の全てを検証したものではないのでβ版扱い | + | ---定義の修正を行ったため一部β版との互換性なし |
- | ---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる7つのハンドラを新たに設置 | + | ---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる8つのハンドラを新たに設置 |
---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 | ---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 | ||
- | ---AVRを除くターゲットに適用した場合、PCないしARM系マイコンボード用に提供しているDXLIBに[[追加されたAPI>DXL_intuitive]]が使用可能~ | + | ---AVRを除くターゲットに適用した場合、PCやARM系マイコン用に提供しているDXLIBに[[追加されたAPI>DXL_intuitive]]が使用可能~ |
詳細は追って公開 | 詳細は追って公開 | ||
- | ---仕様変更によるサンプルプログラム修正 | + | ---仕様変更に伴うサンプルプログラム修正 |
-- | -- | ||
Line 48: | Line 48: | ||
[[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。'''dx2lib.h'''との共存は想定していません。 | [[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。'''dx2lib.h'''との共存は想定していません。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush: c;"> | + | <pre class="brush:c; highlight:[1];"> |
#include <dxlib.h> | #include <dxlib.h> | ||
#include "avr_uno_softserial.h" | #include "avr_uno_softserial.h" | ||
Line 55: | Line 55: | ||
}; | }; | ||
- | DXLIB dxif (& param); | + | DXLIB dxif ((DX2LIB::TDXHost_ConfParam *)&param); |
void setup() { | void setup() { | ||
Line 64: | Line 64: | ||
[[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。'''dxlib.h'''との共存は想定していません。 | [[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。'''dxlib.h'''との共存は想定していません。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush: c;"> | + | <pre class="brush:c; highlight:[1];"> |
#include <dx2lib.h> | #include <dx2lib.h> | ||
#include "avr_uno_softserial.h" | #include "avr_uno_softserial.h" | ||
Line 71: | Line 71: | ||
}; | }; | ||
- | DX2LIB dxif (& param); | + | DX2LIB dxif ((DX2LIB::TDXHost_ConfParam *)&param); |
void setup() { | void setup() { | ||
Line 82: | Line 82: | ||
各メンバーの関数のプロトタイプに合わせた通信処理関数を予め作成しておく必要があります。 | 各メンバーの関数のプロトタイプに合わせた通信処理関数を予め作成しておく必要があります。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush: c;"> | + | <pre class="brush:c; highlight:[48];"> |
// Assuming HardwareSerial of Arduino UNO | // Assuming HardwareSerial of Arduino UNO | ||
#include <dx2lib.h> | #include <dx2lib.h> | ||
- | // UART initialization | + | // Initialize UART |
uint32_t us_init (uint32_t baud) { | uint32_t us_init (uint32_t baud) { | ||
Serial.begin (baud); | Serial.begin (baud); | ||
Line 98: | Line 98: | ||
} | } | ||
- | // Changing the baud rate | + | // Changing the baudrate |
uint32_t us_setbaudrate (uint32_t baud) { | uint32_t us_setbaudrate (uint32_t baud) { | ||
us_deinit(); | us_deinit(); | ||
Line 134: | Line 134: | ||
}; | }; | ||
- | DX2LIB dx2 (& param); | + | DX2LIB dx2 ((DX2LIB::TDXHost_ConfParam *)&param); |
</pre> | </pre> | ||
}} | }} | ||
- | なおライブラリに同梱されるサンプルスケッチではこれらの通信処理関数は使い回しが効くように avr_uno_hardserial.h と avr_uno_softserial.h のヘッダファイルにまとめて記述してあります。 | + | なおライブラリに同梱されるサンプルスケッチでは '''avr_uno_hardserial.h''' と '''avr_uno_softserial.h''' のヘッダファイルにArduino UNOを前提としたこれらの通信処理関数がまとめて記述してあります。 |
-&color(#0099ff){''DXLIB/DX2LIB'' (const PDXHost_ConfParam param)};~ | -&color(#0099ff){''DXLIB/DX2LIB'' (const PDXHost_ConfParam param)};~ | ||
ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体'''TDXHost_ConfParam'''を指定した上でオブジェクトを生成できます。 | ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体'''TDXHost_ConfParam'''を指定した上でオブジェクトを生成できます。 | ||
#html{{ | #html{{ | ||
- | <pre class="brush: c;"> | + | <pre class="brush:c; highlight:[3,4,11];"> |
#include <dx2lib.h> | #include <dx2lib.h> | ||
- | // ソフトウェアシリアルを選択 | + | // Select SoftwareSerial |
//#include "avr_uno_hardserial.h" | //#include "avr_uno_hardserial.h" | ||
#include "avr_uno_softserial.h" | #include "avr_uno_softserial.h" | ||
- | // dxifの名前でDynamixel Protocol V.2 Libraryをインスタンス化 | ||
const DX2LIB::TDXHost_ConfParam param { | const DX2LIB::TDXHost_ConfParam param { | ||
us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush | us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush | ||
}; | }; | ||
- | DX2LIB dxif(& param); | + | // Instantiate Dynamixel Protocol V.2 Library with the name dxif |
+ | DX2LIB dxif((DX2LIB::TDXHost_ConfParam *)&param); | ||
</pre> | </pre> | ||
}} | }} | ||
Line 160: | Line 160: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // 生成されたdxifを57143bpsで初期化 | + | // Initialize dxif at 57143bps |
void setup() { | void setup() { | ||
dxif.begin (57143); | dxif.begin (57143); | ||
Line 169: | Line 169: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1へPingインストラクションパケットを送信 | + | // Send ping instruction packet to ID=1 |
dxif.TxPacket (1, 0x01, NULL, 0);</pre> | dxif.TxPacket (1, 0x01, NULL, 0);</pre> | ||
}} | }} | ||
Line 178: | Line 178: | ||
uint8_t buf[10], id, err; | uint8_t buf[10], id, err; | ||
uint16_t len; | uint16_t len; | ||
- | // ID=1へPingインストラクションパケットを送信 | + | // Send ping instruction packet to ID=1 |
dxif.TxPacket (1, 0x01, NULL, 0); | dxif.TxPacket (1, 0x01, NULL, 0); | ||
- | // ステータスパケットを受信 | + | // Receive status packet |
- | dxif.RxPacket (buf, sizeof (buf), &id, &len, &err)</pre> | + | dxif.RxPacket (buf, sizeof (buf), &id, &len, &err)</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadBlockData'' (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''ReadBlockData'' (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)};~ | ||
Line 188: | Line 188: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のComplianceを取得 | + | // Get Compliance for AX-12 with ID=1 |
uint8_t compliance[4]; | uint8_t compliance[4]; | ||
- | dxif.ReadBlockData (1, 26, &compliance, 4, NULL);</pre> | + | dxif.ReadBlockData (1, 26, &compliance, 4, NULL);</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadByteData'' (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''ReadByteData'' (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)};~ | ||
Line 196: | Line 196: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のLEDを取得 | + | // Get the status of the LED on AX-12 with ID=1 |
uint8_t led; | uint8_t led; | ||
- | dxif.ReadByteData (1, 25, &led, NULL);</pre> | + | dxif.ReadByteData (1, 25, &led, NULL);</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadWordData'' (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''ReadWordData'' (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)};~ | ||
Line 204: | Line 204: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12からPresentPositionを取得 | + | // Get PresentPosition from AX-12 with ID=1 |
uint16_t ppos; | uint16_t ppos; | ||
- | dxif.ReadWordData (id, 36, &ppos, NULL);</pre> | + | dxif.ReadWordData (id, 36, &ppos, NULL);</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~ | ||
Line 215: | Line 215: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のComplianceを設定 | + | // Set Compliance for AX-12 with ID=1 |
uint8_t err; | uint8_t err; | ||
uint8_t compliance[4] = {1,1,32,32}; | uint8_t compliance[4] = {1,1,32,32}; | ||
- | dxif.WriteBlockData (1, 26, &compliance, 4, &err);</pre> | + | dxif.WriteBlockData (1, 26, &compliance, 4, &err);</pre> |
}} | }} | ||
Line 225: | Line 225: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のLEDを点灯 | + | // Lights up the LED of AX-12 with ID=1 |
uint8_t err; | uint8_t err; | ||
- | dxif.WriteByteData (id, 25, 1, &err);</pre> | + | dxif.WriteByteData (id, 25, 1, &err);</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''WriteWordData'' (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''WriteWordData'' (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)};~ | ||
Line 233: | Line 233: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のGoalPositionを511に変更 | + | // Set GoalPosition of AX-12 with ID=1 to 511 |
dxif.WriteWordData (id, 30, 511, NULL);</pre> | dxif.WriteWordData (id, 30, 511, NULL);</pre> | ||
}} | }} | ||
Line 242: | Line 242: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1~5の5個のAX-12のLEDへ点滅を指令 | + | // Lights up AX-12 LEDs with ID=1 to 5 |
uint8_t ids={1,2,3,4,5}; | uint8_t ids={1,2,3,4,5}; | ||
uint16_t leds={1,1,1,1,1}; | uint16_t leds={1,1,1,1,1}; | ||
Line 251: | Line 251: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1~5の5個のAX-12に個別のGoalPositionを指令 | + | // Set different GoalPositions for each AX-12 with ID=1-5 |
uint8_t ids={1,2,3,4,5}; | uint8_t ids={1,2,3,4,5}; | ||
uint16_t poss={100,200,300,400,500}; | uint16_t poss={100,200,300,400,500}; | ||
Line 263: | Line 263: | ||
指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。 | 指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。 | ||
- | 以下はライブラリv1.5から新設されたAPIで、AVRシリーズを除いたターゲットで使用できます。 | + | 以降のAPIはライブラリv1.5から新設されたAPIで、AVRシリーズを除いたターゲットで使用できます。詳細は[[こちら>DXL_intuitive]]を参照してください。 |
+ | -&color(#0099ff){int DXLIB/DX2LIB::''ScanDevices'' (uint8_t *ids)}; | ||
+ | -&color(#0099ff){PDXL_ModelInfo DXLIB/DX2LIB::''GetModelInfo'' (uint8_t id)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''PrintDevicesList'' (int (*pf) (const char *, ...))}; | ||
+ | -&color(#0099ff){void DXLIB/DX2LIB::''InitDevicesList'' (void)}; | ||
+ | -&color(#0099ff){TErrorCode DXLIB/DX2LIB::''GetErrorCode'' (uint8_t id)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetHWErrorCode'' (uint8_t id, uint8_t *hwerr)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveMode'' (uint8_t id, uint8_t mode)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveModesEquival'' (const uint8_t *ids, int num, uint8_t mode)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingMode'' (uint8_t id, uint8_t mode)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingModesEquival'' (const uint8_t *ids, int num, uint8_t mode)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetOperatingMode'' (uint8_t id, uint8_t *mode)}; | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''SetLED'' (uint8_t id, bool en)}; | -&color(#0099ff){bool DXLIB/DX2LIB::''SetLED'' (uint8_t id, bool en)}; | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnable'' (uint8_t id, bool en)}; | -&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnable'' (uint8_t id, bool en)}; | ||
Line 294: | Line 305: | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWM'' (uint8_t id, double *pwm)}; | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWM'' (uint8_t id, double *pwm)}; | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWMs'' (const uint8_t *ids, double *pwms, int num)}; | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWMs'' (const uint8_t *ids, double *pwms, int num)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveMode'' (uint8_t id, uint8_t mode)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveModesEquival'' (const uint8_t *ids, int num, uint8_t mode)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingMode'' (uint8_t id, uint8_t mode)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingModesEquival'' (const uint8_t *ids, int num, uint8_t mode)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''GetOperatingMode'' (uint8_t id, uint8_t *mode)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''GetHWErrorCode'' (uint8_t id, uint8_t *hwerr)}; | ||
- | -&color(#0099ff){TErrorCode DXLIB/DX2LIB::''GetErrorCode'' (uint8_t id)}; | ||
- | -&color(#0099ff){PDXL_ModelInfo DXLIB/DX2LIB::''GetModelInfo'' (uint8_t id)}; | ||
- | -&color(#0099ff){int DXLIB/DX2LIB::''ScanDevices'' (uint8_t *ids)}; | ||
- | -&color(#0099ff){bool DXLIB/DX2LIB::''PrintDevicesList'' (int (*pf) (const char *, ...))}; | ||
- | -&color(#0099ff){void DXLIB/DX2LIB::''InitDevicesList'' (void)}; |