5: 2017-12-22 (金) 00:34:28 takaboo | 現: 2018-06-11 (月) 19:17:14 takaboo | ||
---|---|---|---|
Line 2: | Line 2: | ||
ここで紹介するAPIは具体的なアドレスやコントロールテーブル上のアイテムが扱う数値範囲といったものを一切排除し、Dynamixelの基本的な操作に注力できるように物理値を元に制御することを目的としています。IDとボーレートさえ明確になっていればモデルの差異はAPI内でほとんど吸収しますので、使用するモデルが変わったとしても大抵の場合プログラムの改変すら必要無くなります。 | ここで紹介するAPIは具体的なアドレスやコントロールテーブル上のアイテムが扱う数値範囲といったものを一切排除し、Dynamixelの基本的な操作に注力できるように物理値を元に制御することを目的としています。IDとボーレートさえ明確になっていればモデルの差異はAPI内でほとんど吸収しますので、使用するモデルが変わったとしても大抵の場合プログラムの改変すら必要無くなります。 | ||
+ | **初期設定関連 [#e66fff8c] | ||
***DXL_ScanDevices [#o2bbf83a] | ***DXL_ScanDevices [#o2bbf83a] | ||
全IDのレンジでデバイスをスキャンし、成功したIDのみライブラリ内のテーブルにその情報が反映され、以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与されるAPIが使用できるようになる。~ | 全IDのレンジでデバイスをスキャンし、成功したIDのみライブラリ内のテーブルにその情報が反映され、以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与されるAPIが使用できるようになる。~ | ||
ライブラリ内のテーブルが更新されないまま存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。~ | ライブラリ内のテーブルが更新されないまま存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。~ | ||
また全IDをスキャンし終えるまでには時間がかかるため、IDが明確にわかっている場合はDXL_GetModelInfoの使用を推奨する。 | また全IDをスキャンし終えるまでには時間がかかるため、IDが明確にわかっている場合はDXL_GetModelInfoの使用を推奨する。 | ||
- | int DXL_ScanDevices(TDeviceID dvid); | + | int DXL_ScanDevices(TDeviceID dvid, uint8_t *ids); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
~オープン済のDeviceIDを指定。~ | ~オープン済のDeviceIDを指定。~ | ||
+ | --uint8_t *'''ids''' | ||
+ | ~検索された全IDをストアする配列のポインタ。不要ならNULLを指定。~ | ||
-戻り値 | -戻り値 | ||
--bool~ | --bool~ | ||
Line 15: | Line 18: | ||
-使用例 | -使用例 | ||
TDeviceID dev; | TDeviceID dev; | ||
+ | uint8_t ids[255], num = 0; | ||
// COM10を57600bpsでオープン | // COM10を57600bpsでオープン | ||
dev = DX_OpenPort ("\\\\.\\COM10", 9600); | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | ||
// デバイスをスキャン | // デバイスをスキャン | ||
- | DXL_ScanDevices (dev); | + | num = DXL_ScanDevices (dev, &ids); |
***DXL_GetModelInfo [#j50f584f] | ***DXL_GetModelInfo [#j50f584f] | ||
- | 指定IDのデバイス情報の読み出しに成功するとライブラリ内のテーブルにその情報が反映され、以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与されるAPIが使用できるようになる。~ | + | 指定IDのデバイス情報の読み出しに成功すると、ライブラリ内のIDテーブルに現在の動作モードとモデルを記憶し、デバイスのReturn Delay Timeが0でなければトルクディスエーブルした後に0を書き込む。以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与された物理値の指令ないし取得等を行うAPIは、指定されたIDが実態を持つものとして処理される。~ |
- | ライブラリ内のテーブルが更新されないまま存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。 | + | ライブラリ内のテーブルを更新しない場合、実際に存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。 |
TDXL_ModelInfo *DXL_GetModelInfo(TDeviceID dvid, uint8_t id); | TDXL_ModelInfo *DXL_GetModelInfo(TDeviceID dvid, uint8_t id); | ||
- | |||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 35: | Line 38: | ||
-使用例 | -使用例 | ||
TDeviceID dev; | TDeviceID dev; | ||
- | // COM10を57600bpsでオープン | + | dev = DX_OpenPort ("/dev/ttyUSB0", 57600); |
- | dev = DX_OpenPort ("\\\\.\\COM10", 57600); | + | // ID=1のデバイス情報から内部テーブルを更新し、かつモデル名を取得 |
- | // ID=1のデバイス情報を取得 | + | printf("%s", DXL_GetModelInfo (dev, 1).name); |
- | DXL_GetModelInfo (dev, 1); | + | |
***DXL_PrintDevicesList [#s3fd9115] | ***DXL_PrintDevicesList [#s3fd9115] | ||
- | 内部のテーブルに反映された存在するデバイスの全リストをコンソールに出力する。デバッグ用。 | + | DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルに反映されたデバイスの全リストをコンソールに出力する。デバッグ用。 |
bool DXL_PrintDevicesList(int *pf(const char *, ...)); | bool DXL_PrintDevicesList(int *pf(const char *, ...)); | ||
+ | ***DXL_InitDevicesList [#wa90dfcd] | ||
+ | void DXL_InitDevicesList (void); | ||
+ | |||
+ | **エラー [#q9dc36d1] | ||
***DXL_GetErrorCode [#l99bda3b] | ***DXL_GetErrorCode [#l99bda3b] | ||
- | Xシリーズなどのコントロールテーブル上にハードウェアエラーの情報がある場合に限りその値を取得する。 | + | API内で通信を行っている間に取得された最後のエラーコードを取り出す。~ |
+ | DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
TErrorCode DXL_GetErrorCode(TDeviceID dvid, uint8_t id); | TErrorCode DXL_GetErrorCode(TDeviceID dvid, uint8_t id); | ||
-パラメータ | -パラメータ | ||
Line 53: | Line 60: | ||
~検索対象のIDを指定。~ | ~検索対象のIDを指定。~ | ||
-戻り値 | -戻り値 | ||
- | --bool~ | + | --TErrorCode |
- | ~成功するとTure、失敗するとFalseを返す。~ | + | ~未検索のIDを指定すると0xFFFFを返す。~ |
-使用例 | -使用例 | ||
+ | ***DXL_GetHWErrorCode [#idee39df] | ||
+ | bool DXL_GetHWErrorCode (TDeviceID dvid, uint8_t id, uint8_t *hwerr); | ||
+ | |||
+ | **動作モード [#k88cc2cf] | ||
***DXL_SetOperatingMode [#r5844545] | ***DXL_SetOperatingMode [#r5844545] | ||
動作モードを指定IDへ指令する。~ | 動作モードを指定IDへ指令する。~ | ||
- | 設定時にトルクがディスエーブルされる。また、デバイスがサポートしないモードを指定した場合はエラーとなるため、必ず戻り値を取得して可否を判断すること。 | + | デバイスの動作モードと指令値が異なる場合はトルクをディスエーブルした後に指令値に更新される。また、デバイスがサポートしないモードを指定した場合はエラーとなるため、必ず戻り値を取得して可否を判断すること。~ |
+ | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
bool DXL_SetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t mode); | bool DXL_SetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t mode); | ||
Line 70: | Line 82: | ||
|5|Current-Base Position Control Mode|電流制限付き位置制御。マルチターンを許容。| | |5|Current-Base Position Control Mode|電流制限付き位置制御。マルチターンを許容。| | ||
|16|PWM Control Mode|PWMのデューティー比を制御。| | |16|PWM Control Mode|PWMのデューティー比を制御。| | ||
+ | |||
+ | ***DXL_SetOperatingModesEquival [#jae960fc] | ||
+ | 複数軸に対して単一の動作モードを指令する。~ | ||
+ | ~ | ||
+ | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
***DXL_GetOperatingMode [#x7567d67] | ***DXL_GetOperatingMode [#x7567d67] | ||
指定IDの動作モードを取得する。~ | 指定IDの動作モードを取得する。~ | ||
+ | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
bool DXL_GetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t *mode); | bool DXL_GetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t *mode); | ||
- | ***DXL_SetTorqueEnable [#qcf1eee1] | + | **LED, 制御ON/OFF [#f6bb908f] |
- | トルクイネーブルを指定IDへ指令する。~ | + | ***DXL_SetLED [#kfc7a7c3] |
- | なおプロトコルV1搭載モデルに角度や回転数を指令すると、本APIに関わらず自動的にトルクイネーブルが1になる。 | + | LEDの明滅を指定IDへ指令する。輝度や色の制御は対象外。~ |
- | bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool en); | + | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 |
+ | bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 89: | Line 108: | ||
-使用例 | -使用例 | ||
- | ***DXL_GetTorqueEnable [#x3459343] | + | ***DXL_SetTorqueEnable [#qcf1eee1] |
- | 指定IDのトルクイネーブルを取得する。~ | + | トルクイネーブルを指定IDへ指令する。~ |
- | bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en); | + | なおプロトコルV1搭載モデルに角度やか角速度を指令すると、本APIに関わらず自動的にトルクイネーブルが1になる。~ |
+ | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
+ | bool DXL_SetTorqueEnable (TDeviceID dvid, uint8_t id, bool en); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 102: | Line 123: | ||
-使用例 | -使用例 | ||
- | ***DXL_SetLED [#kfc7a7c3] | + | ***DXL_SetTorqueEnables [#h2fda1c5] |
- | LEDの明滅を指定IDへ指令する。輝度や色の制御は対象外。 | + | bool DXL_SetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *ens, int num); |
- | bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en); | + | |
+ | ***DXL_SetTorqueEnablesEquival [#g6ca89aa] | ||
+ | bool DXL_SetTorqueEnablesEquival (TDeviceID dvid, const uint8_t *ids, int num, bool en); | ||
+ | |||
+ | ***DXL_GetTorqueEnable [#x3459343] | ||
+ | 指定IDのトルクイネーブルを取得する。~ | ||
+ | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 | ||
+ | bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 115: | Line 143: | ||
-使用例 | -使用例 | ||
+ | ***DXL_GetTorqueEnables [#ba7b960c] | ||
+ | bool DXL_GetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *en, int num); | ||
+ | |||
+ | **角度制御 [#d23a0ca1] | ||
***DXL_SetGoalAngle [#zde96bae] | ***DXL_SetGoalAngle [#zde96bae] | ||
位置決め制御時の角度(deg)を指定IDへ指令する。~ | 位置決め制御時の角度(deg)を指定IDへ指令する。~ | ||
- | 0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。 | + | 0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。~ |
- | bool DXL_SetGoalAngle(TDeviceID dvid, uint8_t id, double angle); | + | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 |
+ | bool DXL_SetGoalAngle (TDeviceID dvid, uint8_t id, double angle); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 131: | Line 164: | ||
***DXL_SetGoalAngles [#h7eadf0c] | ***DXL_SetGoalAngles [#h7eadf0c] | ||
複数軸に対して位置決め制御時の角度(deg)を指令する。~ | 複数軸に対して位置決め制御時の角度(deg)を指令する。~ | ||
- | ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。 | + | ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。~ |
- | bool DXL_SetGoalAngles(TDeviceID dvid, const uint8_t *ids, double *angles, int num); | + | 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 |
+ | bool DXL_SetGoalAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 159: | Line 193: | ||
***DXL_GetPresentAngles [#b48cfc6a] | ***DXL_GetPresentAngles [#b48cfc6a] | ||
複数軸の現在の角度(deg)を取得する。 | 複数軸の現在の角度(deg)を取得する。 | ||
- | bool DXL_GetPresentAngles(TDeviceID dvid, const uint8_t *ids, double *angles, int num); | + | bool DXL_GetPresentAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 170: | Line 204: | ||
-使用例 | -使用例 | ||
- | ***DXL_SetGoalRPM [#xe33092b] | + | **速度制御 [#w053b450] |
- | 速度制御時の回転速度(rpm)を指定IDへ指令する。~ | + | ***DXL_SetGoalVelocity [#xe33092b] |
- | モデルによっては位置決め制御時と速度制御時のアイテが同じなため、動作モードを切り替えながら運用すると、以前指令された回転速度値を引き継いで動作してしまう場合がある。 | + | 速度制御時の角速度(deg/s)を指定IDへ指令する。~ |
- | bool DXL_SetGoalRPM(TDeviceID dvid, uint8_t id, double rpm); | + | モデルによっては位置決め制御時と速度制御時のアイテが同じなため、動作モードを切り替えながら運用すると、以前指令された角速度値を引き継いで動作してしまう場合がある。 |
+ | bool DXL_SetGoalVelocity (TDeviceID dvid, uint8_t id, double velocity); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 184: | Line 219: | ||
-使用例 | -使用例 | ||
- | ***DXL_SetGoalRPMs [#td88fd42] | + | ***DXL_SetGoalVelocities [#td88fd42] |
- | 複数軸に対して速度制御時の回転速度(rpm)を指令する。 | + | 複数軸に対して速度制御時の角速度(deg/s)を指令する。 |
- | bool DXL_SetGoalRPMs(TDeviceID dvid, const uint8_t *ids, double *rpms, int num); | + | bool DXL_SetGoalVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 197: | Line 232: | ||
-使用例 | -使用例 | ||
- | ***DXL_GetPresentRPM [#ibd89474] | + | ***DXL_GetPresentVelocity [#ibd89474] |
- | 指定IDの現在の回転速度(rpm)を取得する。 | + | 指定IDの現在の角速度(deg/s)を取得する。 |
- | bool DXL_GetPresentRPM(TDeviceID dvid, uint8_t id, double *rpm); | + | bool DXL_GetPresentVelocity (TDeviceID dvid, uint8_t id, double *velocity); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 210: | Line 245: | ||
-使用例 | -使用例 | ||
- | ***DXL_GetPresentRPMs [#ge163793] | + | ***DXL_GetPresentVelocities [#ge163793] |
- | bool DXL_GetPresentRPMs(TDeviceID dvid, const uint8_t *ids, double *rpms, int num); | + | bool DXL_GetPresentVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 222: | Line 257: | ||
-使用例 | -使用例 | ||
+ | **電流制御 [#w69a8a82] | ||
***DXL_SetGoalCurrent [#q16b45cf] | ***DXL_SetGoalCurrent [#q16b45cf] | ||
電流制御時の電流(mA)を指定IDへ指令する。 | 電流制御時の電流(mA)を指定IDへ指令する。 | ||
Line 273: | Line 309: | ||
-使用例 | -使用例 | ||
- | ***DXL_SetGoalAngleAndRPM [#g075e425] | + | **角度と速度 [#c4381b31] |
- | 位置制御時の角度(deg)と回転速度(rpm)を指定IDへ指令する。 | + | ***DXL_SetGoalAngleAndVelocity [#g075e425] |
- | bool DXL_SetGoalAngleAndRPM(TDeviceID dvid, uint8_t id, double angle, double rpm); | + | 位置制御時の角度(deg)と角速度(deg/s)を指定IDへ指令する。 |
+ | bool DXL_SetGoalAngleAndVelocity (TDeviceID dvid, uint8_t id, double angle, double velocity); | ||
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 286: | Line 323: | ||
-使用例 | -使用例 | ||
- | ***DXL_SetGoalAngleAndRPMs [#qd594eb3] | + | ***DXL_SetGoalAnglesAndVelocities [#qd594eb3] |
- | bool DXL_SetGoalAngleAndRPMs(TDeviceID dvid, PAngleRPM anglerpm, int num); | + | bool DXL_SetGoalAnglesAndVelocities (TDeviceID dvid, uint8_t *ids, PAngleVelocity anglevelocity, int num); |
-パラメータ | -パラメータ | ||
--TDeviceID '''dvid''' | --TDeviceID '''dvid''' | ||
Line 297: | Line 334: | ||
~成功するとTure、失敗するとFalseを返す。~ | ~成功するとTure、失敗するとFalseを返す。~ | ||
-使用例 | -使用例 | ||
+ | |||
+ | **角度と時間 [#k9377326] | ||
+ | ***DXL_SetGoalAngleAndTime [#oc49d9e5] | ||
+ | bool DXL_SetGoalAngleAndTime (TDeviceID dvid, uint8_t id, double angle, double sec); | ||
+ | |||
+ | ***DXL_SetGoalAnglesAndTime [#z0555863] | ||
+ | bool DXL_SetGoalAnglesAndTime (TDeviceID dvid, const uint8_t *ids, double *angles, int num, double sec); | ||
+ | |||
***オリジナルな定義 [#x4875c27] | ***オリジナルな定義 [#x4875c27] | ||
- | &aname(TDXL_ModelInfo); | + | 構造体はいずれもアライメントを1バイトとする。 |
- | :TDXL_ModelInfo | struct {&br; uint16_t modelno; // デバイス固有のモデル番号&br; char name[15];&br; TDXL_DevType devtype; // デバイスのグループ&br; struct { // 位置の範囲&br; int32_t max;&br; int32_t min;&br; } positionlimit;&br; struct { // 速度の範囲&br; int32_t max;&br; int32_t min;&br; } velocitylimit;&br; double offsetangle; // 中点 0[deg]&br; double angleratio; // 角度変換係数 [deg]&br; double rpmratio; // 速度変換係数 [rpm]&br; double currentratio; // 電流変換係数 [mA]&br;} | + | :TDXL_ModelInfo | struct {&br; uint16_t modelno; // デバイス固有のモデル番号&br; char name[16];&br; TDXL_DevType devtype; // デバイスのグループ&br; struct { // 位置の範囲&br; int32_t max;&br; int32_t min;&br; } positionlimit;&br; struct { // 角度の範囲&br; double max;&br; double min;&br; } anglelimit;&br; struct { // 速度の範囲&br; int32_t max;&br; int32_t min;&br; } velocitylimit;&br; struct { // PWMの範囲&br; int32_t max;&br; int32_t min;&br; } pwmlimit;&br; double velocityratio; // 角速度変換係数 [deg]&br; double currentratio; // 電流変換係数 [mA]&br; double pwmratio; // PWM変換係数 [%]&br;} |