DXLIBないしDX2LIBのAPIはデバイスのコントロールテーブルにアクセスすることを目的としているため、Dynamixelシリーズの各モデルの差異はユーザプログラムに委ねられています。
ここで紹介するAPIは具体的なアドレスやコントロールテーブル上のアイテムが扱う数値範囲といったものを一切排除し、Dynamixelの基本的な操作に注力できるように物理値を元に制御することを目的としています。IDとボーレートさえ明確になっていればモデルの差異はAPI内でほとんど吸収しますので、使用するモデルが変わったとしても大抵の場合プログラムの改変すら必要無くなります。
全IDのレンジでデバイスをスキャンし、成功したIDのみライブラリ内のテーブルにその情報が反映され、以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与されるAPIが使用できるようになる。
ライブラリ内のテーブルが更新されないまま存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。
また全IDをスキャンし終えるまでには時間がかかるため、IDが明確にわかっている場合はDXL_GetModelInfoの使用を推奨する。
int DXL_ScanDevices(TDeviceID dvid, uint8_t *ids);
オープン済のDeviceIDを指定。
検索された全IDをストアする配列のポインタ。不要ならNULLを指定。
検出されたデバイスの数を返す。
TDeviceID dev; uint8_t ids[255], num = 0; // COM10を57600bpsでオープン dev = DX_OpenPort ("\\\\.\\COM10", 9600); // デバイスをスキャン num = DXL_ScanDevices (dev, &ids);
指定IDのデバイス情報の読み出しに成功すると、ライブラリ内のIDテーブルに現在の動作モードとモデルを記憶し、デバイスのReturn Delay Timeが0でなければトルクディスエーブルした後に0を書き込む。以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与された物理値の指令ないし取得等を行うAPIは、指定されたIDが実態を持つものとして処理される。
ライブラリ内のテーブルを更新しない場合、実際に存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。
TDXL_ModelInfo *DXL_GetModelInfo(TDeviceID dvid, uint8_t id);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
内部のDynamixelの情報と一致するテーブルのポインタを返す。
TDeviceID dev; dev = DX_OpenPort ("/dev/ttyUSB0", 57600); // ID=1のデバイス情報から内部テーブルを更新し、かつモデル名を取得 printf("%s", DXL_GetModelInfo (dev, 1).name);
DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルに反映されたデバイスの全リストをコンソールに出力する。デバッグ用。
bool DXL_PrintDevicesList(int *pf(const char *, ...));
void DXL_InitDevicesList (void);
API内で通信を行っている間に取得された最後のエラーコードを取り出す。
DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
TErrorCode DXL_GetErrorCode(TDeviceID dvid, uint8_t id);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
未検索のIDを指定すると0xFFFFを返す。
bool DXL_GetHWErrorCode (TDeviceID dvid, uint8_t id, uint8_t *hwerr);
動作モードを指定IDへ指令する。
デバイスの動作モードと指令値が異なる場合はトルクをディスエーブルした後に指令値に更新される。また、デバイスがサポートしないモードを指定した場合はエラーとなるため、必ず戻り値を取得して可否を判断すること。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t mode);
Value | Mode | Description |
0 | Current Control Mode | 電流制御。位置及び速度制御は行わない。 |
1 | Velocity Control Mode | 速度制御。位置及び電流制御は行わない。 |
3 | Position Control Mode | 位置制御。 |
4 | Extended Position Control Mode | 拡張位置制御。マルチターンを許容。 |
5 | Current-Base Position Control Mode | 電流制限付き位置制御。マルチターンを許容。 |
16 | PWM Control Mode | PWMのデューティー比を制御。 |
複数軸に対して単一の動作モードを指令する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
指定IDの動作モードを取得する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_GetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t *mode);
LEDの明滅を指定IDへ指令する。輝度や色の制御は対象外。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
トルクイネーブルを指定IDへ指令する。
なおプロトコルV1搭載モデルに角度やか角速度を指令すると、本APIに関わらず自動的にトルクイネーブルが1になる。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetTorqueEnable (TDeviceID dvid, uint8_t id, bool en);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_SetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *ens, int num);
bool DXL_SetTorqueEnablesEquival (TDeviceID dvid, const uint8_t *ids, int num, bool en);
指定IDのトルクイネーブルを取得する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_GetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *en, int num);
位置決め制御時の角度(deg)を指定IDへ指令する。
0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetGoalAngle (TDeviceID dvid, uint8_t id, double angle);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
複数軸に対して位置決め制御時の角度(deg)を指令する。
ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
bool DXL_SetGoalAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
指定IDの現在の角度(deg)を取得する。
0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。また、制御モードやモデルによって取得される数値範囲に差がある。
bool DXL_GetPresentAngle(TDeviceID dvid, uint8_t id, double *angle);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
複数軸の現在の角度(deg)を取得する。
bool DXL_GetPresentAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
速度制御時の角速度(deg/s)を指定IDへ指令する。
モデルによっては位置決め制御時と速度制御時のアイテが同じなため、動作モードを切り替えながら運用すると、以前指令された角速度値を引き継いで動作してしまう場合がある。
bool DXL_SetGoalVelocity (TDeviceID dvid, uint8_t id, double velocity);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
複数軸に対して速度制御時の角速度(deg/s)を指令する。
bool DXL_SetGoalVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
指定IDの現在の角速度(deg/s)を取得する。
bool DXL_GetPresentVelocity (TDeviceID dvid, uint8_t id, double *velocity);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_GetPresentVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
電流制御時の電流(mA)を指定IDへ指令する。
bool DXL_SetGoalCurrent(TDeviceID dvid, uint8_t id, double current);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_SetGoalCurrents(TDeviceID dvid, const uint8_t *ids, double *currents, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
現在の電流(mA)を取得する。
電流計測をサポートしないデバイスの場合は負荷を取得し、仕様上のストール電流を乗じたものとなる。
bool DXL_GetPresentCurrent(TDeviceID dvid, uint8_t id, double *current);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_GetPresentCurrents(TDeviceID dvid, const uint8_t *ids, double *current, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
位置制御時の角度(deg)と角速度(deg/s)を指定IDへ指令する。
bool DXL_SetGoalAngleAndVelocity (TDeviceID dvid, uint8_t id, double angle, double velocity);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_SetGoalAnglesAndVelocities (TDeviceID dvid, uint8_t *ids, PAngleVelocity anglevelocity, int num);
オープン済のDeviceIDを指定。
検索対象のIDを指定。
成功するとTure、失敗するとFalseを返す。
bool DXL_SetGoalAngleAndTime (TDeviceID dvid, uint8_t id, double angle, double sec);
bool DXL_SetGoalAnglesAndTime (TDeviceID dvid, const uint8_t *ids, double *angles, int num, double sec);
構造体はいずれもアライメントを1バイトとする。
(This host) = https://www.besttechnology.co.jp