8: 2018-05-14 (月) 16:54:58 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が使用できるようになる。~
Line 45: Line 46:
 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]
API内で通信を行っている間に取得された最後のエラーコードを取り出す。~ API内で通信を行っている間に取得された最後のエラーコードを取り出す。~
Line 59: Line 64:
-使用例 -使用例
 +***DXL_GetHWErrorCode [#idee39df]
 + bool DXL_GetHWErrorCode (TDeviceID dvid, uint8_t id, uint8_t *hwerr);
 +
 +**動作モード [#k88cc2cf]
***DXL_SetOperatingMode [#r5844545] ***DXL_SetOperatingMode [#r5844545]
動作モードを指定IDへ指令する。~ 動作モードを指定IDへ指令する。~
Line 84: Line 93:
 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へ指令する。輝度や色の制御は対象外。~
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
- bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool en);+ bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en);
-パラメータ -パラメータ
--TDeviceID '''dvid''' --TDeviceID '''dvid'''
Line 99: Line 108:
-使用例 -使用例
-***DXL_GetTorqueEnable [#x3459343+***DXL_SetTorqueEnable [#qcf1eee1
-指定IDのトルクイネーブルを取得する。~+トルクイネーブルを指定IDへ指令する。~ 
 +なおプロトコルV1搭載モデルに角度やか角速度を指令すると、本APIに関わらず自動的にトルクイネーブルが1になる。~
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
- bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en);+ bool DXL_SetTorqueEnable (TDeviceID dvid, uint8_t id, bool en);
-パラメータ -パラメータ
--TDeviceID '''dvid''' --TDeviceID '''dvid'''
Line 113: Line 123:
-使用例 -使用例
-***DXL_SetLED [#kfc7a7c3+***DXL_SetTorqueEnables [#h2fda1c5
-LEDの明滅を指定IDへ指令する。輝度や色の制御は対象外。~+ bool DXL_SetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *ens, int num); 
 + 
 +***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テーブルを更新しておく必要がある。 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
- bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en);+ bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en);
-パラメータ -パラメータ
--TDeviceID '''dvid''' --TDeviceID '''dvid'''
Line 127: 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は動作範囲の中央とし、実際の精度は対象のデバイスに依存する。~
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
- bool DXL_SetGoalAngle(TDeviceID dvid, uint8_t id, double angle);+ bool DXL_SetGoalAngle (TDeviceID dvid, uint8_t id, double angle);
-パラメータ -パラメータ
--TDeviceID '''dvid''' --TDeviceID '''dvid'''
Line 146: Line 166:
ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。~ ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。~
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。 予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。
- bool DXL_SetGoalAngles(TDeviceID dvid, const uint8_t *ids, double *angles, int num);+ bool DXL_SetGoalAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num);
-パラメータ -パラメータ
--TDeviceID '''dvid''' --TDeviceID '''dvid'''
Line 173: 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 184: 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 198: 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 211: 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 224: 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 236: Line 257:
-使用例 -使用例
 +**電流制御 [#w69a8a82]
***DXL_SetGoalCurrent [#q16b45cf] ***DXL_SetGoalCurrent [#q16b45cf]
電流制御時の電流(mA)を指定IDへ指令する。 電流制御時の電流(mA)を指定IDへ指令する。
Line 287: 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 300: 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 311: 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]
構造体はいずれもアライメントを1バイトとする。 構造体はいずれもアライメントを1バイトとする。
:TDXL_ModelInfo | struct {&br;  uint16_t mo​delno;      // デバイス固有のモデル番号&br;  char name[16];&br;  TDXL_DevType devtype​;  // デバイスのグループ&br;  struct {               // 位置の範囲&br;    int32_t max;&br;    int32_t min;&br;  } p​ositionlimit;&br;  struct {               /​/ 角度の範囲&br;    double max;&br;    double min;&br;  } ang​lelimit;&br;  struct {               // 速度の範囲&br;    int32_t max;&br;    int32_t min;&br;  } v​elocitylimit;&br;  struct {               /​/ PWMの範囲&br;    int32_t max;&br;    int32_t min;&br;  } p​wmlimit;&br;  double velocityratio;     // ​角速度変換係数 [deg]&br;  double currentratio;       ​// 電流変換係数 [mA]&br;  double pwmratio;          // PWM​変換係数 [%]&br;} :TDXL_ModelInfo | struct {&br;  uint16_t mo​delno;      // デバイス固有のモデル番号&br;  char name[16];&br;  TDXL_DevType devtype​;  // デバイスのグループ&br;  struct {               // 位置の範囲&br;    int32_t max;&br;    int32_t min;&br;  } p​ositionlimit;&br;  struct {               /​/ 角度の範囲&br;    double max;&br;    double min;&br;  } ang​lelimit;&br;  struct {               // 速度の範囲&br;    int32_t max;&br;    int32_t min;&br;  } v​elocitylimit;&br;  struct {               /​/ PWMの範囲&br;    int32_t max;&br;    int32_t min;&br;  } p​wmlimit;&br;  double velocityratio;     // ​角速度変換係数 [deg]&br;  double currentratio;       ​// 電流変換係数 [mA]&br;  double pwmratio;          // PWM​変換係数 [%]&br;}


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom