FREEDOM IIIライブラリVer.4.5は、FDIII-HCとDynamixelシリーズで構成されたアプリケーションを効率的に運用するためのライブラリです。
アクチュエータのIDやアクチュエータの位置を角度に変換するパラメータを元に、各アクチュエータを連動して動かしたり、アクチュエータの持つ情報を取得するといったアプリケーションレベルにおいて最低限必要な機能を本ライブラリでカバーします。
なお、本ライブラリはその外のライブラリ(SAM7S, SAM7S_TOPPERS等)を静的に使用していますので、ベンダーから提供されるGCC Developer Liteをインストールする際は、各コンポーネントを手動で選択することなくフルインストールした環境で使用して下さい。また、全てのソースもインストールと同時に展開されますので、必要に応じて参照できます。
本ライブラリで提供されるAPIのプロトタイプ宣言や特殊な構造体はfd.hに集約されています。このヘッダファイルに宣言が無いAPIは使用しないで下さい。
機能別にAPIの詳細を解説します。主なコンテンツを以下に紹介します。
旧来に比べかなりのボリュームになっていますが、実際には全てを使うわけではありません。必要に応じてAPIを使用してユーザアプリケーションを構成します。まずはFDIII-HCのサンプルプログラムを一通り実行して、動作を確認する事を推奨します。
FREEDOM IIIライブラリはToppersに依存しており、予め予約されたリソースのうちユーザに解放しているものであれば自由に使用できます。主な恩恵は複数のタスクが使用できることにあります。
各タスクで利用できるスタックはカーネルのコンフィギュレーションで2kバイトに固定されています。大きなメモリを必要とする処理(変数の宣言やネストが深い関数の呼び出し)を行うと容易にスタックがフローします。
TASK5はライブラリ内で使用済みとなりますので、ユーザプログラムから制御してはなりません。その他のリソースについてもライブラリ内で使用済みなものがいつくか存在しますので、詳細はライブラリのソースにて確認してください。
なお、ToppersのAPIに関してはここでは触れませんので、具体的な使い方等についてはサンプルプログラムで確認してください。
起動からの経過時間を1ms単位で取得する。
uint32_t fd_ElapsedTime (void);
なし
0~: 経過時間[ms]
#include <fd.h> int main (void) { while (!fd_rx_buff ()) { int ms = fd_ElapsedTime (); int s = (ms / 1000) % 60; int m = (ms / 60000) % 60; int h = (ms / 360000) % 24; fd_printf ("\r %02d:%02d:%02d.%02d", h, m, s, (ms % 1000) / 10); fd_Wait (10); } }
タスク起床待ち状態に移行させる。内部ではtslp_tskに置き換えられるため、tslp_tskをそのまま使っても同等の処理となる。
なお、プリエンプティブ・マルチタスクを活性化する機能(fd_EnableAutoRotateReadyQueue)はデフォルトでONとなっているため、本APIを時間がかかる処理やループ内に適宜挿入して意図的にディスパッチを促す必要はないが、OFFの場合は他のタスク(ライブラリで使用しているTASK5も含む)の期待する動作が阻害される場合がある。
ER fd_Wait (TMO tmout);
タイムアウト[ms]指定なら正の値
他、TMO_POL TMO_FEVR
E_OK: 正常終了
E_PAR: パラメータエラー
E_RLWAI: 待ち状態の強制解除
E_TMOUT: ポーリング失敗もしくはタイムアウト
実行中のアプリケーションプログラムを強制終了し、ブートローダへ移行する。なお、mainから抜けると同様の処理が行われる。
void fd_SoftReset (void);
なし
なし
fd_SoftResetないしmainからリターンした事による終了を検出する。
bool fd_GetShutdownState (void);
なし
true: 終了処理中
1ms単位で励起されるレディーキューの強制自動回転を許可する。許可されるとプリエンプティブ・マルチタスクなOSとして利用できる。
void fd_EnableAutoRotateReadyQueue (bool en);
true: 許可
false: 禁止 (デフォルト)
なし
mainタスクから呼ばれるユーザ用に解放されたコールバック関数。mainタスクでライブラリ内で必要となる最低限の初期化処理が行われた後、本main関数が呼ばれる。main関数の宣言が無いと即時終了するプログラムとなる。
int main (void);
#include <fd.h> void main (void) { while (!fd_GetPB ()) { fd_Wait (10); } }
TASK1から呼ばれるユーザ用関数。実質TASK1として扱って構わない。
void USER_TASK1 (void);
#include <fd.h> void USER_TASK1 (void) { static bool led = false; while (!fd_GetShutdownState ()) { fd_SetLed ((led = !led)); fd_Wait (300); } } void main (void) { act_tsk (TASK1); while (!fd_GetPB ()) { fd_Wait (10); } }
TASK2から呼ばれるユーザ用関数。実質TASK2として扱って構わない。
void USER_TASK2 (void);
#include <fd.h> void USER_TASK2 (void) { static bool led = false; while (!fd_GetShutdownState ()) { fd_PlayMusic (false, "L9o4c9"); fd_Wait (1000); } } void main (void) { act_tsk (TASK2); while (!fd_GetPB ()) { fd_Wait (10); } }
TASK3から呼ばれるユーザ用関数。実質TASK3として扱って構わない。
void USER_TASK3 (void);
#include <fd.h> void USER_TASK3 (void) { while (!fd_GetShutdownState ()) { fd_putc ('.'); fd_Wait (200); } } void main (void) { act_tsk (TASK3); while (!fd_GetPB ()) { fd_Wait (10); } }
TASK4から呼ばれるユーザ用関数。実質TASK4として扱って構わない。
void USER_TASK4 (void);
#include <fd.h> void USER_TASK4 (void) { int c; while (!fd_GetShutdownState ()) { rcv_dtq (DTQ1, (VP_INT*)&c); fd_putc (c); if (c == '\33') break; } fd_SoftReset (); } void main (void) { char c; act_tsk (TASK4); fd_puts ("\nSMPL3 START\n"); while (!fd_GetShutdownState ()) { if (fd_rx_buff ()) { while (fd_rx_buff ()) { c = fd_getc (); snd_dtq (DTQ1, c); } } fd_Wait (10); } }
モーションの再生等に使用されるホームポジション値及びネットワークに接続されるデバイスの諸元(ID・動作範囲・各種リミッタ等)の設定を行う。本API を実行しなければモーション等は再生できない。
fd_GetInitalizedSpecにてパラメータの初期化が既に行われているかの判断ができる。
なお、諸元データ内にアクチュエータのパラメータが記述されておりfd_SetUVThresholdで指定された電圧を超えていれば、本APIにて各アクチュエータと通信を行い、それらパラメータの設定が行われる。また、それに伴いアクチュエータの出力軸が現在の位置にロックされる。また、モーションが停止するまで待つため、fd_StopMotionで該当モーションを停止させてから呼び出すことを推奨する。
void fd_SetSpec (const PHomePosition hp, const TSpec *svp, int size);
ホームポジションを保持したTHomePosition構造体の変数のアドレス
ホームポジションは全ての動作の基準となるアクチュエータの初期位置(0~1023 の値)であり角度ではない
使用する全アクチュエータに関する情報を保持したTSpec構造体の変数のアドレス
psvで指定したTSpecの配列の個数
fd_SpecSizeマクロを使用すると簡便に算出できる
なし
#include <fd.h> // 諸元 const TSpec Spec[] = { // id device offset gain min max speed trq. comp. { 1, DEV_RX28, fd_AxisOfs(0), +341, { 0, 1023}, 0, 1023, { 1, 1, 32, 32} }, { 2, DEV_RX28, fd_AxisOfs(1), +341, { 0, 1023}, 0, 1023, { 1, 1, 32, 32} }, { 3, DEV_RX28, fd_AxisOfs(2), +331, { 0, 1023}, 0, 1023, { 1, 1, 32, 32} }, }; // ホームポジションデータ THomePosition HomePosition = { 512, 512, 512}; void main (void) { fd_SetSpec (&HomePosition, Spec, fd_SpecSize (Spec)); }
fd_SetSpecによって必要な初期化がなされているかの状態を取得する。
bool fd_GetInitalizedSpec (void);
なし
true: fd_SetSpecによって初期化済み
false: 未初期化
ホームポジションを再設定する。
void fd_SetHomePosition (const PHomePosition hp);
ホームポジションを保持したTHomePosition構造体の変数のアドレス
ホームポジションは全ての動作の基準となるアクチュエータの初期位置(0~1023ないし0~4095の値)を定義したものであり角度ではない
なし
ビープを発音する条件をORで設定する。0の指定ないしデフォルトでは各条件が発生しても無音となる。
void fd_SetBeepCondition (uint8_t beep);
ビープ発音条件
各ビットの割り当ては以下の通り
#define FD_BEEP_BOOTUP (1 << 0) // 起動直後 #define FD_BEEP_LOWVOLTAGE (1 << 1) // 低電圧検出 #define FD_BEEP_PACKETERR (1 << 2) // パケットエラーないしアラーム #define FD_BEEP_MMI (1 << 3) // DIP/PB操作時
なし
#include <fd.h> void main (void) { // 全部入り fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); fd_SetUVThreshold (7.4); }
FDIII-HCに印加される電源の電圧低下を検出する際の閾値を設定する。電圧低下を検出するとfd_SetBeepConditionにてFD_BEEP_LOWVOLTAGEが指定されている際にアラーム音が発生する他、デバイスとの通信を伴う一部のAPIが実際の処理を行わずに呼び出し元に戻る。
void fd_SetUVThreshold (float PilotVoltage);
電圧[V]を実数で指定
デフォルトは0
なし
FDIII-HCに供給されている電源の電圧を取得する。
uint32_t fd_GetPresentVoltage (void);
なし
電圧[V]の10倍値
FDIII-HCに搭載されたLED2(橙色)を点灯・消灯する。
void fd_SetLed (bool On);
true: LED点灯
false: LED消灯
なし
#include <fd.h> void main (void) { bool led = false; while (!fd_rx_buff ()) { // LED点滅 fd_SetLed (led = !led); // PB1の押下で'.'を送信 if (fd_GetPB ()) fd_putc ('.'); // DIPスイッチの値でウェイトを変更 fd_Wait ((fd_GetDIP () + 1) * 50); } }
FDIII-HCに搭載されたプッシュボタン(PB1)の状態を取得する。
bool fd_GetPB (void);
なし
true: DOWN
false: UP
FDIII-HCに搭載された3軸加速度センサの値を取得する。
なお、取得する値には個体差が含まれるため、使用状況に応じて適宜補正する事を推奨する。
void fd_GetAcceleration (uint16_t *v);
取得した値を保存する3要素の配列のアドレスを指定し、[0]にx軸、[1]にy 軸、[2]にz軸の値が保存される
各軸とも図の矢印方向を重力方向と平行に位置した場合約511、重力方向と一致させた場合約613(1g≒102)の値が得られる
最大3g程度まで計測可能
なし
#include <fd.h> void main (void) { uint16_t acc[3]; while (!fd_rx_buff ()) { fd_GetAcceleration (acc); fd_printf ("\r %3d %3d %3d\33[K", acc[0], acc[1], acc[2]); fd_Wait (100); } }
現在の相対角度と指定ポーズの最大角度差を抽出する。
int fd_ExtractMaxAngleDiffByDeg (const PPose Pose, PApplyPart pap);
1つのポーズを保持したTPose構造体の変数のアドレス
適用する部位を指定したTApplyPart構造体の変数のアドレス
角度(deg)の10倍値
#include <fd.h> // 諸元 TSpec Spec[] = {{ 1, DEV_RX28, fd_AxisOfs(0), +341, { 0, 1023}, 0, 1023, { 1, 1, 32, 32} },}; // 適用部位 TApplyPart mypart = { Priority: 1, PartNum: 1, Part:{ fd_AxisOfs(0), }}; // ホームポジション THomePosition HomePosition = { 512 }; // ホームポジションへ移行するモーション TPose GoHome[] = { { Structure: { 0}, ADJ_SACC_SDECEL, Div:1000 }}; void main (void) { int Maxdiff; DX_ChangeBaudrate (1000000); // 諸元設定 fd_SetSpec (&HomePosition, Spec, fd_SpecSize (Spec)); // 目標角度との差を抽出 Maxdiff = fd_ExtractMaxAngleDiffByDeg (GoHome, &mypart); // 差を適当に時間換算 GoHome[0].Div = Maxdiff * 2; // モーションの再生 if (fd_PlayMotion (GoHome, 1, fd_MSize (GoHome), 100, &mypart)) { // 再生中なら待つ while (fd_GetMotionStat (&mypart) && !fd_rx_buff ()) fd_Wait (10); } // モーション再生を停止 fd_StopMotion (&mypart); }
複数のポーズで構成されたモーションを指定された部位で再生し、即時復帰する。モーションは紙芝居を動きのあるアニメーション化するのと似ており、ポーズ間をスムーズにつなぐ処理を自動的に行う。また最初のポーズへ移行する際は現在の姿勢が基準となる。
実際のポーズ間の補間は指定される遷移時間内に数ms程度の間隔で位置の指令を小刻みに行う事で実現しているため、その周期で若干のトルクリプルが生じる場合がある。また、指令にはSYNCインストラクションを使用しており、アクチュエータへ指令が確実に伝わったかどうかの判定は行っていない。
なお、予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、その間の補間データの送信は行われない。
bool fd_PlayMotion (PPose Motion, short StartPoint, short EndPoint, uint16_t Speed, PApplyPart ApplyPart);
再生するモーションデータが保存されたTPose構造体の変数のアドレス
サポートするポーズ数は最大20
1~n: モーションデータの再生開始ポーズ位置
1~n: モーションデータの再生終了ポーズ位置
モーションの再生スピードを%で指定
100でTPoseのDivに設定された時間、50でDivに設定された半分の時間(Div = 1000なら0.5秒)で再生
200でDivに設定された2倍の時間(Div = 1000なら2秒)で再生
モーションを適用する部位を指定したTApplyPart構造体の変数のアドレス
モーションの動作中はApplyPartが全ての情報を持つ
true: モーションの設定及び再生の開始に成功
false: 失敗
指定部位でモーションが再生中であれば、現在位置で中断させる。何らかの要因で停止が検出できない場合でも、最低1秒間は停止処理を行う。
bool fd_StopMotion (const PApplyPart pap);
モーションを適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 停止成功
false: 停止失敗(タイムアウト)
指定部位でモーションが再生中かを取得する。
bool fd_GetMotionStat (const PApplyPart pap);
モーションを適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 再生中
false: 停止中
1つのポーズを指定された部位で再生し、即時復帰する。fd_PlayMotionとの違いは補間制御を全く行わない事にあり、設定された角度を直接指令する。また、補間方式や遷移時間が必要ないため、TPoseではなくTStructureで指定する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、その間のデータ送信は行われない。
また、一度呼び出すとそれ以後は適用した部位にモーション実行中のフラグが立つため、使用後はfd_StopMotionでフラグを落とす事を推奨する。
bool fd_SendMomentMotion (const PStructure sv, PApplyPart pap);
送信する角度データを保存したTStructure構造体の変数のアドレス
モーションを適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
軸の角度を都度取得して一連のモーションを作成手法(ティーチング)が採られるケースがある。本APIではモーションデータを動的に作成する場合に、それらの一部の機能を補助する。
実際には他のAPIを併用した上で、モーションエディタとしてプログラムを構成する必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、通信にかかる一部機能が正常に完了しない。
bool fd_AssistMotionEdit (TEdCmd cmd, int *pos, int *page, PPose Pose, PApplyPart pap);
実行する処理
0: 空
1~20: 現在対象としているポーズ位置
0: 空
1~20: キャプチャないし指定されたポーズ数(配列要素数)
作成するモーションデータが保存されたTPose構造体の変数のアドレス
サポートするポーズ数は最大20
対象の部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
TStructureに設定されたホームポジションからの相対角度を絶対位置に変換する。fd_ConvPos2Degの逆。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
bool fd_ConvDeg2Pos (PStructure deg, PStructure pos, PApplyPart pap, bool limit);
変換元の角度を保存したTStructure構造体の変数のアドレス
変換先のTStructure構造体の変数のアドレス
変換対象の部位を指定したTApplyPart構造体の変数のアドレス
true: 変換後の位置情報をTSpec内のTOpRangeで指定された動作範囲内に収める
false: 変換後の位置情報をそのまま適用する
true: 成功
false: 失敗
TStructureに設定された絶対位置をホームポジションからの相対角度に変換する。fd_ConvDeg2Posの逆。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
bool fd_ConvPos2Deg (PStructure pos, PStructure deg, PApplyPart pap);
変換元の位置を保存したTStructure構造体の変数のアドレス
変換先のTStructure構造体の変数のアドレス
変換対象の部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
オフセットアドレスからTSpecに記述されたIDを抽出する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
int fd_GetIDbyOffset (short *ofs);
オフセットアドレス
-1: 取得失敗
0~: TSpecで指定されたID
オフセットアドレスからTSpecの配列要素のインデックスを抽出する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
int fd_GetSpecIndexbyOffset (short *ofs);
オフセットアドレス
-1: 取得失敗
0~: オフセットが該当するTSpecの配列のインデックス
TSpecで定義されたネットワークに接続される全デバイスのステータスをチェックする。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
bool fd_CheckDXAlarmState (PAlarmStatus stat, int *num);
TAlarmStatusの配列のアドレス
statの配列数
true: 成功
false: 失敗
指定された部位のアクチュエータのみに対して、EEPROMエリアの書き換え禁止を指令する。一度書き換え禁止を行うと、アクチュエータを再起動しない限りEEPROMエリアの書き換えは行えない。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_LockDXParam (PApplyPart pap);
適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
指定された部位のアクチュエータのみに対して、位置決め制御の開始・停止を指令する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_SetDXEnableControl (bool en, PApplyPart pap);
true: 位置決め制御開始 (出力軸が現在位置でロック)
false: 位置決め制御停止 (出力軸がフリー)
適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
指定された部位のアクチュエータのみに対して、トルクリミッタの制限値を設定する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_SetDXTorqueLimit (uint16_t t, PApplyPart pap);
0~1023: トルクリミッタの制限値
適用する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
指定された部位の現在の絶対位置を取得する。ホームポジションからの相対角度で取得する場合はfd_GetDXCurrentAngleByDegを使用する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_GetDXCurrentAngleByPos (PStructure angle, PApplyPart pap);
絶対位置を取得するTStructure構造体の変数のアドレス
絶対位置を取得する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
#include <fd.h> // 諸元 const TSpec Spec[] = { // id device offset gain min max { 1, DEV_RX28, fd_AxisOfs(0), +341, { 0, 1023}}, { 2, DEV_RX28, fd_AxisOfs(1), +341, { 0, 1023}}, }; // 適用部位 TApplyPart mypart = { Priority: 1, PartNum: 2, Part:{ fd_AxisOfs(0), fd_AxisOfs(1), } }; // ホームポジション THomePosition hp = { 512, 512}; void main (void) { DX_ChangeBaudrate (1000000); fd_SetSpec (&hp, Spec, fd_SpecSize (Spec)); // 現在位置を取得しその値でホームポジションを更新 if (fd_GetDXCurrentAngleByPos (&hp, &mypart)) fd_SetHomePosition (&hp); }
指定された部位のホームポジションからの相対角度を取得する。絶対位置で取得する場合はfd_GetDXCurrentAngleByPosを使用する。
予めfd_SetSpecでホームポジションと使用するアクチュエータの情報を設定しておく必要がある。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_GetDXCurrentAngleByDeg (PStructure angle, PApplyPart pap);
相対角度を取得するTStructure構造体の変数のアドレス
相対角度を取得する部位を指定したTApplyPart構造体の変数のアドレス
true: 成功
false: 失敗
FDIII-HCのブザーを使用して任意の音階の発音やメロディーを奏でることが出来ます。
なお、再生中であってもfd_SetBeepConditionで設定された条件が優先されて、再生が中断する場合があります。
独自のMML(Music Macro Language)もどきで譜面ライクに音楽を記述し、再生させ即時復帰する。再生がMMLの最終命令を経過すると再生終了となる。
void fd_PlayMusic (bool force, const char *MML);
true: 既に再生中であれば停止した後に再生
false: 既に再生中であれば再生しない
音階: Cx,Dx,Ex,Fx,Gx,Ax,Bx (xは0-9の音長指定もしくは+,-,#)
休符: Rx (xは音長)
音長指定: Lx (xは音長)
シャープ: #,+
フラット: -
テンポ: Tx (x:0-9)
オクターブ: Ox (x:0-5)
1オクターブUP: <
1オクターブDOWN: >
[音長]
0: 1(全音符)
1: 2分音符
2: 3分音符
3: 4分音符
4: 6分音符
5: 8分音符
6: 12分音符
7: 16分音符
8: 24分音符
9: 32分音符
なし
#include <fd.h> void main (void) { fd_PlayMusic ( false, "o1t3 c7<c7>>a7<a7>b-7<b-7r5r3 c7<c7>>a7<a7>b-7<b-7r5r3" ">f7<f7>d7<d7>e-7<e-7r5r3 >f7<f7>d7<d7>e-7<e-7r5r5 e-8d8d-8" "c7r7e-7r7d7r7>a-7r7g7r7<d-7r7 c8g-8f8e8b-8a8a-8r8e-8r8>b8" "r8b-8r8a8r8a-8r8" ); while (fd_GetMusicStat ()) fd_Wait (10); }
指定の音階を連続的に発音する。MMLが再生中の場合は無視される。
void fd_ToneOn (int Oct, int Tone);
0~5: オクターブ
0~11: C,C#,D,D#,E,F,F#,G,G#,A,A#,Bの音階に相当
なし
#include <fd.h> void main (void) { int i; for (i = 0; i < 72; i++) { fd_ToneOn (i / 12, i % 12); fd_Wait (50); } fd_ToneOff (); }
FDIII-HCでは主にUSBを介したシリアル通信を使用してプログラムの転送や実行中のプログラムのモニタ等を行うため、簡便に文字や文字列の送受信を行うためのAPIを用意しています。USBの他にBluetoothのSPP及びDBGU(TTLレベル)によるシリアル通信も使用できます。
なお、コンソールAPIでは各コンソール系I/Fを個別に取り扱う事ができません。
FDIII-HCのCN14をコンソールとして初期化する。FDIII-DISPLAYを接続した際は、115200bpsを指定して初期化する。
なお、指定されたボーレートと実際にライブラリ内で適用されるボーレートは誤差が生じるので、戻り値を確認して使用可能なボーレートであるかを判断する必要がある。
また、内部の送受信バッファは各々100バイトである。
uint32_t fd_AssignUARTToConsole (uint32_t dbgu_baud);
ボーレート[bps]
0: 失敗
1~: 近似された実ボーレート
FDIII-HCのBluetoothをコンソールとして初期化する。
なお、Bluetoothの動作自体はFDIII-HCのブートローダで設定されたBluetoothの接続モードに依存する。
また、内部の送受信バッファは各々200バイトである。
void fd_AssignBTToConsole (void);
なし
なし
Bluetoothに割り当てた機能(コンソール・SIXAXIS・RC-100B)を無効化する。
void fd_DeassignBT (void);
なし
なし
受信バッファにあるデータ数を取得する。受信バッファからデータを取り出すにはfd_getcを使用する。
なお、複数のI/Fをコンソールとしてアサインしている場合は、最後に入力があったI/Fの受信バッファに保存されているデータ数となる。
int fd_rx_buff (void);
なし
バッファに保存された受信データのバイト数
#include <fd.h> void main (void) { int i, n = 0; char c, s[20]; // DBGUをコンソールに fd_AssignUARTToConsole (115200); // Bluetoothをコンソールに fd_AssignBTToConsole (); // PB1が押されるまでループ while (!fd_GetPB ()) { // 受信バッファにデータがあるまでループ while (fd_rx_buff ()) { // 1バイト取り出して送信 fd_putc (c = fd_getc ()); switch (c) { // 文字列送信 case '0': fd_puts ("\nHELLO!\n"); break; // 書式付文字列送信 case '1': fd_printf ("\nn++=%d\n", n++); break; // 文字列受信 case '2': fd_puts ("\ns<-"); fd_gets (s, 19); fd_puts ("\n"); fd_puts (s); break; // 書式付文字列入力 case '3': fd_puts ("\ni<-"); fd_scanf ("%d", &i); fd_printf ("\nd=%d\n", i); break; } } fd_Wait (10); } }
受信バッファから1バイト取得する。受信バッファが空の場合は1バイト受信するまで返らない。
char fd_getc (void);
なし
指定された文字数以下の文字列を指定バッファに受信する。改行でそれ以前に入力された文字列を指定バッファにコピーし入力文字数を返す。エスケープで処理をキャンセルし0を返す。
バイナリデータの受信には使用できない。
int fd_gets (char *s, int len);
受信した文字列を保存するバッファのアドレス
最大受信文字数
受信した文字のバイト数
コンソールとして使用しているターミナル上のカーソル座標を指定する。
SIMPLE TERMとLCDの座標系が異なるため、直接エスケープシーケンスで座標を指定せずに本APIで代用する事を推奨する。
void fd_locate (int x, int y);
1~80: 画面左上を1としたX座標
1~24: 画面左上を1としたY座標
なし
オプションのLCDを対象としたAPIで、主にグラフィックの描画を行います。
解像度は内部固定で、左上が(0,0)、右下が(319,239)の座標を持ちます。基本的にこの座標の範囲外の値を指定した場合は描画処理を行いません。
LCDが接続されているかを検出する。検出に成功した場合でも、処理に少なくとも数十msかかる。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
bool fd_LCDExists (void);
なし
true: 検出成功
false: 検出失敗
LCDのテキストプレーンの解像度を変更する。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDSetFontSize (uint8_t sz);
0: 文字サイズ小 (最大80x30文字)
1: 文字サイズ中 (最大64x20文字) デフォルト
2: 文字サイズ大 (最大40x15文字)
なし
LCDに備わった4枚のグラフィックバッファのうち、指定されたバッファを表示する。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDSelectPictureBuff (uint8_t plane);
0~3: バッファ番号
なし
LCDの指定されたグラフィックバッファを表示対象とし、背景色を設定する。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDSetBGColor (TColor color, uint8_t plane);
背景色
0~3: バッファ番号
なし
指定された座標のドットをLCDに描画する。
LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは描画されない。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDDrawPixel (uint16_t X, uint16_t Y, TColor color, uint8_t plane);
0~319: X座標
0~239: Y座標
指定座標の色を返すコールバック関数のアドレス
0~3: バッファ番号
なし
指定された(X0,Y0)と(X1,Y1)の座標を結ぶ直線をLCDに描画する。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDDrawLine (uint16_t X0, uint16_t Y0, uint16_t X1, uint16_t Y1, TColor color, uint8_t plane);
0~319: 始点のX座標
0~239: 始点のY座標
0~319: 終点のX座標
0~239: 終点のY座標
色
0~3: バッファ番号
なし
指定された(X0,Y0)と(X1,Y1)の座標を対角に持つ矩形をLCDに描画する。
LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは「塗りつぶしなし」が描画されない。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDDrawSquare (uint16_t X0, uint16_t Y0, uint16_t X1, uint16_t Y1, bool fill, TColor color, uint8_t plane);
0~319: 始点のX座標
0~239: 始点のY座標
0~319: 終点のX座標
0~239: 終点のY座標
true: 塗りつぶしあり
false: 塗りつぶしなし
色
0~3: バッファ番号
なし
指定された(X,Y)を中心とした楕円をLCDに描画する。
LCDモジュールのファームウェアに依存し、初期バージョンのファームウェアでは描画されない。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
void fd_LCDDrawElipse (uint16_t X, uint16_t Y, uint16_t hRadius, uint16_t vRadiuse, bool fill, TColor color, uint8_t plane);
0~319: 中心のX座標
0~239: 中心のY座標
1~319: 水平方向の半径
1~239: 垂直方向の半径
true: 塗りつぶしあり
false: 塗りつぶしなし
色
0~3: バッファ番号
なし
指定された矩形領域に任意の画像をLCDに描画する。ピクセル単位で描画を行うため、処理に時間を要する。
予めfd_AssignUARTToConsoleを使用してCN14を115200[bps]の通信速度で初期化しておく必要がある。
bool fd_LCDDrawPicture (uint16_t X, uint16_t Y, uint16_t width, uint16_t height, TColor (*func)(int x, int y), uint8_t plane);
0~319: 描画領域左上のX座標
0~239: 描画領域左上のY座標
0~319: 描画領域の幅 X+widthが319以下になるよう指定する
0~239: 描画領域の高さ Y+heightが239以下になるよう指定する
指定座標の色を返すコールバック関数のアドレス
0~3: バッファ番号
true: 描画処理対象
false: 描画処理対象外
#include <fd.h> #include <math.h> const TColor black = {R: 0, G: 0, B: 0}, yellow = {R:31, G:31, B: 0}; void elipse (uint16_t X, uint16_t Y, uint16_t hRadius, uint16_t vRadius, TColor color, uint8_t plane) { int hDia = hRadius << 1, vDia = vRadius << 1; TColor mydraw (int x, int y) { if (fd_GetShutdownState ()) return (TColor)(uint16_t)0xffff; if (x < hRadius && y < vRadius) { if (y < vRadius + sqrt (pow (vRadius, 2.0) - pow ((x - hRadius), 2.0) * pow (vRadius, 2.0) / pow (hRadius, 2.0)) && x < hRadius - sqrt (pow (hRadius, 2.0) - pow ((y - vRadius), 2.0) * pow (hRadius, 2.0) / pow (vRadius, 2.0))) return (TColor){t:1}; else return color; } else { if (y < vRadius + sqrt (pow (vRadius, 2.0) - pow ((x - hRadius), 2.0) * pow (vRadius, 2.0) / pow (hRadius, 2.0)) && x < hRadius + sqrt (pow (hRadius, 2.0) - pow ((y - vRadius), 2.0) * pow (hRadius, 2.0) / pow (vRadius, 2.0))) return color; else return (TColor){t:1}; } } if ((plane > 3) || (hDia <= 0) || (vDia <= 0)) return; fd_LCDDrawPicture (X - hRadius, Y - vRadius, hDia, vDia, &mydraw, plane); } void main (void) { fd_AssignUARTToConsole (115200); fd_LCDSelectPictureBuff (0); fd_LCDSetBGColor (black, 0); elipse (160, 120, 100, 100, yellow, 0); }
FDIII-HCとRC-100B(FREEDOM Jr.III Wireless Controller)をBluetoothで接続し、使い慣れたゲーム用ジョイスティックライクなコントローラを利用した簡易的な操縦系や、FDIII-HCでは不足している外部からの入力系の補助としてとして使用できます。
なお、予めFDIII-HCのブートローダでBluetoothをSLAVEモードにし、RC-100Bとペアリングしておく必要があります。
BluetoothをRC-100Bとの接続専用に初期化する。以下に示すRC-100B用APIを使用する前に1度だけ実行する必要がある。
以後RC-100B用API以外の使用目的(コンソールやSIXAXIS)でBluetoothを利用する事はできない。
uint32_t fd_AssignBTToRC100 (void);
なし
ボーレート[bps]
受信バッファにあるデータ数を取得する。RC-100Bに備わったボタンの状態が変化すると、その都度バッファにその状態が蓄えられる。
uint16_t fd_GetRC100Buff (void);
なし
データ数
受信バッファから最も古い1データを取得する。受信バッファが空の場合はボタンの変化があるまで返らない。
void fd_GetRC100Data (Prc100Stat c);
データを取得するTrc100Stat構造体の変数のアドレス
なし
受信バッファから最新の1データを取得する。受信待ちは行わない。
void fd_GetRC100Current (Prc100Stat c);
データを取得するTrc100Stat構造体の変数のアドレス
なし
FDIII-HCのBluetoothにはPlayStation®3用のワイヤレスコントローラであるSIXAXISないしDUALSHOCK®3との接続機能が備わっています。RC-100Bにはないアナログスティックや加速度センサが内蔵されており、それらの信号も取り込むことが可能です。
使い慣れたゲーム用コントローラを利用した簡易的な操縦系や、FDIII-HCでは不足している外部からの入力系の補助としてとして使用してください。
なお、予めFDIII-HCのブートローダでBluetoothをSIXAXISモードにし、更にSIXAXIS自体にFDIII-HCのMACアドレスを登録しておく必要があります。
BluetoothをSIXAXISないしDUALSHOCK3との接続専用に初期化する。以下に示すSIXAXIS用APIを使用する前に1度だけ実行する必要がある。
以後SIXAXIS用API以外の使用目的(コンソールやRC-100B)でBluetoothを利用する事はできない。
uint32_t fd_AssignBTToSIXAXIS (void);
なし
端末速度[bps]
#include <fd.h> void main (void) { // ボタンデータの取得用変数の定義 static TsixaxisStat rc; // BluetoothをSIXAXISの受信に使用 fd_AssignBTToSIXAXIS (); // コンソールの入力がない間ループ while (!fd_rx_buff ()) { // SIXAXISの受信バッファがある間ループ while (fd_GetSIXAXISBuff ()) { fd_GetSIXAXISData (&rc); fd_printf ( "\x1b[1;1%d %d %d %d\33[K\n", rc[_SIXAXIS_BTN_U].down, rc[_SIXAXIS_BTN_D].down, rc[_SIXAXIS_BTN_L].down, rc[_SIXAXIS_BTN_R].down ); } // アナログ値の取得 fd_printf ( "\x1b[2;1H %4d %4d %4d %4d\33[K", fd_GetSIXAXISAnalog (_SIXAXIS_ANA_LANAH), fd_GetSIXAXISAnalog (_SIXAXIS_ANA_LANAV), fd_GetSIXAXISAnalog (_SIXAXIS_ANA_RANAH), fd_GetSIXAXISAnalog (_SIXAXIS_ANA_RANAV) ); fd_Wait(50); } }
受信バッファにあるデータ数を取得する。SIXAXISに備わったボタンの状態が変化すると、その都度バッファにその状態が蓄えられる。
uint16_t fd_GetSIXAXISBuff (void);
なし
データ数
受信バッファから最も古い1データを取得する。受信バッファが空の場合はボタンの変化があるまで返らない。
void fd_GetSIXAXISData (PsixaxisStat c);
データを取得するTsixaxisStat構造体の変数のアドレス
なし
受信バッファから最新の1データを取得する。受信待ちは行わない。
void fd_GetSIXAXISCurrent (PsixaxisStat c);
データを取得するTsixaxisStat構造体の変数のアドレス
なし
ボタンの押し圧やアナログスティック、加速度センサ等の最新アナログ値を取得する。取得に当たり受信バッファを監視する必要はない。
short fd_GetSIXAXISAnalog (int ch);
_SIXAXIS_ANA_LANAH: 右アナログスティック横
_SIXAXIS_ANA_LANAV: 右アナログスティック縦
_SIXAXIS_ANA_RANAH: 左アナログスティック横
_SIXAXIS_ANA_RANAV: 左アナログスティック縦
_SIXAXIS_ANA_U: 上ボタン
_SIXAXIS_ANA_R: 右ボタン
_SIXAXIS_ANA_D: 下ボタン
_SIXAXIS_ANA_L: 左ボタン
_SIXAXIS_ANA_L2: L2ボタン
_SIXAXIS_ANA_R2: R2ボタン
_SIXAXIS_ANA_L1: L1ボタン
_SIXAXIS_ANA_R1: R1ボタン
_SIXAXIS_ANA_TRIANGLE: △ボタン
_SIXAXIS_ANA_CIRCLE: ○ボタン
_SIXAXIS_ANA_CROSS: ×ボタン
_SIXAXIS_ANA_SQUARE: □ボタン
_SIXAXIS_ANA_ACCX: x軸加速度
_SIXAXIS_ANA_ACCY: y軸加速度
_SIXAXIS_ANA_ACCZ: z軸加速度
_SIXAXIS_ANA_GYROZ: z軸ジャイロ
指定チャネルに応じた値
ソースコード中にホームポジションやモーションを固定データとして記述してしまうと、それらを調整や編集してもソースプログラムに反映させるのは手動操作となり、反映させるには再度コンパイルしてプログラムをダウンロードし直さなくてはなりません。
本ライブラリではそれらのデータをFDIII-HCに装備したSDカード上のファイルとして扱う事ができるため、データのコピーやバックアップ等がPC等でも行えます。
指定された名前でSDカードに保存されたモーションファイルを検索し、必要に応じてそのデータを取得する。
bool fd_MMSD_Search (const char *Name, PPose Motion, int *page);
指定された名前でSDカードに保存されたモーションファイルを検索し、見つかったら再生する。再生スピードや始点・終点の指示はできない。
bool fd_MMSD_SearchAndPlayMotion (const char *Name, PPose Motion, int *page, const PApplyPart pap);
モーション名 (最大8文字)
読み出されたモーションデータを保存するTPose構造体の変数のアドレス
読み出されたモーションデータのポーズ数を取得するint型の変数のアドレス
モーションを適用する部位を指定したTApplyPart構造体の変数のアドレス
モーションの動作中はApplyPartが全ての情報を持つ
true: 指定モーションファイルが見つかり、再生に成功
false: 指定モーションファイルが見つからない、もしくは再生に失敗
モーションデータに名前を付けてSDカードに保存する。同名のモーションファイルでの上書き保存はできない。
bool fd_MMSD_Add (const char *Name, PPose Motion, int page);
指定された名前でSDカードに保存されたモーションファイルを検索し、存在すれば削除する。
bool fd_MMSD_Del (const char *Name);
削除するモーション名 (最大8文字)
ture: 成功
false: 失敗
SDカード内のモーションファイルの一覧を取得する際の、初期処理及びルートディレクトリへの移動を行う。実際のファイルの一覧取得はfd_MMSD_FindNextが担う。
bool fd_MMSD_FindFirst(void);
なし
true: 検索成功
false: 検索失敗
#include <fd.h> void main (void) { char name[10]; fd_Wait (2000); if (fd_MMSD_FindFirst ()) { int page; while (fd_MMSD_FindNext (name, NULL, &page)) { fd_printf ("[%s,%2d]", name, page); } } }
モーションファイルの一覧を取得する際の、次のファイルを見つける。モーションファイル名の取得と合わせて、モーションデータの読み込みも同時に行える。
先にfd_MMSD_FindFirstを実行しておく必要がある。
bool fd_MMSD_FindNext (char *Name, PPose Motion, int *page);
指定された名前でSDカードに保存されたモーションファイルを検索し、存在すればモーション名を変更する。
bool fd_MMSD_ChangeMotionName (const char *OldName, const char *NewName);
true: 成功
false: 失敗
SDカードに保存されたホームポジションファイルを検索し、存在すればデータを取得する。
bool fd_MMSD_ReadHomePosition (PHomePosition hp);
ホームポジションを保持したTHomePosition構造体の変数のアドレス
true: 成功
false: 失敗
SDカードにホームポジションデータを保存(上書きも含む)する。
bool fd_MMSD_WriteHomePosition (const PHomePosition hp);
ホームポジションを保持したTHomePosition構造体の変数のアドレス
true: 成功
false: 失敗
SpecやApplyPartによるモーションの管理APIでは用意されていないネットワーク上のデバイスの機能を、Dynamixelプロトコルを使用して直接扱うAPIです。
モーションの再生中であっても、センサからのフィードバックを検出したり、特殊なアイテムのデータを読み書きするといった事が可能です。
ボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。
なお、ライブラリ内では静的に1M[bps]で初期化されているため、そのままで支障がなければ特に変更の必要はないが、異なるボーレートのデバイスを使用する場合はfd_SetSpecで諸元を設定するよりも前にボーレートを変更しておく事。
bool DX_ChangeBaudrate (uint32_t baud);
ネットワークの装置とFDIII-HC間の通信速度[bps]
true: 成功
false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
uint32_t DX_CalcTimeout (int num);
バイト数
タイムアウト時間[ms]
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
bool DX_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
bool DX_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
bool DX_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
bool DX_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
bool DX_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
SYNCインストラクションを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
bool DX_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、PINGを発行する。IDがわかっている場合に使用する。
bool DX_Ping (uint8_t id, uint32_t timeout, PDXAlarm errcode);
不特定のIDを持つデバイスを対象に、PINGを発行する(ブロードキャストIDを使用してPING)。IDがわからないデバイスに対して使用するため、ネットワーク上に接続されるデバイスは1台のみとする事。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool DX_Ping2 (uint8_t *id, uint32_t timeout, PDXAlarm errcode);
アクチュエータに共通のコントロールテーブルを扱うケースが多いため、Dynamixelプロトコルを直接扱わずに簡便にアクセスするためのAPIが用意されています。
なお、必ず各APIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できません。また、若干オーバヘッドが生じます。また、応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出されます。
本APIのみデバイスの種別を問わずモデルナンバー取得する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
uint16_t fd_DXGetModelNumber (uint8_t id, PDXAlarm errcode);
指定IDのアクチュエータに対して、EEPROMエリアの書き換え禁止を指令する。一度書き換え禁止を行うと、アクチュエータを再起動しない限りEEPROMエリアの書き換えは行えない。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXLockParam (uint8_t id);
0~253: 対象デバイスのID
true: 成功
false: 失敗
指定IDのアクチュエータに対して、位置決め制御の開始・停止を指令する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXEnableControl (uint8_t id, bool On);
0~253: 対象デバイスのID
true: 位置決め制御開始 (出力軸が現在位置でロック)
false: 位置決め制御停止 (出力軸がフリー)
true: 成功
false: 失敗
指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGOAL POSITIONへの書き込み)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetPosition (uint8_t id, uint16_t Position);
0~253: 対象デバイスのID
0~1023: 10bit分解能版
0~4095: 12bit分解能版
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXGetPosition (uint8_t id, uint16_t *Position);
0~253: 対象デバイスのID
取得した値を保存するuint16_t型の変数のアドレス
true: 成功
false: 失敗
指定IDのアクチュエータに対して、指定された速度を指令(アイテムのMOVING SPEEDへの書き込み)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetSpeed (uint8_t id, short Speed);
0~253: 対象デバイスのID
-1023~0~1023: 回転方向指示(符号)を含む速度
true: 成功
false: 失敗
指定IDのアクチュエータに対して、トルクリミッタの制限値を設定(アイテムのTORQUE LIMITへの書き込み)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetTorqueLimit (uint8_t id, uint16_t Torque);
0~253: 対象デバイスのID
0~1023: トルクリミッタの制限値
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の負荷を取得(アイテムのPRESENT LOADの読み出し)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXGetLoad (uint8_t id, int16_t *Load);
0~253: 対象デバイスのID
取得した値を保存するint16_t型の変数のアドレス
true: 成功
false: 失敗
指定IDのアクチュエータに対して、コンプライアンスを設定(アイテムのCW COMPLIANCE MARGINから4バイトへの書き込み)する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetCompliance (uint8_t id, uint8_t CWM, uint8_t CCWM, uint8_t CWS, uint8_t CCWS);
0~253: 対象デバイスのID
0~254: CWマージン
0~254: CCWマージン
1~254: CWスロープ
1~254: CCWスロープ
true: 成功
false: 失敗
指定IDのアクチュエータに対して、位置決め制御時のゲインを設定する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetPIDGain (uint8_t id, uint8_t PGain, uint8_t IGain, uint8_t DGain);
0~253: 対象デバイスのID
0~254: Pゲイン
0~254: Iゲイン
0~254: Dゲイン
true: 成功
false: 失敗
指定IDのアクチュエータに対して、無限回転・位置決めモードを切り替える。コントロールテーブルのEEPROMエリアの書き換えを伴うため、頻度が高い使用は禁物である。また、EEPROMエリアの書き換え禁止措置が講じられている場合は、モードの切り替えに失敗する。
fd_SetUVThresholdで指定された電圧を下回ると、実際の処理を行わない。
bool fd_DXSetEndlessTurn (uint8_t id, bool f);
0~253: 対象デバイスのID
true: 無限回転モードへ切り替え
false: 位置決めモードへ切り替え
true: 成功
false: 失敗
コマンド方式サーボのプロトコルを使用して内蔵メモリマップへのアクセスと、それらを使用せず簡便に各アイテムへアクセスするためのAPIです。
なお、各アイテムへのアクセス専用APIは、各APIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できないのと、若干オーバヘッドが生じます。また、応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出されます。
FDIII-HCとサーボモータのケーブルは以下のピンアサインとします。
RSシリーズ向けにボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。
このAPIを使用すると、RSシリーズ以外のアクチュエータとの通信は行う事ができない。また、Dynamixelを前提とした諸元やモーション等を使用するAPIは使用してはならない。
bool RS_ChangeBaudrate (uint32_t baud);
ネットワークの装置とFDIII-HC間の通信速度[bps]
誤差率の関係上460800bps以下を推奨
true: 成功
false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
#include <fd.h> void main (void) { int16_t now = -1500, p; // ボーレート変更 RS_ChangeBaudrate (230400); // トルクON fd_RSEnableControl (1, true); while (!fd_GetPB ()) { // 位置指令 RS_WriteWordData (1, RS_ADDRESS_GOAL_POSITION, now, 10, NULL); // 位置取得 RS_ReadWordData (1, RS_ADDRESS_PRESENT_POSITION, (void *)&p, 10, NULL); fd_printf("goal pos=%5d, present pos=%5d\r",now, p); if (++now > 1500) now = -1500; fd_Wait (1); } // トルクOFF fd_RSEnableControl (1, false); }
ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
uint32_t RS_CalcTimeout (int num);
バイト数
タイムアウト時間[ms]
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
bool RS_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
bool RS_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
bool RS_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
bool RS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
bool RS_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
ロングパケットを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
bool RS_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
指定IDのデバイスに対して、モデルナンバーを取得する。
uint16_t fd_RSGetModelNumber (uint8_t id, PDXAlarm errcode);
指定IDのアクチュエータに対して、位置決め制御の開始・停止(アイテムのTORQUE ENABLE)を指令する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSEnableControl (uint8_t id, bool On);
1~127: 対象デバイスのID
true: 位置決め制御開始 (出力軸が現在位置でロック)
false: 位置決め制御停止 (出力軸がフリー)
true: 成功
false: 失敗
指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGLOBAL POSITIONへの書き込み)する。なお、RSシリーズは予めトルクONを指示しておかないと動作しない。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSSetPosition (uint8_t id, int16_t Position);
1~127: 対象デバイスのID
-1500~+1500: -150.0~+150.0度
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSGetPosition (uint8_t id, int16_t *Position);
1~127: 対象デバイスのID
取得した値を保存するint16_t型の変数のアドレス
true: 成功
false: 失敗
指定IDのアクチュエータに対して、指定された移動時間(10ms単位)を指令する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSSetTime (uint8_t id, int16_t Times);
1~127: 対象デバイスのID
0~65535: 移動時間を10ms単位で指定
true: 成功
false: 失敗
指定IDのアクチュエータに対して、トルクリミッタの制限値を設定する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSSetTorqueLimit (uint8_t id, uint16_t Torque);
1~127: 対象デバイスのID
0~100: トルクリミッタの制限値[%]
true: 成功
false: 失敗
指定IDのアクチュエータに対して、コンプライアンスを設定する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSSetCompliance (uint8_t id, uint8_t CWM, uint8_t CCWM, uint8_t CWS, uint8_t CCWS);
1~127: 対象デバイスのID
0~255: CWマージン
0~255: CCWマージン
0~255: CWスロープ
0~255: CCWスロープ
true: 成功
false: 失敗
指定IDのアクチュエータに対して、位置決め制御時のPIDゲインを設定する。
なお、必ずAPIの持つ機能が利用可能なデバイスであるかの判断を行うため、ブロードキャストIDが使用できない。また、そのために若干オーバヘッドが生じる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_RSSetPIDGain (uint8_t id, uint8_t Gain, uint8_t dummy1, uint8_t dummy2);
1~127: 対象デバイスのID
0~255: ゲイン
0: 未使用
0: 未使用
true: 成功
false: 失敗
ICS3.0/ICS3.5のプロトコルを使用した各アイテムへのアクセスと、それらを使用せず簡便に各アイテムへアクセスするためのAPIです。
なお、KRSシリーズのアクチュエータにおいて指令位置や位置フィードバックといったデータがメモリマップ上に存在しないため、本ライブラリ内にてこれらのデータを仮想メモリマップ上に配置しています。それにより他のアクチュエータ同様のIDとアドレスによるアクセス方法を疑似的に提供します。
仮想メモリマップ構成
Address | Data Type | Name | Range | I/O |
0 | uint8_t | Torque Enable | 0..1[Off/On] | R/W |
1 | uint16_t | Goal Position | 0..16383 | R/W |
3 | uint16_t | Present Position | ? | R |
5 | int8_t | Present Current | ? | R |
6 | int8_t | Present Temperature | ?[degC] | R |
各アイテムは以下のルールを元に変換されます。
0:ICSにて舵角を0として送信
1:ICSにて指定済みのGoal Positionを舵角として送信
ICSにて舵角として送信する値。サーボモータに設定されたパルスリミットを超えた値が指定された場合の挙動は保証されない。
ICSにて現在の舵角として受信された値。
ICSにて電流値として受信された値を正規化。単位は不明。
ICSにて温度値として受信された値を摂氏に正規化。
また、APIにてIDに255を指定した場合、存在の有無に関わらず0~31の全てのIDに対して処理を順次行います。そのため、必要以上の処理時間を要する場合があります。
FDIII-HCとサーボモータのケーブルは以下のピンアサインとします。
KRSシリーズ向けにボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、全てのAPIはこのボーレートを基準にして動作する。
このAPIを使用すると、KRSシリーズ以外のアクチュエータとの通信は行う事ができない。また、Dynamixelを前提とした諸元やモーション等を使用するAPIは使用してはならない。
bool KRS_ChangeBaudrate (uint32_t baud);
ネットワークの装置とFDIII-HC間の通信速度[bps]
誤差率の関係上115200bpsのみを推奨
true: 成功
false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
#include <fd.h> void main (void) { uint16_t now = 0, p; // ボーレート変更 KRS_ChangeBaudrate (115200); while (!fd_GetPB ()) { // 舵角指令 KRS_WriteWordData (0, KRS_ADDRESS_GOAL_POSITION, now, 5, NULL); // 舵角取得 KRS_ReadWordData (0, KRS_ADDRESS_PRESENT_POSITION, &p, 5, NULL); fd_printf("goal pos=%5d, present pos=%5d\r", now, p); if (++now > 16383) now = 0; fd_Wait (1); } // トルクOFF fd_KRSEnableControl (0, false); }
ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
uint32_t KRS_CalcTimeout (int num);
バイト数
タイムアウト時間[ms]
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
bool KRS_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
bool KRS_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
bool KRS_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
bool KRS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
bool KDX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
bool KRS_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, PDXAlarm errcode);
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
なお、ICSでは同期系のパケットを持たないため、実際には個々のIDに順次BlockWriteで処理を行う。
bool KRS_WriteSyncData (const uint8_t *dat, uint8_t size, PDXAlarm errcode);
指定IDのアクチュエータに対して、位置決め制御の開始・停止を指令する。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_KRSEnableControl (uint8_t id, bool On);
0~31: 対象デバイスのID
true: 位置決め制御開始 (出力軸が現在位置でロック)
false: 位置決め制御停止 (出力軸がフリー)
true: 成功
false: 失敗
指定IDのアクチュエータに対して、指定された位置を指令(アイテムのGOAL POSITIONへの書き込み)する。なお、KRSシリーズは本指により自動的にトルクイネーブルがONになる。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_KRSSetPosition (uint8_t id, uint16_t Position);
0~31: 対象デバイスのID
0~16383
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の位置を取得(アイテムのPRESENT POSITIONの読み出し)する。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_KRSGetPosition (uint8_t id, uint16_t *Position);
0~31: 対象デバイスのID
取得した値を保存するuint16_t型の変数のアドレス
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の電流値を取得(アイテムのPRESENT CURRENTの読み出し)する。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_KRSGetCurrent (uint8_t id, int16_t *Current);
0~31: 対象デバイスのID
取得した値を保存するint16_t型の変数のアドレス
true: 成功
false: 失敗
指定IDのアクチュエータから、現在の温度[degC]を取得(アイテムのPRESENT TEMPERATUREの読み出し)する。
応答のタイムアウト時間は最大の理論値を元に内部で自動的に算出される。
bool fd_KRSGetTemperature (uint8_t id, int8_t *Temp);
0~31: 対象デバイスのID
取得した値を保存するint8_t型の変数のアドレス
true: 成功
false: 失敗
SDカードのファイルへアクセスするためのAPIです。アプリケーションで独自のデータを保存したり読み出すといった事が可能です。
なお、対応するファイルシステムはFAT16のみとなり、FDIII-HCには時計機能が装備されない都合から日付・時刻を保存する機能はありません。
SDカードにファイルを書き込む。既存ファイルの場合は上書きされる。
bool fd_FileWrite (const char *fname, const void *wdata, uint32_t wrsz, uint32_t *sfsz);
書込むファイル名
書込みバッファのアドレス
書き込むバッファ内のデータサイズ
実際に書き込んだサイズを保存するuint32_t型のアドレス
true: ファイルの書込み成功
false: ファイルの書込み失敗
#include "fd.h" void main (void) { uint32_t sz, rsz; // 書込みバッファ char buff[10] = "1234567890"; // 読込み内容の保存バッファ char rbuff[21]; fd_Wait (2000); // SDカードへTEST.DATを作成 if (fd_WriteFile ("TEST.DAT", buff, sizeof (buff), &sz)) { rsz = sz; // TEST.DATへデータを追加 if (fd_AppendFile ("TEST.DAT", buff, sizeof (buff), &sz)) { rsz += sz; // TEST.DATの内容を読み込む if (fd_ReadFile ("TEST.DAT", rbuff, rsz, &sz)) { // 末尾に0を追加することで文字列化 rbuff[sz] = 0x0; fd_printf ("read buff = %s read size=%d\n", rbuff, sz); // TEST.DATを削除 fd_DeleteFile ("TEST.DAT"); } } } }
指定されたファイルの最後に追加で書込みを行う。
bool fd_AppendFile (const char *fname, const void *wdata, uint32_t wrsz, uint32_t *sfsz);
追加書込みを行うファイル名
書込みバッファのアドレス
書き込むバッファ内のデータサイズ
実際に書き込んだサイズを保存するuint32_t型のアドレス
true: 追加書込み成功
false: 追加書込み失敗
指定されたファイルの内容をバッファへ読み込む。
bool fd_ReadFile (const char *fname, void *rdata, uint32_t rdsz, uint32_t *sfsz);
読み込むファイル名
読み込んだ内容を保存するバッファのアドレス
読み込んだ内容を保存するバッファのサイズ
実際に読み込んだサイズを保存するuint32_t型のアドレス
true: ファイルの読込み成功
false: ファイルの読込み失敗
指定されたファイル・フォルダをSDカードより削除する。
bool fd_DeleteFile (const char *fname);
削除するファイル、又はフォルダ名
true: 削除成功
false: 削除失敗
フォルダ内の一覧を取得する際の、最初のファイル、又はフォルダを見つける。
bool fd_FindFirst(const char *foldername);
一覧を取得したいフォルダ名
true: オープン成功
false: オープン失敗
#include "fd.h" void main (void) { char fname[13]; TFileInfo fi; fd_Wait (2000); if (fd_SDIsAlive ()) { // ルートフォルダを指定 if (fd_FindFirst("/")) { // フォルダ内のファイル全てを検索 while (fd_FindNext (fname, &fi)) { // フォルダを除いたファイルのみ表示 if (!(fi.fattr & AM_DIR)) fd_printf ("file:%s size=%d\n", fname, fi.fsize); } } } }
フォルダ内の一覧を取得する際の、次のファイル、又はフォルダを見つける。名称と合わせて情報も取得する。
bool fd_SD_FindNext (char *fname, TFileInfo *types);
フォルダを作成する。
bool fd_MakeFolder (const char *foldername);
作成するフルパスのフォルダ名
true: 作成成功
false: 作成失敗
ファイル、又はフォルダの存在を確認をする。
bool fd_FileExists (const char *fname, TFileInfo *finfo);
存在確認するファイル、又はフォルダ名
見つかったファイル、又はフォルダのFATFSファイル情報構造体を保存するTFileInfo型の変数のアドレス
true: 確認成功
false: 確認失敗
SDカードの存在を確認する。
bool fd_SDIsAlive (void);
なし
true: SDカードが存在する
false: SDカードが存在しない
本ライブラリでは複数の情報を一括で扱うAPIが多いため、引数としてそれらの情報を取りまとめた構造体のポインタを渡すケースがあります。全てfd.h内で定義されていますので、詳細はソースを参照してください。
FREEDOM IIIライブラリで想定しているネットワークデバイスのModel No.の一覧が記述された列挙型変数。
主にTSpec構造体内の定義で使用される。
typedef enum { DEV_AX12 = 12, DEV_AX12W = 0x12c, DEV_AXS1 = 13, DEV_AX18 = 18, DEV_DX113 = 113, DEV_DX116 = 116, DEV_DX117 = 117, DEV_RX10 = 10, DEV_RX24 = 24, DEV_RX28 = 28, DEV_RX64 = 64, DEV_EX106 = 107, DEV_MX28 = 29, DEV_MX64 = 0x0136, DEV_MX106 = 0x0140, DEV_M168IO = 0x4001, DEV_9DOF = 0x4002, DEV_USS3 = 0x4004, DEV_UDIII = 0x4010, DEV_MIO2 = 0x4020 } TModelNo;
AX-12, AX-12+, AX-12A
AX-12W
AX-S1
AX-18F, AX-18A
DX-113
DX-116
DX-117
RX-10
RX-24F
RX-28
RX-64
EX-106+
MX-28R, MX-28T
MX-64R, MX-64T
MX-106R, MX-106T
Multifunction I/Oモジュール
9DOFセンサモジュール
USS3
ユニバーサルドライバ3
MIO2
アクチュエータの動作可能範囲をソフトウェア的に決めるための構造体。
主にTSpec構造体内の定義で使用される。
typedef struct { short lowerlimit; short upperlimit; } TOpRange;
アクチュエータの動作下限位置
アクチュエータの動作上限位置
アクチュエータのコンプライアンスをまとめた構造体。
主にTSpec構造体内の定義で使用される。
typedef struct { uint8_t CWMargin; uint8_t CCWMargin; uint8_t CWSlope; uint8_t CCWSlope; } TCompliance;
CWマージン
MXシリーズにおいてはD Gain
CCWマージン
MXシリーズにおいてはI Gain
CWスロープ
MXシリーズにおいてはP Gain
CCWスロープ
MXシリーズにおいては未使用
デバイスの固有情報とTStructureのどの位置に適用するかを記述した構造体。fd_SetSpecにて使用する場合は、使用するデバイス数分の配列を定義した上で渡す。
typedef struct { short id; TModelNo ModelNo; short *offset; short Deg2Pos; TOpRange OpRange; uint16_t MaxSpeed; uint16_t MaxTorque; TCompliance Compliance; uint16_t BluntGain; } TSpec;
対象デバイスのID
fd_SetSpecにて検出されないアラームとなる
対象デバイスのモデルNo.
fd_SetSpecにて不一致が検出されるとアラームとなる
対象デバイス(アクチュエータに限る)を適用する先のTStructure内のオフセット位置
例えばTStructureで定義された配列の10番目([9])の要素をオフセットとする場合は、fd_AxisOfsマクロを使用して以下の様に記述する
fd_AxisOfs(9)
この設定により、各アクチュエータのIDとアプリケーション上で想定している構造が結び付けられる
対象デバイス(アクチュエータに限る)の位置と角度を変換する係数
計算式は以下の通り (POS:位置, DEG:角度x10, HP:ホーム位置)
POS = DEG * Deg2Pos / 1000 + HP
対象デバイス(アクチュエータに限る)の動作可能範囲
ライブラリ内のソフト的なリミッタとして機能
対象デバイス(アクチュエータに限る)の初期の速度
fd_SetSpecにより指定された値が対象デバイスに書き込まれる
対象デバイス(アクチュエータに限る)の初期のトルクリミット
fd_SetSpecにより指定された値が対象デバイスに書き込まれる
0の場合は書き込みを行わない
対象デバイス(アクチュエータに限る)の初期のコンプライアンスもしくは制御ゲイン
fd_SetSpecにより指定された値が対象デバイスに書き込まれる
全て0の場合は書き込みを行わない
最終的な位置指令の際に本ゲインを元にスイープさせながら処理する
小さい値で指令に追従しなくなるため、離散的な角度指令を行う際に使用すると、結果なめらかな挙動を得られる
0ないし1000以上で遅延なくモータの最大能力で位置指令を行う
TSpecのポインタ型。
アプリケーションにおける軸の配置(構造)を決定づける配列で、その軸のアクチュエータの角度や位置を保持するのに用いる。
ホームポジションやモーションはデバイスのIDで管理されるものではなく、この配列のどの位置に構造物のどの部位を割り当てるかで決定される。IDやアクチュエータの割り当てはTSpec内で定義される本配列に対するoffsetで二次的に決定される。
ライブラリとして管理できる最大軸数は60(=FD_MAX_AXIS_NUM)軸である。
typedef short TStructure[FD_MAX_AXIS_NUM];
TStructureのポインタ型
各軸のホームポジションの位置を保持する配列。基本的にTStructureと全く同じで、アプリケーションにおける軸の配置(構造)を決定づける配列と同じ割り当てとする。
typedef TStructure THomePosition;
THomePositionのポインタ型
複数のTPoseにて構成されるモーションにおいて、各々のポーズ間をつなぐ方法。
typedef enum { ADJ_SACC_SDECEL, ADJ_SACC, ADJ_SDECEL, ADJ_CONST } TMotionAdj;
S字(sin波)による加減速で2点間を補間
始点及び終点近傍の速度が遅くなるため、機械的な負荷が軽減される
S字(sin波)による加速で2点間を補間
始点のみ近傍の速度が遅くなる
S字(sin波)による減速で2点間を補間
終点のみ近傍の速度が遅くなる
定速度で2点間を補間
typedef struct { TStructure Structure; TMotionAdj Adj; int Div; } TPose;
アプリケーションの構造に合わせた角度情報
補間方式
補間時間[ms]
モーションにおいてはこの時間を経てStructureで設定された各軸の角度へ遷移させる
TPoseのポインタ型。
モーションの再生やアクチュエータへの設定を行う際に、それらを適用するTStructure内のどの部位(軸)に適用するかを定義する。さらに、モーションの再生中は、本構造体がバッファを含めたデータの実態を担う。そのため、内部的な値の保持やバッファの定義が多く、定義の際に使用するメンバーは限られる。
なお、宣言する際に少々トリッキーな手法を用いるため、使用する際はサンプルプログラム等で確認の事。
typedef struct { int CurrentPose, PoseNum, MotionIntDiv, MotionDiv; TPose Motion[FD_MAX_POSE_NUM+1]; const bool Registed; const bool Stop; const bool Playing; uint8_t Priority; uint8_t PartNum; short *Part[]; } TApplyPart;
定義及び引用不可 (現在のポーズ位置を保持)
定義及び引用不可 (現在のポーズ数を保持)
定義及び引用不可 (モーション分割初期値を保持)
定義及び引用不可 (モーション分割現在値を保持)
定義及び引用不可 (モーション再生用バッファ)
定義及び引用不可 (内部テーブルへの追加フラグ)
定義及び引用不可 (モーション停止指令)
定義及び引用不可 (モーションの再生中フラグ)
true: 再生中
false: 再生終了
優先度
値が小さいほど優先度が高く、複数のモーションを同時に再生する等で部位が干渉する場合は、本優先度が最も高いものが適用される
Partで定義されるオフセットアドレスの要素数
TStructure内の配列のオフセットアドレス
ここで列挙される軸が適用対象となるが、例えばTStructureで定義された配列の1,2,4,5番目([0],[1],[3],[4])の4つの要素をオフセットとする場合は、fd_AxisOfsマクロを使用して以下の様に記述する。
fd_AxisOfs(0), fd_AxisOfs(1), fd_AxisOfs(3), fd_AxisOfs(4)
TApplyPartのポインタ型。
RC-100Bの1つのボタンの状態を示す。
typedef struct { bool change; bool down; } TTrc100Stat;
ボタンの状態変化(UP->DOWNないしDOWN->UP)の有無
true: あり
false: なし
ボタンの押下状態
true: DOWN false: UP
RC-100Bの10個のボタンの状態を示す配列。それぞれの要素はTTrc100Statである。
typedef TTrc100Stat Trc100Stat[10];
配列の要素を抽出する際は、以下のマクロが使用できる。
#define _RC100_U 0 // 上方向キー #define _RC100_D 1 // 下方向キー #define _RC100_L 2 // 左方向キー #define _RC100_R 3 // 右方向キー #define _RC100_1 4 // 1ボタン #define _RC100_2 5 // 2ボタン #define _RC100_3 6 // 3ボタン #define _RC100_4 7 // 4ボタン #define _RC100_5 8 // 5ボタン #define _RC100_6 9 // 6ボタン
Trc100Statのポインタ型。
SIXAXISないしDUALSHOCK3の1つのボタンの状態を示す。
typedef struct { bool change; bool down; } TTsixaxisStat;
ボタンの状態変化(UP->DOWNないしDOWN->UP)の有無
true: あり
false: なし
ボタンの押下状態
true: DOWN false: UP
SIXAXISないしDUALSHOCK3の17個のボタンの状態を示す配列。それぞれの要素はTTsixaxisStatである。
typedef TTsixaxisStat TsixaxisStat[17];
配列の要素を抽出する際は、以下のマクロが使用できる。
#define _SIXAXIS_BTN_U 0 // 上方向キー #define _SIXAXIS_BTN_D 1 // 下方向キー #define _SIXAXIS_BTN_L 2 // 左方向キー #define _SIXAXIS_BTN_R 3 // 右方向キー #define _SIXAXIS_BTN_TRIANGLE 4 // △ボタン #define _SIXAXIS_BTN_SQUARE 5 // □ボタン #define _SIXAXIS_BTN_CROSS 6 // ×ボタン #define _SIXAXIS_BTN_CIRCLE 7 // ○ボタン #define _SIXAXIS_BTN_R1 8 // R1ボタン #define _SIXAXIS_BTN_L1 9 // L1ボタン #define _SIXAXIS_BTN_L2 10 // L2ボタン #define _SIXAXIS_BTN_R2 11 // R2ボタン #define _SIXAXIS_BTN_SELECT 12 // SELECTボタン #define _SIXAXIS_BTN_START 13 // STARTボタン #define _SIXAXIS_BTN_PS 14 // PSボタン #define _SIXAXIS_BTN_RANA 15 // 右アナログスティック #define _SIXAXIS_BTN_LANA 16 // 左アナログスティック
TsixaxisStatのポインタ型。
ライブラリ内及びネットワークデバイスで検出されたエラーないしアラームの情報。
typedef uint16_t TDXAlarm;
各ビットの割り当ては以下の通り。
ライブラリ内で定義されるアラーム。
#define ALARM_INVALID_DEVICE (1 << 15) // 諸元と異なるデバイス #define ALARM_INVALID_ID (1 << 14) // 指定できないID #define ALARM_DIFF_ID (1 << 13) // 想定されないID #define ALARM_ILLEGAL_SIZE (1 << 12) // 想定されないデータサイズ #define ALARM_INVALID_PARAM (1 << 11) // 想定されないパラメータサイズ #define ALARM_COMM (1 << 10) // 通信ポートの不良 #define ALARM_CHECKSUM (1 << 9) // チェックサムの不一致 #define ALARM_TIMEOUT (1 << 8) // 通信タイムアウト
デバイスで定義されるアラーム。
#define ALARM_DX_INST (1 << 6) // 未定義のインストラクション #define ALARM_DX_OVERLOAD (1 << 5) // 過負荷 #define ALARM_DX_CHECKSUM (1 << 4) // チェックサムの不一致 #define ALARM_DX_RANGE (1 << 3) // 設定範囲外 #define ALARM_DX_OVERHEAT (1 << 2) // 過加熱 #define ALARM_DX_ANGLE (1 << 1) // 位置指令の範囲外 #define ALARM_DX_OVERVOLTAGE (1 << 0) // 過電圧
TDXAlarmのポインタ型。
ネットワークデバイスの持つIDとアラームを紐付けた構造体。
typedef struct { uint8_t id; TDXAlarm Status; } TAlarmStatus;
デバイスのID
デバイスのアラーム
TAlarmStatusのポインタ型。
fd_AssistMotionEditで指定するコマンド。
typedef enum { TED_PLAY, TED_REVERSE, TED_FOWARD, TED_CAPTURE, TED_DELETE, TED_INSERT, TED_REPLACE } TEdCmd;
モーションデータを頭からフル再生
1つ前のポーズに軸を移行
1つ後のポーズに軸を移行
現在の角度を取り込み、最後のポーズの後に追加
現在の1ポーズを削除
現在の角度を取り込み、現在のポーズの前に挿入
現在の角度を取り込み、現在のポーズを置換
FATFSにおけるファイル情報構造体。
typedef struct { uint32_t fsize; // File size uint16_t fdate; // Last modified date uint16_t ftime; // Last modified time uint8_t fattr; // Attribute char fname[13]; // Short file name (8.3 format) } TFileInfo;
ファイルのバイトサイズ
変更された最後の日付
変更された最後の時間
ファイルの属性
fatfsに準じる以下のビットがアサインされる
#define AM_RDO 0x01 // Read only #define AM_HID 0x02 // Hidden #define AM_SYS 0x04 // System #define AM_VOL 0x08 // Volume label #define AM_LFN 0x0F // LFN entry #define AM_DIR 0x10 // Directory #define AM_ARC 0x20 // Archive #define AM_MASK 0x3F // Mask of defined bits
ショートファイル名(8.3フォーマット)