UD3ライブラリは、ユニバーサルドライバ3およびユニバーサルドライバ3.5シリーズで構成されたアプリケーションを効率的に運用するためのライブラリです。
GPIOに入力されたセンサの状態からそれに応じたDCモータの制御といったアプリケーションレベルにおいて最低限必要な機能を本ライブラリでカバーします。
なお、本ライブラリはその他のライブラリ(SAM7S, SAM7S_TOPPERS等)を静的に使用していますので、ベンダーから提供されるGCC Developer Liteをインストールする際は、各コンポーネントを手動で選択することなくフルインストールした環境で使用して下さい。また、全てのソースもインストールと同時に展開されますので、必要に応じて参照できます。
本ライブラリで提供されるAPIのプロトタイプ宣言や特殊な構造体はud3.hに集約されています。このヘッダファイルに宣言が無いAPIは使用しないで下さい。
機能別にAPIの詳細を解説します。主なコンテンツを以下に紹介します。
必要に応じてAPIを使用してユーザアプリケーションを構成します。まずはUD3のサンプルプログラムを一通り実行して、動作を確認する事を推奨します。
OSで管理されるタスクや時間に関するAPIです。
ユーザは任意のタスクを最大4つまで作成可能で、自動的にマルチタスクで動作する設定になっています。システムで予約されたタスク(TASK5)は自動的に登録されますが、意図的に停止させてしまうと全APIが正常に動作しなくなりますので絶対に停止させないでください。
メインタスクに相当し、一番最初に実行される初期化関数。タスクの起動やGPIOの初期化等はこの関数内で記述する。
なお本タスクは優先度が最上位にあるため、並列で他のタスクを実行する際はUD3_WAIT等を挿入して意図的にタスクスイッチを促すべきである。
int main (void);
なし
int
#include <ud3.h> int main (void) { // 動作環境設定 // GPIO8/9/10をPWMキャプチャモードに設定 UD3_CFG_GPIO8 (GPIO_PWM_CAP_PULLUP_OFF); UD3_CFG_GPIO9 (GPIO_PWM_CAP_PULLUP_OFF); UD3_CFG_GPIO10 (GPIO_PWM_CAP_PULLUP_OFF); // モータの設定 UD3_SET_M1DRIVEMODE (_UD_MOTOR_DRIVE); UD3_SET_M2DRIVEMODE (_UD_MOTOR_DRIVE); UD3_SET_DUTY(500, -500); // 使用タスクを起動 UD3_ACTIVE_TASK (1); UD3_ACTIVE_TASK (2); }
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK1の名称で作られた関数は自動的にタスク1としてOSに登録される。
タスクの活性化はUD3_ACTIVE_TASKで行う。
複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
UD3_TASK1()
なし
なし
#include <ud3.h> UD3_TASK1 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (1); // タスク1をアクティブ化 }
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK2の名称で作られた関数は自動的にタスク2としてOSに登録される。
タスクの活性化はタスクの活性化はUD3_ACTIVE_TASKで行う。
で行う。
複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
UD3_TASK2();
なし
なし
#include <ud3.h> UD3_TASK2 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (2); // タスク2をアクティブ化 }
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK3の名称で作られた関数は自動的にタスク3としてOSに登録される。
タスクの活性化はUD3_ACTIVE_TASKで行う。
複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
UD3_TASK3();
なし
なし
#include <ud3.h> UD3_TASK3 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (3); // タスク3をアクティブ化 }
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK4の名称で作られた関数は自動的にタスク4としてOSに登録される。
タスクの活性化はUD3_ACTIVE_TASKで行う。
複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
UD3_TASK4();
なし
なし
#include <ud3.h> UD3_TASK4 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (4); // タスク4をアクティブ化 }
指定したタスクをアクティブにする。タスクをアクティブにしていない場合には、タスクを定義してあってもそのタスクは実行されない。
void UD3_ACTIVE_TASK (task);
1~4: タスク番号
なし
#include <ud3.h> UD3_TASK2 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (2); // タスク2をアクティブ化 }
指定したアクティブなタスクをサスペンドする。レジュームするにはUD3_RESUME_TASKを使用する。
int UD3_SUSPEND_TASK (char task);
1~4: タスク番号
0: 成功
-1: パラメータエラー
#include <ud3.h> UD3_TASK1 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (1); // タスク1をアクティブ化 UD3_SUSPEND_TASK (1); // タスク1をサスペンド }
指定したサスペンドしているタスクをレジュームする。サスペンドするにはUD3_SUSPEND_TASKを使用する。
int UD3_RESUME_TASK (char task);
1~4: タスク番号
0: 成功
-1: パラメータエラー
#include <ud3.h> UD3_TASK1 () { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } } int main (void) { UD3_ACTIVE_TASK (1); // タスク1をアクティブ化 UD3_SUSPEND_TASK (1); // タスク1をサスペンド UD3_RESUME_TASK (1); // タスク1をレジューム }
ミリ秒単位でプログラムの実行を待つ。
void UD3_WAIT (int_t tm);
1~: 待ち時間[msec]を指定
なし
#include <ud3.h> int main (void) { for (;;) { UD3_SET_LED (true); // LED点灯 UD3_WAIT(500); // 0.5秒待ち UD3_SET_LED (false); // LED消灯 UD3_WAIT(500); // 0.5秒待ち } }
アプリケーション起動時からの経過時間をミリ秒単位で取得。
uint32_t UD3_GET_ELAPSEDTIME (void);
なし
0~: 経過時間
uint32_t tm = UD3_GET_ELAPSEDTIME ();
Bluetoothの接続状態を取得する。なお、接続相手の強制的な電源断等が発生した場合は、状態の繊維に数秒の時間を要する場合がある。
bool UD3_GET_BTCONNECT (void);
なし
true: 接続中
false: 切断中
bool stat = UD3_GET_BTCONNECT();
GPIO0の端子機能を設定する。
int UD3_CFG_GPIO0 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
#include <ud3.h> int main (void) { UD3_CFG_GPIO0 (GPIO_IN_PULLUP_OFF); UD3_CFG_GPIO1 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO2 (GPIO_ADC); UD3_CFG_GPIO3 (GPIO_OUT_OPENDRAIN); UD3_CFG_GPIO4 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO5 (GPIO_ADC); UD3_CFG_GPIO6 (GPIO_ADC); UD3_CFG_GPIO7 (GPIO_ADC); }
GPIO1の端子機能を設定する。
int UD3_CFG_GPIO1 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO2の端子機能を設定する。
int UD3_CFG_GPIO2 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO3の端子機能を設定する。
int UD3_CFG_GPIO3 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
デフォルトはGPIO_IN_PULLUP_OFF。
0: 成功
-1: パラメータエラー
GPIO4の端子機能を設定する。
int UD3_CFG_GPIO4 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO5の端子機能を設定する。
int UD3_CFG_GPIO5 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO6の端子機能を設定する。
int UD3_CFG_GPIO6 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO7の端子機能を設定する。
int UD3_CFG_GPIO7 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: GPIO_ADC (アナログ入力)
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
0: 成功
-1: パラメータエラー
GPIO8の端子機能を設定する。
int UD3_CFG_GPIO8 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: 指定不可
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
5: GPIO_PWM_CAP_PULLUP_OFF (パルス幅計測用入力かつプルアップOFF)
6: GPIO_PWM_CAP_PULLUP_ON (パルス幅計測用入力かつプルアップON)
7: GPIO_PWM (PWM出力)
0: 成功
-1: パラメータエラー
#include <ud3.h> int main (void) { UD3_CFG_GPIO8 (GPIO_PWM_CAP_PULLUP_OFF); UD3_CFG_GPIO9 (GPIO_PWM); UD3_CFG_GPIO10 (GPIO_PWM_CAP_PULLUP_OFF); }
GPIO9の端子機能を設定する。
int UD3_CFG_GPIO9 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: 指定不可
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
5: GPIO_PWM_CAP_PULLUP_OFF (パルス幅計測用入力かつプルアップOFF)
6: GPIO_PWM_CAP_PULLUP_ON (パルス幅計測用入力かつプルアップON)
7: GPIO_PWM (PWM出力)
0: 成功
-1: パラメータエラー
GPIO10の端子機能を設定する。
int UD3_CFG_GPIO10 (TGPIOMode conf);
0: GPIO_IN_PULLUP_OFF (入力かつ内蔵プルアップOFF) (デフォルト)
1: GPIO_IN_PULLUP_ON (入力かつ内蔵プルアップON)
2: 指定不可
3: GPIO_OUT_OPENDRAIN (オープンドレイン出力)
4: GPIO_OUT_PUSHPULL (プッシュプル出力)
5: GPIO_PWM_CAP_PULLUP_OFF (パルス幅計測用入力かつプルアップOFF)
6: GPIO_PWM_CAP_PULLUP_ON (パルス幅計測用入力かつプルアップON)
7: GPIO_PWM (PWM出力)
0: 成功
-1: パラメータエラー
GPIOの端子状態を取得。入力に使用するGPIOをUD3_CFG_GPIOxで設定する必要がある。
uint16_t UD3_GET_GPIOINPUT (void);
なし
0~2047: 全GPIOの端子状態
戻り値の各ビットは以下のGPIOポートに割り当てられる。
BIT | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
GPIO | - | - | - | - | - | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
#include <ud3.h> void main (void) { UD3_ASSIGN_USB_TO_CONSOLE (); UD3_CFG_GPIO0 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO1 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO2 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO3 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO4 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO5 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO6 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO7 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO8 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO9 (GPIO_IN_PULLUP_ON); UD3_CFG_GPIO10 (GPIO_IN_PULLUP_ON); while (1) { UD3_PRINTF ("\rGPIO => [0x%03X]\33[K", UD3_GET_GPIOINPUT ()); UD3_WAIT (50); } }
UD3_CFG_GPIOxにてGPIO_OUT_OPENDRAINないしGPIO_OUT_PUSHPULLに設定された端子のみ出力状態を変更する。
int UD3_SET_GPIOOUTPUT (uint16_t out);
0~2047: 全GPIOへ出力するデータ
outの各ビットとGPIOの出力ポートは以下に割り当てられる。
out BIT | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
GPIO | - | - | - | - | - | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
デフォルトは0。
0: 成功
-1: パラメータエラー
#include <ud3.h> void main (void) { UD3_ASSIGN_USB_TO_CONSOLE (); // GPIO0~10の初期化 UD3_CFG_GPIO0 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO1 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO2 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO3 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO4 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO5 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO6 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO7 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO8 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO9 (GPIO_OUT_PUSHPULL); UD3_CFG_GPIO10 (GPIO_OUT_PUSHPULL); while (1) { int i = 0; UD3_SET_GPIOOUTPUT (i); UD3_PRINTF ("\rGPIO <= [0x%03X]\33[K", UD3_GET_GPIOINPUT ()); if (++i > 0x7FF) i = 0; UD3_WAIT (50); } }
GPIO0~7に入力された電圧(最大3.3V)値を10bitの分解能で取得する。
ADCに使用するGPIOをUD3_CFG_GPIOxで設定する必要がある。
uint16_t UD3_GET_ADC (uint8_t ch);
0~7: 計測するGPIOの番号(GPIO0~GPIO7)
0~1023: 指定GPIO番号で計測された電圧(0~3.3V)
#include <ud3.h> void main (void) { UD3_ASSIGN_USB_TO_CONSOLE (); UD3_CFG_GPIO0 (GPIO_ADC); UD3_CFG_GPIO1 (GPIO_ADC); UD3_CFG_GPIO2 (GPIO_ADC); UD3_CFG_GPIO3 (GPIO_ADC); UD3_CFG_GPIO4 (GPIO_ADC); UD3_CFG_GPIO5 (GPIO_ADC); UD3_CFG_GPIO6 (GPIO_ADC); UD3_CFG_GPIO7 (GPIO_ADC); while (1) { UD3_PUTS ("\rADC = "); int i; for (i = 0; i < 8; i++) UD3_PRINTF ("[ch%d:%4d]", i, UD3_GET_ADC (i)); UD3_PUTS ("\33[K"); UD3_WAIT (50); } }
任意周波数・音長でブザーを鳴らす。
int UD3_SET_BUZZER (uint8_t scale, uint8_t len);
0~52: Cから始まる(C,C#,D,D#,E,F,F#,G,G#,A,A#,B)6オクターブの音程
0~250: 音長(x10ms)
0: 成功
-1: パラメータエラー
#include <ud3.h> void main (void) { while (1) { UD3_SET_BUZZER (24, 20); UD3_WAIT (300); UD3_SET_BUZZER (30, 20); UD3_WAIT (300); } }
LEDの点灯/消灯。
int UD3_SET_LED (uint8_t on);
0: 消灯
1: 点灯
0: 成功
-1: パラメータエラー
#include <ud3.h> void main (void) { while (1) { UD3_SET_LED (1); UD3_WAIT (200); UD3_SET_LED (0); UD3_WAIT (200); } }
PB1の状態を取得。
bool UD3_GET_PUSHBUTTON1 (void);
なし
true: PB1が押されている
false: PB1が放されている
#include <ud3.h> void main (void) { while (1) { UD3_SET_LED (UD3_GET_PUSHBUTTON1 ()); UD3_WAIT (10); } }
PB2の状態を取得。
bool UD3_GET_PUSHBUTTON2 (void);
なし
true: PB2が押されている
false: PB2が放されている
#include <ud3.h> void main (void) { while (1) { UD3_SET_LED (UD3_GET_PUSHBUTTON2 ()); UD3_WAIT (10); } }
DIP1の状態を取得。
uint8_t UD3_GET_DIPSWICH (void);
なし
0~15: DIP1に設定された値
#include <ud3.h> void main (void) { UD3_ASSIGN_USB_TO_CONSOLE (); while (1) { UD3_PRINTF ("\rDIP = %X\33[K", UD3_GET_DIPSWICH ()); UD3_WAIT (50); } }
2つのモータドライバの初期設定やデューティー関連のAPIです。
なお、設定デューティ値と出力の相関は以下の図に従い、Duty limit(API上用意されず常時1000‰)とRecharge bandにより制限された水色の出力となります。なお、Recharge bandは全てにおいて優先されます。
M1のPWM周波数を設定。
int UD3_SET_M1FREQUENCY (uint8_t freq);
1~200: PWMのキャリア周波数を指定[kHz]
周波数が高くなると最終段での出力が得られにくくなるため、最大でも100kHz程度にとどめることを推奨する。
デフォルトは50[kHz]
0: 成功
-1: パラメータエラー
// M1の周波数を100kHzに設定 UD3_SET_M1FREQUENCY (100);
駆動方式の都合から100%のデューテーィ比で連続運転が出来ないため、100%で指令された場合の目減り分(Recharge band)の値。負荷やPWM周波数によって調整が必要なパラメータである。
調整の際はデューティー100%で運転を指令した状態で、本設定値を0から順に負荷の運転が安定するまで大きくして行く。最大でも20%以下で安定すると思われる。
int UD3_SET_M1RECHARGE (uint8_t re);
0~100: [%]
100%-re が指令値に対するリミッタ値として機能
デフォルトは5[%]
0: 成功
-1: パラメータエラー
// M1の最大PWM制限幅を5%に設定します UD3_SET_M1RECHARGE (5);
M1の駆動モードを設定する。
UD3_SET_M1DRIVEMODE (mode);
0: ダイナミックブレーキモード (デフォルト)
1: 通常運転モード
0: 成功
-1: パラメータエラー
// M1をドライブモードにします UD3_SET_M1DRIVEMODE (1);
M1のPWMデューティー比を設定する。
int UD3_SET_M1PWMDUTY (int16_t duty);
-1000~0~1000: デューティーを指定[‰]
マイナス値は逆転、0の場合はダイナミックブレーキ
デフォルトは0。
0: 成功
-1: パラメータエラー
±1000の範囲を越えて設定されている場合にも1が返されるが、リミッタで値はクリップされる。
// M1を20%のDUTYで動作させます。 UD3_SET_M1PWMDUTY (200);
M1の設定済みPWMデューティー比を取得する。
int16_t UD3_GET_M1PWMDUTY (void);
なし
-1000~0~1000: M1のデューティ[‰]
M2のPWM周波数を設定。
int UD3_SET_M2FREQUENCY (uint8_t freq);
1~200: PWMのキャリア周波数を指定[kHz]
周波数が高くなると最終段での出力が得られにくくなるため、最大でも100kHz程度にとどめることを推奨する。
デフォルトは50[kHz]
0: 成功
-1: パラメータエラー
// M2の周波数を100kHzに設定 UD3_SET_M2FREQUENCY (100);
駆動方式の都合から100%のデューテーィ比で連続運転が出来ないため、100%で指令された場合の目減り分(Recharge band)の値。負荷やPWM周波数によって調整が必要なパラメータである。
調整の際はデューティー100%で運転を指令した状態で、本設定値を0から順に負荷の運転が安定するまで大きくして行く。最大でも20%以下で安定すると思われる。
int UD3_SET_M2RECHARGE (uint8_t re);
0~100: [%]
100%-re が指令値に対するリミッタ値として機能
デフォルトは5[%]
0: 成功
-1: パラメータエラー
// M2の最大PWM制限幅を5%に設定します UD3_SET_M2RECHARGE (5);
M2の駆動モードを設定する。
UD3_SET_M2DRIVEMODE (mode);
0: ダイナミックブレーキモード (デフォルト)
1: 通常運転モード
0: 成功
-1: パラメータエラー
// M2をドライブモードにします UD3_SET_M2DRIVEMODE (1);
M2のPWMデューティー比を設定する。
int UD3_SET_M2PWMDUTY (int16_t duty);
-1000~0~1000: デューティーを指定[‰]
マイナス値は逆転、0の場合はダイナミックブレーキ
デフォルトは0。
0: 成功
-1: パラメータエラー
±1000の範囲を越えて設定されている場合にも1が返されるが、リミッタで値はクリップされる。
// M2を20%のDUTYで動作させます。 UD3_SET_M2PWMDUTY (200);
M2の設定済みPWMデューティー比を取得する。
int16_t UD3_GET_M2PWMDUTY (void);
なし
-1000~0~1000: M2のデューティ[‰]
M1/2の回転方向を反転させる。
int UD3_SET_MOTORREVRSE (int8_t rev);
0: ノーマル (デフォルト)
1: M1のみ反転
2: M2のみ反転
3: M1,M2反転
0: 成功
-1: パラメータエラー
// 両モータの回転を逆転します。 UD3_SET_MOTORREVRSE (3);
モータの駆動ゲート回路を活性/不活性化する。M1及びM2の出力は本設定が最終出力段のスイッチとして機能するため、いかなる設定がなされていても、
ゲートをONにしない限り出力がなされない。
なお、基板のリビジョンがE093Cよりも古い場合は、CN3からの電源供給がなされていない状態でゲートを活性化すると、ゲートドライバに過大な負荷がかかり破損する可能性がある。必ず電源が供給されたことを確認した上で本APIで活性化させる手順を踏むこと。
また、基板のリビジョンがE093C以降の場合は、本設定に関わらずCN3に供給される電源が無い場合は出力が行われない。
int UD3_SET_MOTORENABLE (int8_t enb);
0: モータドライバの機能を不活性化しモータをフリー状態 (デフォルト)
1: モータドライバの機能を活性化し各パラメータに応じて出力
0: 成功
-1: パラメータエラー
// モータ駆動回路を活性化する。 UD3_SET_MOTORENABLE (1);
モータの駆動ゲート回路の状態を取得する。
bool UD3_GET_MOTORENABLE (void);
なし
true: ゲートON
false: ゲートOFF
bool stat = UD3_GET_MOTORENABLE();
M1/M2共に指令デューティーに対して最終段は常時ランプ関数を介して出力がなされる。その際のミリ秒毎での増分を設定する。
指令値の急変に際し、モータや機構、電源への負荷を軽減する目的で使用する。
int UD3_SET_MOTORRAMP (int8_t ramp);
1~200: 1ミリ秒あたりの増分[‰]
1を指定した場合、デューティー比を0‰の状態から1000‰へ変更すると1秒かけて0‰から1000‰へ直線的に変化する。また200を指定した場合、デューティー比を0‰の状態から1000‰へ変更すると5ミリ秒かけて0‰から1000‰へ直線的に変化する。
デフォルトは20。
0: 成功
-1: パラメータエラー
// 1ミリ秒毎の勾配を10‰に設定 UD3_SET_MOTORRAMP (10);
M1とM2へPWMデューティー比を同時に設定する。
int UD3_SET_DUTY (int16_t m1duty, int16_t m2duty);
-1000~0~1000: M1用デューティーを[‰]で指定
-1000~0~1000: M2用デューティーを[‰]で指定
0: 成功
-1: パラメータエラー
// M1を30%,M2を20%のDUTYで動作させます。 UD3_SET_DUTY (300, 200);
PWM8のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。
GPIO8をUD3_CFG_GPIO8でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
int UD3_SET_PWM8CLOCK (uint8_t clock);
ベースクロックを0~4で選択。
0: _UD_PWM_CLOCK_24M (24MHz)
1: _UD_PWM_CLOCK_6M (6MHz)
2: _UD_PWM_CLOCK_1500K (1.5MHz)
3: _UD_PWM_CLOCK_375K (375kHz)
4: _UD_PWM_CLOCK_46K (46.875kHz)
デフォルトは1(6MHz)
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM8のベースクロック24Mに設定します。 UD3_SET_PWM8CLOCK (_UD_PWM_CLOCK_24M);
PWM8の周期を設定する。
GPIO8をUD3_CFG_GPIO8でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM8CYCLE (uint16_t cycle);
周期を1~65535で設定。
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM8の周期を設定します。 UD3_SET_PWM8CYCLE (5000);
PWM8のDUTYを設定する。
GPIO8をUD3_CFG_GPIO8でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM8DUTY (uint16_t duty);
デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
成功すると0 、パラメータエラーがあった場合は-1が返される。
CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
// PWM8のDUTYを設定します。 UD3_SET_PWM8DUTY (5000);
PWM9のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。
GPIO9をUD3_CFG_GPIO9でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
int UD3_SET_PWM9CLOCK (uint8_t clock);
ベースクロックを0~4で選択。
0: _UD_PWM_CLOCK_24M (24MHz)
1: _UD_PWM_CLOCK_6M (6MHz)
2: _UD_PWM_CLOCK_1500K (1.5MHz)
3: _UD_PWM_CLOCK_375K (375kHz)
4: _UD_PWM_CLOCK_46K (46.875kHz)
デフォルトは1(6MHz)
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM8のベースクロック24Mに設定します。 UD3_SET_PWM9CLOCK (_UD_PWM_CLOCK_24M);
PWM9の周期を設定する。
GPIO9をUD3_CFG_GPIO9でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM9CYCLE (uint16_t cycle);
周期を1~65535で設定。
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM9の周期を設定します。 UD3_SET_PWM9CYCLE (5000);
PWM9のDUTYを設定する。
GPIO9をUD3_CFG_GPIO9でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM9DUTY (uint16_ duty);
デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
成功すると0 、パラメータエラーがあった場合は-1が返される。
CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
// PWM9のDUTYを設定します。 UD3_SET_PWM9DUTY (5000);
PWM10のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。
GPIO10をUD3_CFG_GPIO10でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
int UD3_SET_PWM10CLOCK (uint8_t clock);
ベースクロックを0~4で選択。
0: _UD_PWM_CLOCK_24M (24MHz)
1: _UD_PWM_CLOCK_6M (6MHz)
2: _UD_PWM_CLOCK_1500K (1.5MHz)
3: _UD_PWM_CLOCK_375K (375kHz)
4: _UD_PWM_CLOCK_46K (46.875kHz)
デフォルトは1(6MHz)
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM10のベースクロック24Mに設定します。 UD3_SET_PWM10CLOCK (_UD_PWM_CLOCK_24M);
PWM10の周期を設定する。
GPIO10をUD3_CFG_GPIO10でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM10CYCLE (uint16_t cycle);
周期を1~65535で設定。
成功すると0 、パラメータエラーがあった場合は-1が返される。
// PWM10の周期を設定します。 UD3_SET_PWM10CYCLE (5000);
PWM10のDUTYを設定する。
GPIO10をUD3_CFG_GPIO10でGPIO_PWMに設定する必要がある。
int UD3_SET_PWM10DUTY (uint16_t duty);
デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
成功すると0 、パラメータエラーがあった場合は-1が返される。
CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
// PWM10のDUTYを設定します。 UD3_SET_PWM10DUTY (5000);
PWM8のキャプチャしたパルス幅を取得する。
GPIO8をUD3_CFG_GPIO8でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
uint16_t UD3_GET_PWM8DUTY (void);
なし
uint16_t パルス幅
// PWM8のパルス幅を取得します。 pulse = UD3_GET_PWM8DUTY ();
PWM9のキャプチャしたパルス幅を取得する。
GPIO9をUD3_CFG_GPIO9でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
uint16_t UD3_GET_PWM9DUTY (void);
なし
uint16_t パルス幅
// PWM9のパルス幅を取得します。 pulse = UD3_GET_PWM9DUTY ();
PWM10のキャプチャしたパルス幅を取得する。
GPIO10をUD3_CFG_GPIO10でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
uint16_t UD3_GET_PWM10DUTY (void);
なし
uint16_t パルス幅
// PWM10のパルス幅を取得します。 pulse = UD3_GET_PWM10DUTY ();
ラジコン用プロポのスティック位置に不感帯を設けるための調整を行う。調整値は不揮発メモリに保存され、以後UD3_GET_RCPOSやUD3_RC_MOTORで内部的に使用される。
不感帯はスティックの中立及び最大・最少位置にそれぞれ設けられ、中立位置と最大・最少位置を正確に計測した後に反映される。スティックの位置と不感帯、デューティーとして指令される値の相関は以下の図に示す。
予めUD3_CFG_GPIO8,UD3_CFG_GPIO9,UD3_CFG_GPIO10でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
本APIが実行されると以下の手順で調整操作を行う。
bool UD3_MEASURE_STICKPOS (uint8_t pos1, uint8_t pos2);
スティック中立時の不感帯幅を0~50[%]で設定。
スティック両端時の不感帯幅を0~50[%]で設定。
bool
true 調整が成功した場合に返される。
false 調整が失敗した場合に返される。
include <ud3.h> int main (void) { // GPIO8,9をパルス幅計測モードに UD3_CFG_GPIO8 (GPIO_PWM_CAP_PULLUP_OFF); UD3_CFG_GPIO9 (GPIO_PWM_CAP_PULLUP_OFF); // モータの駆動モード設定 UD3_SET_M1DRIVEMODE (_UD_MOTOR_DRIVE); UD3_SET_M2DRIVEMODE (_UD_MOTOR_DRIVE); UD3_ACTIVE_TASK (1); } UD3_TASK1 () { // プロポの調整 if (UD3_MEASURE_STICKPOS (10, 10)) { // モータ駆動許可 UD3_SET_MOTORENABLE (true); while (1) { // 調整値を元にモータを駆動 // M1にGPIO8、M2にGPIO9を割り当てている UD3_RC_MOTOR (0, 1); } } }
指定したチャネルのラジコンプロポのスティックの値を取得する。
この取得した値は、UD3_MEASURE_STICKPOSで調整された値となる。
予めUD3_CFG_GPIO8,UD3_CFG_GPIO9,UD3_CFG_GPIO10でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
int16_t UD3_GET_RCPOS (uint8_t ch);
チャネルを指定する。
0: PWM8(GPIO8)
1: PWM9(GPIO9)
2: PWM10(GPIO10)
int16_t ラジコンプロポのスティックの位置
// PWM8に接続されているラジコンプロポのスティックの位置を取得します。 pos = UD3_GET_RCPOS (0);
UD3_MEASURE_STICKPOSにて調整されたラジコン用プロポの受信器から出力されるパルスを元にM1とM2の駆動パワーに割り当てる。
void UD3_RC_MOTOR (uint8_t rc1, uint8_t rc2);
M1に割り当てるチャネル
0: PWM8(GPIO8)
1: PWM9(GPIO9)
2: PWM10(GPIO10)
M2に割り当てるチャネル
0: PWM8(GPIO8)
1: PWM9(GPIO9)
2: PWM10(GPIO10)
なし
include <ud3.h> int main (void) { // GPIO8,9をパルス幅計測モードに UD3_CFG_GPIO8 (GPIO_PWM_CAP_PULLUP_OFF); UD3_CFG_GPIO9 (GPIO_PWM_CAP_PULLUP_OFF); // モータの駆動モード設定 UD3_SET_M1DRIVEMODE (_UD_MOTOR_DRIVE); UD3_SET_M2DRIVEMODE (_UD_MOTOR_DRIVE); // モータ駆動許可 UD3_SET_MOTORENABLE (true); UD3_ACTIVE_TASK (1); } UD3_TASK1 () { // プロポの調整 UD3_MEASURE_STICKPOS (10, 10); while (1) { // 調整値を元にGPIO8をM1,GPIO9をM2に割り当てて運転 UD3_RC_MOTOR (0, 1); } }
BluetoothのモードがSIXAXISで、SIXAXISないしDUALSHOCK3がワイヤレス接続された時に取得出来る情報です。デジタルボタンの押力の取得及び振動モータの運転は出来ません。 なお、予めUD3_ASSIGN_BT_TO_SIXAXISにてBluetoothにSIXAXIS通信機能を割り当てておく必要は特にありませんが、ブートローダでBluetoothをSIXAXISモードに設定した場合はそれ以外の機能への割り当てはできません。
※こちらのAPIはUD3.5では利用できません。
SIXAXISのグループ1に属するボタン情報を取得する。
uint8_t UD3_GET_PSDIGITAL1(void);
なし
uint8_t グループ1のボタン情報 押下状態で該当ビットが1
BIT | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
ボタン | ← | ↓ | → | ↑ | START | ANALOG R PUSH | ANALOG L PUSH | SELECT |
uint8_t btg1 = UD3_GET_PSDIGITAL1 ();
SIXAXISのグループ2に属するボタン情報を取得する。
uint8_t UD3_GET_PSDIGITAL2(void);
なし
uint8_t グループ2のボタン情報 押下状態で該当ビットが1
BIT | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
ボタン | □ | × | ○ | △ | R1 | L1 | R2 | L2 |
uint8_t btg2 = UD3_GET_PSDIGITAL2 ();
SIXAXISのグループ3に属するボタン情報を取得する。
uint8_t UD3_GET_PSDIGITAL3(void);
なし
uint8_t グループ3のボタン情報 押下状態で該当ビットが1
BIT | bit7..1 | bit0 |
ボタン | - | PS |
uint8_t btg3 = UD3_GET_PSDIGITAL3 ();
SIXAXISの左側アナログスティックのX軸情報を取得する。
uint8_t UD3_GET_PSLX(void);
なし
uint8_t 左側アナログスティックの位置が左端で0、右端で255を返す。
uint8_t lx = UD3_GET_PSLX ();
SIXAXISの左側アナログスティックのY軸情報を取得する。
uint8_t UD3_GET_PSLY(void);
なし
uint8_t 左側アナログスティックの位置が上端で0、下端で255を返す。
uint8_t ly = UD3_GET_PSLY ();
SIXAXISの右側アナログスティックのX軸情報を取得する。
uint8_t UD3_GET_PSRX(void);
なし
uint8_t 右側アナログスティックの位置が左端で0、右端で255を返す。
uint8_t rx = UD3_GET_PSRX ();
SIXAXISの右側アナログスティックのY軸情報を取得する。
uint8_t UD3_GET_PSRY(void);
なし
uint8_t 右側アナログスティックの位置が上端で0、下端で255を返す。
uint8_t ry = UD3_GET_PSRY ();
SIXAXISのL2の情報を取得する。
uint8_t UD3_GET_PSL2(void);
なし
uint8_t L2が解放で0、最大押下で255を返す。
uint8_t l2 = UD3_GET_PSL2 ();
SIXAXISのR2の情報を取得する。
uint8_t UD3_GET_PSR2(void);
なし
uint8_t R2が解放で0、最大押下で255を返す。
uint8_t r2 = UD3_GET_PSR2 ();
SIXAXISのX軸加速度を取得する。
uint16_t UD3_GET_PSGX(void);
なし
uint16_t 0~1023の範囲でX軸の加速度を返す。
uint16_t gx = UD3_GET_PSGX ();
SIXAXISのY軸加速度を取得する。
uint16_t UD3_GET_PSGY(void);
なし
uint16_t 0~1023の範囲でY軸の加速度を返す。
uint16_t gy = UD3_GET_PSGY ();
SIXAXISのZ軸加速度を取得する。
uint16_t UD3_GET_PSGZ(void);
なし
uint16_t 0~1023の範囲でZ軸の加速度を返す。
uint16_t gz = UD3_GET_PSGZ ();
SIXAXISの角加速度を取得する。
uint16_t UD3_GET_PSGYRO(void);
なし
uint16_t 0~1023の範囲で角加速度を返す。
uint16_t gyro = UD3_GET_PSGYRO ();
USB・Bluetooth・RS485の各I/Fは、「コンソール」「Dynamixelホスト」「Dynamixelクライアント」「SIXAXIS通信」のいずれかの機能を割り当てて使用する事ができます。USBとRS485は初期状態においてどの機能も割り当てられていないため、それぞれの機能を使用したAPIも機能しない状態になっています。Bluetoothについては、ブートローダでSIXAXISモードの設定がなされた場合のみ、「SIXAXIS通信」機能が自動的に活性化します。
なお、RS485に「コンソール」機能を割り当てた場合はボーレートが1M[bps]固定され、「Dynamixelホスト」機能はRS485のみ、「SIXAXIS通信」機能はBluetoothにのみ設定できます。
USBをコンソール機能に割り当てる。以前のUSBへの割り当ては解除される。
bool UD3_ASSIGN_USB_TO_CONSOLE (void);
なし
true: 割り当て成功
false: 割り当て失敗
#include <ud3.h> void main (void) { int i, n = 0; char c, s[20]; // 全I/Fをコンソールに UD3_ASSIGN_USB_TO_CONSOLE (); UD3_ASSIGN_RS485_TO_CONSOLE (); UD3_ASSIGN_BT_TO_CONSOLE (); while (1) { // 受信バッファにデータがあるまでループ while (UD3_RXBUFF ()) { // 1バイト取り出して送信 UD3_PUTC (c = UD3_GETC ()); switch (c) { // 文字列送信 case '0': UD3_PUTS ("\nHELLO!\n"); break; // 書式付文字列送信 case '1': UD3_PRINTF ("\nn++=%d\n", n++); break; // 文字列受信 case '2': UD3_PUTS ("\ns<-"); UD3_GETS (s, 19); UD3_PUTS ("\n"); UD3_PUTS (s); break; // 書式付文字列入力 case '3': UD3_PUTS ("\ni<-"); UD3_SCANF ("%d", &i); UD3_PRINTF ("\nd=%d\n", i); break; } } UD3_WAIT (10); } }
USBをDynamixelのクライアント機能に割り当てる。以前のUSBへの割り当ては解除される。
bool UD3_ASSIGN_USB_TO_DXCLIENT (void);
なし
true: 割り当て成功
false: 割り当て失敗
以前のUSBへの割り当てを解除する。
bool UD3_DEASSIGN_USB (void);
なし
true: 割り当て成功
false: 割り当て失敗
RS485をコンソール機能に割り当てる。以前のRS485への割り当ては解除される。
bool UD3_ASSIGN_RS485_TO_CONSOLE (void);
なし
bool 割り当てが成功するとtrue
RS485をDynamixelのクライアント機能に割り当てる。以前のRS485への割り当ては解除される。
bool UD3_ASSIGN_RS485_TO_DXCLIENT (void);
なし
true: 割り当て成功
false: 割り当て失敗
RS485をDynamixelのホスト機能に割り当てる。以前のRS485への割り当ては解除される。
bool UD3_ASSIGN_RS485_TO_DXHOST (void);
なし
bool 割り当てが成功するとtrue
以前のRS485への割り当てを解除する。
bool UD3_DEASSIGN_RS485 (void);
なし
true: 割り当て成功
false: 割り当て失敗
Bluetoothをコンソール機能に割り当てる。以前のBluetoothへの割り当ては解除される。
bool UD3_ASSIGN_BT_TO_CONSOLE (void);
なし
true: 割り当て成功
false: 割り当て失敗
BluetoothをDynamixelのクライアント機能に割り当てる。以前のBluetoothへの割り当ては解除される。
bool UD3_ASSIGN_BT_TO_DXCLIENT (void);
なし
true: 割り当て成功
false: 割り当て失敗
BluetoothをSIXAXISないしDUALSHOCK3との通信機能に割り当てる。以前のBluetoothへの割り当ては解除される。
なお、UD3.5では利用できない。
bool UD3_ASSIGN_BT_TO_SIXAXIS (void);
なし
true: 割り当て成功
false: 割り当て失敗
以前のBluetoothへの割り当てを解除する。
bool UD3_DEASSIGN_BT (void);
なし
true: 割り当て成功
false: 割り当て失敗
コンソールに1文字送信する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
void UD3_PUTC (char c);
送信文字(1バイト)を指定
なし
コンソールから1文字取得する。受信バッファが空の場合は最低1バイト受信するまで返らない。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
char UD3_GETC (void);
なし
char 受信文字
コンソールからエンター(CRかLF)ないしエスケープ(ESC)コードを受信するまで文字列を取得する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
int UD3_GETS (char *s, int len);
受信文字列を保存するバッファのポインタを指定
受信文字列の最大バッファサイズを指定
int 受信文字数
コンソールへ文字列を送信する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
void UD3_PUTS (char *s);
送信文字列(NULLターミネーション)のポインタを指定
なし
コンソールへ指定バイト数のデータを送信する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
void UD3_PUTSB (char *s, int len);
送信データのポインタを指定
送信バイト数を指定
なし
コンソールから受信されたバイト数を返す。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
int UD3_RXBUFF (void);
なし
int 受信バイト数。
コンソールへ書式化文字列を送信する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
int UD3_PRINTF (const char *format, ...) {
書式文字列
可変個引数
int 送信バイト数。
コンソールから書式化文字列を受信する。
予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
int UD3_SCANF (const char *type, void *val);
書式文字列
格納先変数
int 入力データの個数。
RS485を使用してUD3をホストとした他のDynamixelスレーブ機器との通信を行います。
なお、UD3のRS485はデフォルトで機能が割り当てられていないため、予めUD3_ASSIGN_RS485_TO_DXHOSTにてRS485にDynamixelホスト機能を割り当てておく必要があります。
ボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、以後このボーレートを基準にして動作する。
なお、ライブラリ内では静的に1M[bps]で初期化されているため、そのままで支障がなければ特に変更の必要はない。
bool DX_ChangeBaudrate (uint32_t baud);
ネットワークの装置とFDIII-HC間の通信速度[bps]
true: 成功
false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
#include <ud3.h> #include <math.h> #define _ADDRESS_LED 25 #define _ADDRESS_GOAL_POSITION 30 #define _ADDRESS_PRESENT_POSITION 36 short presentpos, goalpos; void main (void) { uint16_t err; UD3_WAIT (2000); UD3_ASSIGN_USB_TO_CONSOLE (); UD3_ASSIGN_RS485_TO_DXHOST (); DX_ChangeBaudrate (1000000); if (DX_Ping (1, 500, &err)) UD3_PUTS ("\n[PING] ID:1 Found"); else UD3_PUTS ("\n[PING] ID:1 Not Found"); UD3_ACTIVE_TASK (1); UD3_ACTIVE_TASK (2); UD3_ACTIVE_TASK (3); while (1) { UD3_PRINTF ("\rGOALPOS=%4d PRESENTPOS=%4d DIFF=%5d\33[K", goalpos, presentpos, goalpos - presentpos); UD3_WAIT (50); } } UD3_TASK1 () { while (1) { goalpos = sin (UD3_GET_ELAPSEDTIME () / 1000.0) * 511.5 + 511.5; DX_WriteWordData (1, _ADDRESS_GOAL_POSITION, goalpos, DX_CalcTimeout (6), NULL); UD3_WAIT (5); } } UD3_TASK2 () { uint16_t p; while (1) { if (DX_ReadWordData (1, _ADDRESS_PRESENT_POSITION, &p, DX_CalcTimeout (8), NULL)) presentpos = p; UD3_WAIT (10); } } UD3_TASK3 () { uint8_t led = 0; while (1) { DX_WriteByteData (1, _ADDRESS_LED, led, DX_CalcTimeout (6), NULL); led ^= 1; UD3_WAIT (200); } }
ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
uint32_t DX_CalcTimeout (int num);
バイト数
タイムアウト時間[ms]
指定されたIDを持つデバイスを対象に、PINGを発行する。IDがわかっている場合に使用する。
bool DX_Ping (uint8_t id, uint32_t timeout, uint16_t *errcode);
0~253: 対象デバイスのID
検出タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 指定IDのデバイスが見つかった
false: 指定IDのデバイスがタイムアウト時間を超過しても見つからない
不特定のIDを持つデバイスを対象に、PINGを発行する(ブロードキャストIDを使用してPING)。IDがわからないデバイスに対して使用するため、ネットワーク上に接続されるデバイスは1台のみとする事。
bool DX_Ping2 (uint8_t *id, uint32_t timeout, uint16_t *errcode);
検出されたデバイスのIDを保存するuint8_t型の変数のアドレス
検出タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 何らかのデバイスが応答しIDを取得できた
false: デバイスがタイムアウト時間を超過しても見つからない
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
bool DX_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, uint16_t *errcode);
0~253: 対象デバイスのID
0~254: 対象アドレス
読み出したデータを保存するuint8_t型の変数のアドレス
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, uint16_t *errcode);
0~253: 対象デバイスのID
0~254: 対象アドレス
読み出したデータを保存するuint16_t型の変数のアドレス
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
bool DX_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, uint16_t *errcode);
0~253: 対象デバイスのID
0~254: 対象アドレス
読み出したデータを保存するuint8_t型の配列のアドレス
読み出すバイト数
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
bool DX_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, uint16_t *errcode);
0~254: 対象デバイスのID
0~254: 対象アドレス
0~255: 送信データ
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
bool DX_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, uint16_t *errcode);
0~254: 対象デバイスのID
0~254: 対象アドレス
0~65535: 送信データ
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
bool DX_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, uint16_t *errcode);
0~254: 対象デバイスのID
0~254: 対象アドレス
書き込むデータを保存したuint8_t型の配列のアドレス
datのバイト数
0~500: 受信タイムアウト時間[ms]
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗
SYNCインストラクションを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
bool DX_WriteSyncData (const uint8_t *dat, uint8_t size, uint16_t *errcode);
SYNCインストラクションのパラメータ部分を記述したuint8_t型の配列のアドレス
datのバイト数
デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
true: 成功
false: 失敗