8: 2023-03-15 (水) 07:20:45 takaboo[6] [7] | 9: 2023-03-15 (水) 07:21:59 takaboo[6] [8] | ||
---|---|---|---|
Line 6: | Line 6: | ||
-- | -- | ||
#ref(dxlib1.5beta_for_arduino.zip)~ | #ref(dxlib1.5beta_for_arduino.zip)~ | ||
- | ---現時点でβ版扱い | + | ---現時点で想定の全てを検証したものではないのでβ版扱い |
---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる7つのハンドラを新たに設置 | ---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる7つのハンドラを新たに設置 | ||
---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 | ---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 | ||
Line 46: | Line 46: | ||
DXLIB v1.5以降で使用できるヘッダファイルとAPIは以下の通りです。 | DXLIB v1.5以降で使用できるヘッダファイルとAPIは以下の通りです。 | ||
-&color(#0099ff){''dxlib.h''};~ | -&color(#0099ff){''dxlib.h''};~ | ||
- | [[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、'''dx2lib.h'''との共存はできません。 | + | [[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。'''dx2lib.h'''との共存は想定していません。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
Line 52: | Line 52: | ||
#include "avr_uno_softserial.h" | #include "avr_uno_softserial.h" | ||
const DXLIB::TDXHost_ConfParam param { | const DXLIB::TDXHost_ConfParam param { | ||
- | dx_init, dx_deinit, dx_setbaudrate, dx_rxpurge, dx_putc, dx_puts, dx_gets, dx_flush | + | us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush |
}; | }; | ||
Line 62: | Line 62: | ||
}} | }} | ||
-&color(#0099ff){''dx2lib.h''};~ | -&color(#0099ff){''dx2lib.h''};~ | ||
- | [[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、'''dxlib.h'''との共存はできません。 | + | [[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。'''dxlib.h'''との共存は想定していません。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | #include <dxlib.h> | + | #include <dx2lib.h> |
#include "avr_uno_softserial.h" | #include "avr_uno_softserial.h" | ||
- | const DX2LIB::TDX2Host_ConfParam param { | + | const DX2LIB::TDXHost_ConfParam param { |
- | dx_init, dx_deinit, dx_setbaudrate, dx_rxpurge, dx_putc, dx_puts, dx_gets, dx_flush | + | us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush |
}; | }; | ||
Line 77: | Line 77: | ||
}</pre> | }</pre> | ||
}} | }} | ||
+ | |||
+ | -&color(#0099ff){DXLIB/DX2LIB::''TDXHost_ConfParam''};~ | ||
+ | ライブラリv1.5より導入された通信を担う8つの関数のポインタを保持する構造体で、クラスをインスタンス化する際に引数として渡します。~ | ||
+ | 各メンバーの関数のプロトタイプに合わせた通信処理関数を予め作成しておく必要があります。 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // Assuming HardwareSerial of Arduino UNO | ||
+ | #include <dx2lib.h> | ||
+ | |||
+ | // UART initialization | ||
+ | uint32_t us_init (uint32_t baud) { | ||
+ | Serial.begin (baud); | ||
+ | Serial.setTimeout (20); | ||
+ | return baud; | ||
+ | } | ||
+ | |||
+ | // Terminate use of UART | ||
+ | void us_deinit (void) { | ||
+ | Serial.end(); | ||
+ | } | ||
+ | |||
+ | // Changing the baud rate | ||
+ | uint32_t us_setbaudrate (uint32_t baud) { | ||
+ | us_deinit(); | ||
+ | return us_init (baud); | ||
+ | } | ||
+ | |||
+ | // Purge receive buffer | ||
+ | void us_rxpurge (void) { | ||
+ | while (Serial.available()) Serial.read(); | ||
+ | } | ||
+ | |||
+ | // Send one byte | ||
+ | void us_putc (uint8_t c) { | ||
+ | Serial.write (c); | ||
+ | } | ||
+ | |||
+ | // Send specified number of bytes | ||
+ | void us_puts (const uint8_t *buf, int len) { | ||
+ | Serial.write (buf, len); | ||
+ | } | ||
+ | |||
+ | // Receive specified number of bytes (Timeout must be set in advance) | ||
+ | int us_gets (uint8_t *buf, int len) { | ||
+ | return Serial.readBytes (buf, len); | ||
+ | } | ||
+ | |||
+ | // Waiting for transmission completion | ||
+ | void us_flush (void) { | ||
+ | Serial.flush(); | ||
+ | } | ||
+ | |||
+ | // Enclose each communication function in a structure | ||
+ | const DX2LIB::TDXHost_ConfParam param { | ||
+ | us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush | ||
+ | }; | ||
+ | |||
+ | DX2LIB dx2 (& param); | ||
+ | </pre> | ||
+ | }} | ||
+ | なおライブラリに同梱されるサンプルスケッチではこれらの通信処理関数は使い回しが効くように avr_uno_hardserial.h と avr_uno_softserial.h のヘッダファイルにまとめて記述してあります。 | ||
-&color(#0099ff){''DXLIB/DX2LIB'' (const PDXHost_ConfParam param)};~ | -&color(#0099ff){''DXLIB/DX2LIB'' (const PDXHost_ConfParam param)};~ | ||
- | ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体指定した上でオブジェクトを生成できます。 | + | ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体'''TDXHost_ConfParam'''を指定した上でオブジェクトを生成できます。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | #include <dxlib.h> | + | #include <dx2lib.h> |
- | // ソフトウェアシリアルモードで使用 | + | // ソフトウェアシリアルを選択 |
//#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をインスタンス化 | // dxifの名前でDynamixel Protocol V.2 Libraryをインスタンス化 | ||
- | const DX2LIB::TDX2Host_ConfParam param { | + | const DX2LIB::TDXHost_ConfParam param { |
- | dx_init, dx_deinit, dx_setbaudrate, dx_rxpurge, dx_putc, dx_puts, dx_gets, dx_flush | + | us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush |
}; | }; | ||
Line 96: | Line 157: | ||
-&color(#0099ff){void DXLIB/DX2LIB::''begin'' (long baud)};~ | -&color(#0099ff){void DXLIB/DX2LIB::''begin'' (long baud)};~ | ||
ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~ | ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~ | ||
- | なお、選択したモードにより使用できるボーレートに制限があります。 | + | ボーレートの精度や範囲は使用するシリアルポートに依存します。 |
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
Line 201: | Line 262: | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''Reset'' (uint8_t id, uint16_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''Reset'' (uint8_t id, uint16_t *err)};~ | ||
指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。 | 指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。 | ||
+ | |||
+ | 以下はライブラリv1.5から新設されたAPIで、AVRシリーズを除いたターゲットで使用できます。 | ||
+ | -&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::''SetTorqueEnables'' (const uint8_t *ids, const bool *ens, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnablesEquival'' (const uint8_t *ids, int num, bool en)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetTorqueEnable'' (uint8_t id, bool *en)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetTorqueEnables'' (const uint8_t *ids, bool *en, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngle'' (uint8_t id, double angle)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngles'' (const uint8_t *ids, const double *angles, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentAngle'' (uint8_t id, double *angle)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentAngles'' (const uint8_t *ids, double *angles, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''StandStillAngle'' (uint8_t id)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''StandStillAngles'' (const uint8_t *ids, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalVelocity'' (uint8_t id, double velocity)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalVelocities'' (const uint8_t *ids, const double *velocities, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentVelocity'' (uint8_t id, double *velocity)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentVelocities'' (const uint8_t *ids, double *velocities, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndVelocity'' (uint8_t id, double angle, double velocity)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndVelocities'' (const uint8_t *ids, PAngleVelocity anglevelocity, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndTime'' (uint8_t id, double angle, double sec)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndTime'' (const uint8_t *ids, const double *angles, int num, double sec)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndTime2'' (uint8_t id, double angle, double sec)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndTime2'' (const uint8_t *ids, const double *angles, int num, double sec)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalCurrent'' (uint8_t id, double current)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalCurrents'' (const uint8_t *ids, const double *currents, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentCurrent'' (uint8_t id, double *current)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentCurrents'' (const uint8_t *ids, double *currents, int num)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalPWM'' (uint8_t id, double pwm)}; | ||
+ | -&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalPWMs'' (const uint8_t *ids, const double *pwms, int num)}; | ||
+ | -&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::''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)}; |
(This host) = http://www.besttechnology.co.jp