1: 2011-08-07 (日) 16:39:21 takaboo ソース
Line 1: Line 1:
 +#nocontents
 +*概要 [#od287dd9]
 +UD3ライブラリは、[[ユニバーサルドライバ3>UD3]]シリーズで構成されたアプリケーションを効率的に運用するためのライブラリです。~
 +GPIOに入力されたセンサの状態からそれに応じたDCモータの制御といったアプリケーションレベルにおいて最低限必要な機能を本ライブラリでカバーします。~
 +なお、本ライブラリはその外のライブラリ(SAM7S, SAM7S_TOPPERS等)を静的に使用していますので、ベンダーから提供されるGCC Developer Liteをインストールする際は、各コンポーネントを手動で選択することなくフルインストールした環境で使用して下さい。また、全てのソースもインストールと同時に展開されますので、必要に応じて参照できます。~
 +本ライブラリで提供されるAPIのプロトタイプ宣言や特殊な構造体はud3.hに集約されています。このヘッダファイルに宣言が無いAPIは使用しないで下さい。
 +*API [#leec6888]
 +機能別にAPIの詳細を解説します。主なコンテンツを以下に紹介します。
 +-[[OS及びタスク関連>#g1e34fba]]
 +-[[GPIO>#u6745dd8]]
 +-[[MMI>#e45522b5]]
 +-[[モータアンプ>#u7a23908]]
 +-[[GPIOパルス入出力>#o25124f6]]
 +-[[SIXAXIS>#tc0f292d]]
 +-[[コンソール>#d0d4a9b4]]
 +-[[Dynamixelホスト>#rd133a45]]
 +
 +必要に応じてAPIを使用してユーザアプリケーションを構成します。まずは[[UD3のサンプルプログラム>UD3#kf8170aa]]を一通り実行して、動作を確認する事を推奨します。
 +
 +**OS及びタスク関連 [#g1e34fba]
 +OSで管理されるタスクや時間に関するAPIです。~
 +ユーザは任意のタスクを最大4つまで作成可能で、自動的にマルチタスクで動作する設定になっています。システムで予約されたタスク(TASK5)は自動的に登録されますが、意図的に停止させてしまうと全APIが正常に動作しなくなりますので絶対に停止させないでください。
 +
 +***main [#v3c21b98]
 +メインタスクに相当し、一番最初に実行される初期化関数。タスクの起動やGPIOの初期化等はこの関数内で記述する。~
 +なお本タスクは優先度が最上位にあるため、並列で他のタスクを実行する際はUD3_WAIT等を挿入して意図的にタスクスイッチを促すべきである。
 + int main (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~int
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +}
 +</pre>
 +}}
 +***UD3_TASK1 [#n10e53c9]
 +UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK1の名称で作られた関数は自動的にタスク1としてOSに登録される。~
 +タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
 +複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
 +
 + UD3_TASK1()
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をアクティブ化
 +}
 +</pre>
 +}}
 +
 +***UD3_TASK2 [#xb6d65de]
 +UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK2の名称で作られた関数は自動的にタスク2としてOSに登録される。~
 +タスクの活性化はタスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
 +で行う。~
 +複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
 + UD3_TASK2();
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をアクティブ化
 +}
 +</pre>
 +}}
 +
 +***UD3_TASK3 [#e13da6de]
 +UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK3の名称で作られた関数は自動的にタスク3としてOSに登録される。~
 +タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
 +複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
 +
 + UD3_TASK3();
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をアクティブ化
 +}
 +</pre>
 +}}
 +
 +***UD3_TASK4 [#w06ef286]
 +UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK4の名称で作られた関数は自動的にタスク4としてOSに登録される。~
 +タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
 +複数のタスクを定義し活性化すると各々のタスクはOSによって並列実行されるが、タスク数に乗じてタスク自体の実行速度は遅くなる。
 + UD3_TASK4();
 +-パラメータ
 +~なし
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をアクティブ化
 +}
 +</pre>
 +}}
 +
 +***UD3_ACTIVE_TASK [#f9cdcf0a]
 +指定したタスクをアクティブにする。タスクをアクティブにしていない場合には、タスクを定義してあってもそのタスクは実行されない。
 +
 + void UD3_ACTIVE_TASK (task);
 +-パラメータ
 +--int_t '''task'''
 +~1~4: タスク番号
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をアクティブ化
 +}
 +</pre>
 +}}
 +
 +***UD3_SUSPEND_TASK [#j900e682]
 +指定したアクティブなタスクをサスペンドする。レジュームするには[[UD3_RESUME_TASK>#l31e0f36]]を使用する。
 + int UD3_SUSPEND_TASK (char task);
 +-パラメータ
 +--char  '''task'''
 +~1~4: タスク番号
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をサスペンド
 +}
 +</pre>
 +}}
 +
 +***UD3_RESUME_TASK [#l31e0f36]
 +指定したサスペンドしているタスクをレジュームする。サスペンドするには[[UD3_SUSPEND_TASK>#j900e682]]を使用する。
 +
 + int UD3_RESUME_TASK (char task);
 +-パラメータ
 +--char  '''task'''
 +~1~4: タスク番号
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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をレジューム
 +}
 +</pre>
 +}}
 +
 +***UD3_WAIT [#ja9bd39f]
 +ミリ秒単位でプログラムの実行を待つ。
 + void UD3_WAIT (int_t tm);
 +-パラメータ
 +--int_t '''tm'''
 +~1~: 待ち時間[msec]を指定
 +-戻り値
 +~なし
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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秒待ち
 +  }
 +}</pre>
 +}}
 +
 +***UD3_GET_ELAPSEDTIME [#lf9e26fd]
 +アプリケーション起動時からの経過時間をミリ秒単位で取得。
 + uint32_t UD3_GET_ELAPSEDTIME (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~0~: 経過時間
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +uint32_t tm = UD3_GET_ELAPSEDTIME ();
 +</pre>
 +}}
 +
 +***UD3_GET_BTCONNECT [#odf822c9]
 +Bluetoothの接続状態を取得する。なお、接続相手の強制的な電源断等が発生した場合は、状態の繊維に数秒の時間を要する場合がある。
 + bool UD3_GET_BTCONNECT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 接続中~
 +false: 切断中
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +bool stat = UD3_GET_BTCONNECT();
 +</pre>
 +}}
 +
 +**GPIO [#u6745dd8]
 +GPIO0~11の初期設定や状態の取得APIです。
 +
 +***UD3_CFG_GPIO0 [#c10e9d62]
 +GPIO0の端子機能を設定する。
 + int UD3_CFG_GPIO0 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +}
 +</pre>
 +}}
 +
 +***UD3_CFG_GPIO1 [#y4f5f690]
 +GPIO1の端子機能を設定する。
 + int UD3_CFG_GPIO1 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO2 [#l7586e65]
 +GPIO2の端子機能を設定する。
 + int UD3_CFG_GPIO2 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO3 [#a02184b5]
 +GPIO3の端子機能を設定する。
 + int UD3_CFG_GPIO3 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO4 [#l791e053]
 +GPIO4の端子機能を設定する。
 + int UD3_CFG_GPIO4 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO5 [#ad4fd1e3]
 +GPIO5の端子機能を設定する。
 + int UD3_CFG_GPIO5 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO6 [#x95d33cb]
 +GPIO6の端子機能を設定する。
 + int UD3_CFG_GPIO6 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO7 [#c82b29f3]
 +GPIO7の端子機能を設定する。
 + int UD3_CFG_GPIO7 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO8 (update)[#n31eda6b]
 +GPIO8の端子機能を設定する。
 + int UD3_CFG_GPIO8 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +}
 +</pre>
 +}}
 +
 +***UD3_CFG_GPIO9 (update)[#u201f4af]
 +GPIO9の端子機能を設定する。
 + int UD3_CFG_GPIO9 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_CFG_GPIO10 (update)[#d2dd2f39]
 +GPIO10の端子機能を設定する。
 + int UD3_CFG_GPIO10 (TGPIOMode conf);
 +-パラメータ
 +--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: パラメータエラー
 +
 +***UD3_GET_GPIOINPUT [#qdba2bbc]
 +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  |
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_SET_GPIOOUTPUT [#sb36fb83]
 +UD3_CFG_GPIOxにてGPIO_OUT_OPENDRAINないしGPIO_OUT_PUSHPULLに設定された端子のみ出力状態を変更する。
 + int UD3_SET_GPIOOUTPUT (uint16_t out);
 +-パラメータ
 +~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: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_GET_ADC [#f0162d6a]
 +GPIO0~7に入力された電圧値を取得する。~
 +ADCに使用するGPIOをUD3_CFG_GPIOxで設定する必要がある。
 + uint16_t UD3_GET_ADC (uint8_t ch);
 +-パラメータ
 +--uint8_t '''ch'''
 +~0~7: 計測するGPIOの番号(GPIO0~GPIO7)
 +-戻り値
 +~0~1023: 指定GPIO番号で計測された電圧(0~3.3V)
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +**MMI [#e45522b5]
 +プッシュボタン・ディップスイッチ・LED・ブザー関連のAPIです。
 +
 +***UD3_SET_BUZZER [#y8fc67a7]
 +任意周波数・音長でブザーを鳴らす。
 + int UD3_SET_BUZZER (uint8_t scale, uint8_t len);
 +-パラメータ
 +--uint8_t '''scale'''
 +~0~52: Cから始まる(C,C#,D,D#,E,F,F#,G,G#,A,A#,B)6オクターブの音程
 +--uint8_t '''len'''
 +~0~250: 音長(x10ms)
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <ud3.h>
 +
 +void main (void) {
 +  while (1) {
 +   UD3_SET_BUZZER (24, 20);
 +   UD3_WAIT (300);
 +   UD3_SET_BUZZER (30, 20);
 +   UD3_WAIT (300);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_SET_LED [#q6f1d21e]
 +LEDの点灯/消灯。~
 + int UD3_SET_LED (uint8_t on);
 +-パラメータ
 +--uint8_t '''on'''
 +~0: 消灯~
 +1: 点灯
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <ud3.h>
 +
 +void main (void) {
 +  while (1) {
 +   UD3_SET_LED (1);
 +   UD3_WAIT (200);
 +   UD3_SET_LED (0);
 +   UD3_WAIT (200);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_GET_PUSHBUTTON1 [#xe62248e]
 +PB1の状態を取得。
 + bool UD3_GET_PUSHBUTTON1 (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: PB1が押されている~
 +false: PB1が放されている
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <ud3.h>
 +
 +void main (void) {
 +  while (1) {
 +   UD3_SET_LED (UD3_GET_PUSHBUTTON1 ());
 +   UD3_WAIT (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_GET_PUSHBUTTON2 [#t4c165bb]
 +PB2の状態を取得。
 + bool UD3_GET_PUSHBUTTON2 (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: PB2が押されている~
 +false: PB2が放されている
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#include <ud3.h>
 +
 +void main (void) {
 +  while (1) {
 +   UD3_SET_LED (UD3_GET_PUSHBUTTON2 ());
 +   UD3_WAIT (10);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_GET_DIPSWICH [#o08f8c1c]
 +DIP1の状態を取得。
 + uint8_t UD3_GET_DIPSWICH (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~0~15: DIP1に設定された値
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +**モータアンプ [#u7a23908]
 +2つのモータドライバの初期設定やデューティー関連のAPIです。
 +
 +なお、設定デューティ値と出力の相関は以下の図に従い、Duty limit(API上用意されず常時1000‰)とRecharge bandにより制限された水色の出力となります。なお、Recharge bandは全てにおいて優先されます。
 +
 +#ref(ud3_motor_limit1.png,100%)
 +#ref(ud3_motor_limit2.png,100%)
 +
 +***UD3_SET_M1FREQUENCY [#wc47b8e1]
 +M1のPWM周波数を設定。~
 + int UD3_SET_M1FREQUENCY (uint8_t freq);
 +-パラメータ
 +--uint8_t '''freq'''
 +~周波数を0~200[kHz]で指定。~
 +なお周波数が高くなると最終段での出力が得られにくくなるため、最大でも100kHz程度にとどめることを推奨する。
 +~デフォルトは50kHz
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M1の周波数を100kHzに設定
 + UD3_SET_M1FREQUENCY (100);
 +
 +***UD3_SET_M1RECHARGE [#n8f06456]
 +駆動方式の都合から100%のデューテーィ比で連続運転が出来ないため、100%で指令された場合の目減り分(Recharge band)の値。負荷やPWM周波数によって調整が必要なパラメータである。~
 +調整の際はデューティー100%で運転を指令した状態で、本設定値を0から順に負荷の運転が安定するまで大きくして行く。最大でも20%以下で安定すると思われる。
 + int UD3_SET_M1RECHARGE (uint8_t re);
 +-パラメータ
 +--uint8_t '''re'''
 +~0~100[%]を設定。100%-re が出力リミッタとして働く。
 +~デフォルトは5%
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M1の最大PWM制限幅を5%に設定します
 + UD3_SET_M1RECHARGE (5);
 +
 +***UD3_SET_M1DRIVEMODE [#a35c521d]
 +M1の駆動モードを設定する。
 + UD3_SET_M1DRIVEMODE (mode);
 +-パラメータ
 +--uint8_t '''mode'''
 +~0: _UD_MOTOR_BRAKE (ブレーキモード)~
 +1: _UD_MOTOR_DRIVE (ドライブモード)
 +~デフォルトは_UD_MOTOR_BRAKE。
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M1をドライブモードにします
 + UD3_SET_M1DRIVEMODE (_UD_MOTOR_DRIVE);
 +
 +***UD3_SET_M1PWMDUTY [#de09cbea]
 +M1のPWMデューティー比を設定する。~
 + int UD3_SET_M1PWMDUTY (int16_t duty);
 +-パラメータ
 +--int16_t '''duty'''
 +~デューティーを-1000~0~1000[‰]で指定。マイナス値は逆転を意味する。~
 +0‰の場合はショートブレーキとなる。
 +~デフォルトは0‰。
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー~
 +±1000の範囲を越えて設定されている場合にも1が返されるが、リミッタで値はクリップされる。
 +-使用例
 + // M1を20%のDUTYで動作させます。
 + UD3_SET_M1PWMDUTY (200);
 +
 +***UD3_GET_M1PWMDUTY [#q5687f5b]
 +M1の設定済みPWMデューティー比を取得する。~
 + int16_t UD3_GET_M1PWMDUTY (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~-1000~0~1000[‰]。
 +
 +***UD3_SET_M2FREQUENCY [#jf15fafa]
 +M2のPWM周波数を設定。~
 + int UD3_SET_M2FREQUENCY (uint8_t freq);
 +-パラメータ
 +--uint8_t '''freq'''
 +~周波数を0~200[kHz]で指定。~
 +なお周波数が高くなると最終段での出力が得られにくくなるため、最大でも100kHz程度にとどめることを推奨する。
 +~デフォルトは50kHz
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M2の周波数を100kHzに設定
 + UD3_SET_M2FREQUENCY (100);
 +
 +***UD3_SET_M2RECHARGE [#q3ed4f2c]
 +駆動方式の都合から100%のデューテーィ比で連続運転が出来ないため、100%で指令された場合の目減り分(Recharge band)の値。負荷やPWM周波数によって調整が必要なパラメータである。~
 +調整の際はデューティー100%で運転を指令した状態で、本設定値を0から順に負荷の運転が安定するまで大きくして行く。最大でも20%以下で安定すると思われる。
 + int UD3_SET_M2RECHARGE (uint8_t re);
 +-パラメータ
 +--uint8_t '''re'''
 +~0~100[%]を設定。100%-re が出力リミッタとして働く。
 +~デフォルトは5%。
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M2の最大PWM制限幅を5%に設定します
 + UD3_SET_M2RECHARGE (5);
 +
 +***UD3_SET_M2DRIVEMODE [#k9ab964c]
 +M2の駆動モードを設定する。
 + UD3_SET_M2DRIVEMODE (mode);
 +-パラメータ
 +--uint8_t '''mode'''
 +~0: _UD_MOTOR_BRAKE (ブレーキモード)~
 +1: _UD_MOTOR_DRIVE (ドライブモード)
 +~デフォルトは_UD_MOTOR_BRAKE。
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M2をドライブモードにします
 + UD3_SET_M2DRIVEMODE (_UD_MOTOR_DRIVE);
 +
 +***UD3_SET_M2PWMDUTY [#k2c1cab9]
 +M2のPWMデューティー比を設定する。~
 + int UD3_SET_M2PWMDUTY (int16_t duty);
 +-パラメータ
 +--int16_t '''duty'''
 +~デューティーを-1000~0~1000[‰]で指定。マイナス値は逆転を意味する。~
 +0‰の場合はショートブレーキとなる。
 +~デフォルトは0‰。
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー~
 +±1000の範囲を越えて設定されている場合にも1が返されるが、リミッタで値はクリップされる。
 +-使用例
 + // M2を20%のDUTYで動作させます。
 + UD3_SET_M2PWMDUTY (200);
 +
 +***UD3_GET_M2PWMDUTY [#hed95d65]
 +M2の設定済みPWMデューティー比を取得する。~
 + int16_t UD3_GET_M2PWMDUTY (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~-1000~0~1000[‰]。
 +
 +***UD3_SET_MOTORREVRSE [#m604c98d]
 +M1/2の回転方向を反転させる。
 + int UD3_SET_MOTORREVRSE (int8_t rev);
 +-パラメータ
 +--int8_t '''rev'''
 +~0: ノーマル (デフォルト)~
 +1: M1のみ反転~
 +2: M2のみ反転~
 +3: M1,M2反転
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // 両モータの回転を逆転します。
 + UD3_SET_MOTORREVRSE (_M1_REV | _M2_REV);
 +
 +***UD3_SET_MOTORENABLE [#x441e3d8]
 +モータの駆動ゲート回路を活性/不活性化する。~
 +なお、CN3からの電源供給がなされていない状態で活性化するとゲートドライバに過大な負荷がかかり破損する可能性がある。必ず電源が供給されたことを確認した上で本APIで活性化させる手順を踏むこと。
 + int UD3_SET_MOTORENABLE (int8_t enb);
 +-パラメータ
 +--int8_t '''enbv'''
 +~0: モータドライバの機能を不活性化しモータをフリー状態 (デフォルト)~
 +1: モータドライバの機能を活性化し各パラメータに応じて出力
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // モータ駆動回路を活性化する。
 + UD3_SET_MOTORENABLE (1);
 +
 +***UD3_GET_MOTORENABLE [#t660991d]
 +モータの駆動ゲート回路の状態を取得する。
 + bool UD3_GET_MOTORENABLE (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: ゲートON~
 +false: ゲートOFF
 +-使用例
 + bool stat = UD3_GET_MOTORENABLE();
 +
 +***UD3_SET_MOTORRAMP [#o63cc21d]
 +M1/M2共に指令デューティーに対して最終段は常時ランプ関数を介して出力がなされる。その際のミリ秒毎での増分を設定する。~
 +指令値の急変に際し、モータや機構、電源への負荷を軽減する目的で使用する。
 + int UD3_SET_MOTORRAMP (int8_t ramp);
 +-パラメータ
 +--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);
 +
 +***UD3_SET_DUTY [#u0bc4a8b]
 +M1とM2へPWMデューティー比を同時に設定する。~
 + int UD3_SET_DUTY (int16_t m1duty, int16_t m2duty);
 +-パラメータ
 +--int16_t '''m1duty'''
 +~-1000~0~1000: M1用デューティーを[‰]で指定~
 +--int16_t '''m2duty'''
 +~-1000~0~1000: M2用デューティーを[‰]で指定
 +-戻り値
 +~0: 成功~
 +''-''1: パラメータエラー
 +-使用例
 + // M1を30%,M2を20%のDUTYで動作させます。
 + UD3_SET_DUTY (300, 200);
 +
 +**GPIOパルス入出力 [#o25124f6]
 +
 +***UD3_SET_PWM8CLOCK (update)[#g666594c]
 +PWM8のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。~
 +GPIO8を[[UD3_CFG_GPIO8>#u201f4af]]でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + int UD3_SET_PWM8CLOCK (uint8_t clock);
 +-パラメータ
 +--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);
 +
 +***UD3_SET_PWM8CYCLE [#pf67c2d8]
 +PWM8の周期を設定する。~
 +GPIO8を[[UD3_CFG_GPIO8>#u201f4af]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM8CYCLE (uint16_t cycle);
 +-パラメータ
 +--uint16_t '''cycle'''
 +~周期を1~65535で設定。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +-使用例
 + // PWM8の周期を設定します。
 + UD3_SET_PWM8CYCLE (5000);
 +
 +***UD3_SET_PWM8DUTY [#s1513f14]
 +PWM8のDUTYを設定する。~
 +GPIO8を[[UD3_CFG_GPIO8>#u201f4af]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM8DUTY (uint16_t duty);
 +-パラメータ
 +--uint16_t '''duty'''
 +~デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
 +-使用例
 + // PWM8のDUTYを設定します。
 + UD3_SET_PWM8DUTY (5000);
 +
 +***UD3_SET_PWM9CLOCK (update)[#ae26f679]
 +PWM9のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。~
 +GPIO9を[[UD3_CFG_GPIO9>#u201f4af]]でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + int UD3_SET_PWM9CLOCK (uint8_t clock);
 +-パラメータ
 +--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);
 +
 +***UD3_SET_PWM9CYCLE [#sae67585]
 +PWM9の周期を設定する。~
 +GPIO9を[[UD3_CFG_GPIO9>#j90d8ac4]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM9CYCLE (uint16_t cycle);
 +-パラメータ
 +--uint16_t '''cycle'''
 +~周期を1~65535で設定。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +-使用例
 + // PWM9の周期を設定します。
 + UD3_SET_PWM9CYCLE (5000);
 +
 +***UD3_SET_PWM9DUTY [#pae41f19]
 +PWM9のDUTYを設定する。~
 +GPIO9を[[UD3_CFG_GPIO9>#j90d8ac4]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM9DUTY (uint16_ duty);
 +-パラメータ
 +--uint16_t '''duty'''
 +~デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
 +-使用例
 + // PWM9のDUTYを設定します。
 + UD3_SET_PWM9DUTY (5000);
 +
 +***UD3_SET_PWM10CLOCK (update)[#cd6005d8]
 +PWM10のPWM出力及びPWM幅計測用ベースクロックを設定する。PWM出力及びPWM幅計測は本クロックを基準に最大16bitカウンタとして機能する。~
 +GPIO10を[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWMないしGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + int UD3_SET_PWM10CLOCK (uint8_t clock);
 +-パラメータ
 +--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);
 +
 +***UD3_SET_PWM10CYCLE [#nefca4e0]
 +PWM10の周期を設定する。~
 +GPIO10を[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM10CYCLE (uint16_t cycle);
 +-パラメータ
 +--uint16_t '''cycle'''
 +~周期を1~65535で設定。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +-使用例
 + // PWM10の周期を設定します。
 + UD3_SET_PWM10CYCLE (5000);
 +
 +***UD3_SET_PWM10DUTY [#a36b0abc]
 +PWM10のDUTYを設定する。~
 +GPIO10を[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWMに設定する必要がある。
 + int UD3_SET_PWM10DUTY (uint16_t duty);
 +-パラメータ
 +--uint16_t '''duty'''
 +~デューティーを0~65535で設定。PWMはDUTY/CYCLEの比で出力される。
 +-戻り値
 +~成功すると0 、パラメータエラーがあった場合は-1が返される。~
 +CYCLEで設定された周期値を越えて設定されている場合に1が返され、CYCLE値でクリップされる。
 +-使用例
 + // PWM10のDUTYを設定します。
 + UD3_SET_PWM10DUTY (5000);
 +
 +***UD3_GET_PWM8DUTY [#td3856a0]
 +PWM8のキャプチャしたパルス幅を取得する。~
 +GPIO8を[[UD3_CFG_GPIO8>#u201f4af]]でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + uint16_t UD3_GET_PWM8DUTY (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t パルス幅
 +-使用例
 + // PWM8のパルス幅を取得します。
 + pulse = UD3_GET_PWM8DUTY ();
 +
 +***UD3_GET_PWM9DUTY [#x328a466]
 +PWM9のキャプチャしたパルス幅を取得する。~
 +GPIO9を[[UD3_CFG_GPIO9>#j90d8ac4]]でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + uint16_t UD3_GET_PWM9DUTY (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t パルス幅
 +-使用例
 + // PWM9のパルス幅を取得します。
 + pulse = UD3_GET_PWM9DUTY ();
 +
 +***UD3_GET_PWM10DUTY [#kf3fddcb]
 +PWM10のキャプチャしたパルス幅を取得する。~
 +GPIO10を[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + uint16_t UD3_GET_PWM10DUTY (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t パルス幅
 +-使用例
 + // PWM10のパルス幅を取得します。
 + pulse = UD3_GET_PWM10DUTY ();
 +
 +***UD3_MEASURE_STICKPOS [#w3c149c4]
 +ラジコン用プロポのスティック位置に不感帯を設けるための調整を行う。調整値は不揮発メモリに保存され、以後[[UD3_GET_RCPOS>#q1f997f7]]や[[UD3_RC_MOTOR>#rf1dfc65]]で内部的に使用される。~
 +不感帯はスティックの中立及び最大・最少位置にそれぞれ設けられ、中立位置と最大・最少位置を正確に計測した後に反映される。スティックの位置と不感帯、デューティーとして指令される値の相関は以下の図に示す。~
 +#ref(ud3_stick2duty.png,100%)
 +予め[[UD3_CFG_GPIO8>#u201f4af]],[[UD3_CFG_GP​IO9>#j90d8ac4]],[[UD3_CFG_GPIO10>#d2dd2f​39]]でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 +~本APIが実行されると以下の手順で調整操作を行う。
 ++UD3_MEASURE_STICKPOSがコールされるとピロリと音が鳴り、計測モードに遷移した事を知らせる。
 ++プロポのスティックから手を離した状態(中立位置)にしたらPB1を押して放す。するとLED1が点滅し始め中立位置の計測が開始される。
 ++中立位置を維持した状態で数秒が経過したら再度PB1を押してから放すと中立位置の計測が終了しLED1が消灯する。~
 ++再度PB1を押して放すとLED1が点滅を始め、ブザーが鳴り始める。この間に諸々が正常であればプロポのスティックをそれぞれ上下ないし左右の端まで何度か移動させていると、ランダムだったブザーの音程がスティックの角度に連動して変化するようになる。~
 ++スティックの角度に応じてなめらかに音階が変化するようになったらPB1を押して放すと上下限の計測が終了しLED1が消灯する。~
 ++その後「明るいメロディー」が鳴ったら調整が成功した合図で、調整値が不揮発メモリに保存される。「暗いメロディー」が鳴ると失敗となるが、いずれの状態であっても調整処理は終了する。~
 +なお、成否判定はGPIO8とGPIO9の入力信号のみを対象としている。
 +
 + bool UD3_MEASURE_STICKPOS (uint8_t pos1, uint8_t pos2);
 +-パラメータ
 +--uint8_t '''pos1'''
 +~スティック中立時の不感帯幅を0~50[%]で設定。
 +--uint8_t '''pos2'''
 +~スティック両端時の不感帯幅を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_GET_RCPOS [#q1f997f7]
 +指定したチャネルのラジコンプロポのスティックの値を取得する。~
 +この取得した値は、[[UD3_MEASURE_STICKPOS>#w3c149c4]]で調整された値となる。~
 +予め[[UD3_CFG_GPIO8>#u201f4af]],[[UD3_CFG_GP​IO9>#j90d8ac4]],[[UD3_CFG_GPIO10>#d2dd2f​39]]でGPIO_PWM_CAP_PULLUP_OFFないしGPIO_PWM_CAP_PULLUP_ONに設定する必要がある。
 + int16_t UD3_GET_RCPOS (uint8_t ch);
 +-パラメータ
 +--uint8_t '''ch'''
 +~チャネルを指定する。
 +~0: PWM8(GPIO8)~
 +1: PWM9(GPIO9)~
 +2: PWM10(GPIO10)
 +-戻り値
 +~int16_t ラジコンプロポのスティックの位置
 +-使用例
 + // PWM8に接続されているラジコンプロポのスティックの位置を取得します。
 + pos = UD3_GET_RCPOS (0);
 +
 +***UD3_RC_MOTOR [#rf1dfc65]
 +UD3_MEASURE_STICKPOSにて調整されたラジコン用プロポの受信器から出力されるパルスを元にM1とM2の駆動パワーに割り当てる。
 + void UD3_RC_MOTOR (uint8_t rc1, uint8_t rc2);
 +-パラメータ
 +--uint8_t '''rc1'''
 +~M1に割り当てるチャネル
 +~0: PWM8(GPIO8)~
 +1: PWM9(GPIO9)~
 +2: PWM10(GPIO10)
 +--uint8_t '''rc2'''
 +~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);
 +   }
 +  }
 +
 +**SIXAXIS [#tc0f292d]
 +BluetoothのモードがSIXAXISで、SIXAXISないしDUALSHOCK3がワイヤレス接続された時に取得出来る情報です。デジタルボタンの押力の取得及び振動モータの運転は出来ません。
 +なお、予め[[UD3_ASSIGN_BT_TO_SIXAXIS>#h5d1973e]]にてBluetoothにSIXAXIS通信機能を割り当てておく必要は特にありませんが、ブートローダでBluetoothをSIXAXISモードに設定した場合はそれ以外の機能への割り当てはできません。
 +
 +***UD3_GET_PSDIGITAL1 [#na9afa77]
 +SIXAXISのグループ1に属するボタン情報を取得する。
 + uint8_t UD3_GET_PSDIGITAL1(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t グループ1のボタン情報 押下状態で該当ビットが1
 +|=BIT| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
 +|=ボタン| ← | ↓ | → | ↑ | START | ANALOG R&br;PUSH | ANALOG L&br;PUSH | SELECT |
 +-使用例
 + uint8_t btg1 = UD3_GET_PSDIGITAL1 ();
 +
 +***UD3_GET_PSDIGITAL2 [#j87bd158]
 +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 ();
 +
 +***UD3_GET_PSDIGITAL3 [#uee03cdb]
 +SIXAXISのグループ3に属するボタン情報を取得する。
 + uint8_t UD3_GET_PSDIGITAL3(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t グループ3のボタン情報 押下状態で該当ビットが1
 +|=BIT| bit7..1 | bit0 |
 +|=ボタン| - |  PS |
 +-使用例
 + uint8_t btg3 = UD3_GET_PSDIGITAL3 ();
 +
 +***UD3_GET_PSLX [#i62abd1b]
 +SIXAXISの左側アナログスティックのX軸情報を取得する。
 + uint8_t UD3_GET_PSLX(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t 左側アナログスティックの位置が左端で0、右端で255を返す。
 +-使用例
 + uint8_t lx = UD3_GET_PSLX ();
 +
 +***UD3_GET_PSLY [#xf86f9e4]
 +SIXAXISの左側アナログスティックのY軸情報を取得する。
 + uint8_t UD3_GET_PSLY(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t 左側アナログスティックの位置が上端で0、下端で255を返す。
 +-使用例
 + uint8_t ly = UD3_GET_PSLY ();
 +
 +***UD3_GET_PSRX [#f16c0c11]
 +SIXAXISの右側アナログスティックのX軸情報を取得する。
 + uint8_t UD3_GET_PSRX(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t 右側アナログスティックの位置が左端で0、右端で255を返す。
 +-使用例
 + uint8_t rx = UD3_GET_PSRX ();
 +
 +***UD3_GET_PSRY [#f51902ac]
 +SIXAXISの右側アナログスティックのY軸情報を取得する。
 + uint8_t UD3_GET_PSRY(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t 右側アナログスティックの位置が上端で0、下端で255を返す。
 +-使用例
 + uint8_t ry = UD3_GET_PSRY ();
 +
 +***UD3_GET_PSL2 [#yda6cc23]
 +SIXAXISのL2の情報を取得する。
 + uint8_t UD3_GET_PSL2(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t L2が解放で0、最大押下で255を返す。
 +-使用例
 + uint8_t l2 = UD3_GET_PSL2 ();
 +
 +***UD3_GET_PSR2 [#f71afcd6]
 +SIXAXISのR2の情報を取得する。
 + uint8_t UD3_GET_PSR2(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint8_t R2が解放で0、最大押下で255を返す。
 +-使用例
 + uint8_t r2 = UD3_GET_PSR2 ();
 +
 +***UD3_GET_PSGX [#hccd1b38]
 +SIXAXISのX軸加速度を取得する。
 + uint16_t UD3_GET_PSGX(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t 0~1023の範囲でX軸の加速度を返す。
 +-使用例
 + uint16_t gx = UD3_GET_PSGX ();
 +
 +***UD3_GET_PSGY [#rd271105]
 +SIXAXISのY軸加速度を取得する。
 + uint16_t UD3_GET_PSGY(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t 0~1023の範囲でY軸の加速度を返す。
 +-使用例
 + uint16_t gy = UD3_GET_PSGY ();
 +
 +***UD3_GET_PSGZ [#ibd2e0bc]
 +SIXAXISのZ軸加速度を取得する。
 + uint16_t UD3_GET_PSGZ(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t 0~1023の範囲でZ軸の加速度を返す。
 +-使用例
 + uint16_t gz = UD3_GET_PSGZ ();
 +
 +***UD3_GET_PSGYRO [#cd05b422]
 +SIXAXISの角加速度を取得する。
 + uint16_t UD3_GET_PSGYRO(void);
 +-パラメータ
 +~なし
 +-戻り値
 +~uint16_t 0~1023の範囲で角加速度を返す。
 +-使用例
 + uint16_t gyro = UD3_GET_PSGYRO ();
 +
 +**コンソール [#d0d4a9b4]
 +USB・Bluetooth・RS485の各I/Fは、「コンソール」「Dynamixelホスト」「Dynamixelクライアント」「SIXAXIS通信」のいずれかの機能を割り当てて使用する事ができます。USBとRS485は初期状態においてどの機能も割り当てられていないため、それぞれの機能を使用したAPIも機能しない状態になっています。Bluetoothについては、ブートローダでSIXAXISモードの設定がなされた場合のみ、「SIXAXIS通信」機能が自動的に活性化します。~
 +なお、RS485に「コンソール」機能を割り当てた場合はボーレートが1M[bps]固定され、「Dynamixelホスト」機能はRS485のみ、「SIXAXIS通信」機能はBluetoothにのみ設定できます。
 +
 +***UD3_ASSIGN_USB_TO_CONSOLE (new)[#w433da59]
 +USBをコンソール機能に割り当てる。以前のUSBへの割り当ては解除される。
 + bool UD3_ASSIGN_USB_TO_CONSOLE (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +***UD3_ASSIGN_USB_TO_DXCLIENT (new) [#i8f4c502]
 +USBをDynamixelのクライアント機能に割り当てる。以前のUSBへの割り当ては解除される。
 + bool UD3_ASSIGN_USB_TO_DXCLIENT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_DEASSIGN_USB (new) [#m33f02d9]
 +以前のUSBへの割り当てを解除する。
 + bool UD3_DEASSIGN_USB (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_ASSIGN_RS485_TO_CONSOLE (new) [#q8dded9d]
 +RS485をコンソール機能に割り当てる。以前のRS485への割り当ては解除される。
 + bool UD3_ASSIGN_RS485_TO_CONSOLE (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~bool 割り当てが成功するとtrue
 +***UD3_ASSIGN_RS485_TO_DXCLIENT (new) [#z3a825e0]
 +RS485をDynamixelのクライアント機能に割り当てる。以前のRS485への割り当ては解除される。
 + bool UD3_ASSIGN_RS485_TO_DXCLIENT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_ASSIGN_RS485_TO_DXHOST (new) [#a4298bb2]
 +RS485をDynamixelのホスト機能に割り当てる。以前のRS485への割り当ては解除される。
 + bool UD3_ASSIGN_RS485_TO_DXHOST (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~bool 割り当てが成功するとtrue
 +***UD3_DEASSIGN_RS485 (new) [#pc7926c0]
 +以前のRS485への割り当てを解除する。
 + bool UD3_DEASSIGN_RS485 (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_ASSIGN_BT_TO_CONSOLE (new) [#p3b1f9b6]
 +Bluetoothをコンソール機能に割り当てる。以前のBluetoothへの割り当ては解除される。
 + bool UD3_ASSIGN_BT_TO_CONSOLE (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_ASSIGN_BT_TO_DXCLIENT (new) [#a92c0818]
 +BluetoothをDynamixelのクライアント機能に割り当てる。以前のBluetoothへの割り当ては解除される。
 + bool UD3_ASSIGN_BT_TO_DXCLIENT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_ASSIGN_BT_TO_SIXAXIS (new) [#h5d1973e]
 +BluetoothをSIXAXISないしDUALSHOCK3との通信機能に割り当てる。以前のBluetoothへの割り当ては解除される。
 + bool UD3_ASSIGN_BT_TO_SIXAXIS (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_DEASSIGN_BT (new) [#da99d076]
 +以前のBluetoothへの割り当てを解除する。
 + bool UD3_DEASSIGN_BT (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~true: 割り当て成功~
 +false: 割り当て失敗
 +***UD3_PUTC [#w4f6854d]
 +コンソールに1文字送信する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + void UD3_PUTC (char c);
 +-パラメータ
 +--char '''c'''
 +~送信文字(1バイト)を指定
 +-戻り値
 +~なし
 +
 +***UD3_GETC [#ibd505dc]
 +コンソールから1文字取得する。受信バッファが空の場合は最低1バイト受信するまで返らない。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + char UD3_GETC (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~char 受信文字
 +
 +***UD3_GETS [#lc54c38f]
 +コンソールからエンター(CRかLF)ないしエスケープ(ESC)コードを受信するまで文字列を取得する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + int UD3_GETS (char *s, int len);
 +-パラメータ
 +--char *s
 +~受信文字列を保存するバッファのポインタを指定
 +--int len
 +~受信文字列の最大バッファサイズを指定
 +-戻り値
 +~int 受信文字数
 +
 +***UD3_PUTS [#qc95c51a]
 +コンソールへ文字列を送信する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + void UD3_PUTS (char *s);
 +-パラメータ
 +--char '''*s'''
 +~送信文字列(NULLターミネーション)のポインタを指定
 +-戻り値
 +~なし
 +
 +***UD3_PUTSB [#e16d8efa]
 +コンソールへ指定バイト数のデータを送信する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + void UD3_PUTSB (char *s, int len);
 +-パラメータ
 +--char '''*s'''
 +~送信データのポインタを指定
 +--int '''len'''
 +~送信バイト数を指定
 +-戻り値
 +~なし
 +
 +***UD3_RXBUFF [#w6cb53ad]
 +コンソールから受信されたバイト数を返す。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + int UD3_RXBUFF (void);
 +-パラメータ
 +~なし
 +-戻り値
 +~int 受信バイト数。
 +
 +***UD3_PRINTF [#xd168578]
 +コンソールへ書式化文字列を送信する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + int UD3_PRINTF (const char *format, ...) {
 +-パラメータ
 +--const char '''*format'''
 +~書式文字列
 +--...
 +~可変個引数
 +-戻り値
 +~int 送信バイト数。
 +
 +***UD3_SCANF [#l1b83762]
 +コンソールから書式化文字列を受信する。~
 +予めUD3_ASSIGN_xxx_TO_CONSOLEにて使用するI/Fにコンソールを割り当てておく必要がある。
 + int UD3_SCANF (const char *type, void *val);
 +-パラメータ
 +--const char '''*type'''
 +~書式文字列
 +--void '''*val'''
 +~格納先変数
 +-戻り値
 +~int 入力データの個数。
 +
 +**Dynamixelホスト [#rd133a45]
 +RS485を使用してUD3をホストとした他のDynamixelスレーブ機器との通信を行います。~
 +なお、UD3のRS485はデフォルトで機能が割り当てられていないため、予め[[UD3_ASSIGN_RS485_TO_DXHOST>#a4298bb2]]​にてRS485にDynamixelホスト機能を割り当てておく必要があります。
 +
 +***DX_ChangeBaudrate [#z585203f]
 +ボーレートを変更する。ここで設定されるボーレートがネットワーク共通の通信速度となり、以後このボーレートを基準にして動作する。~
 +なお、ライブラリ内では静的に1M[bps]で初期化されているため、そのままで支障がなければ特に変更の必要はない。
 + bool DX_ChangeBaudrate (uint32_t baud);
 +-パラメータ
 +--uint32_t '''baud'''
 +~ネットワークの装置とFDIII-HC間の通信速度[bps]
 +-戻り値
 +~true: 成功~
 +false: 失敗 (誤差率が2%を超える、もしくは設定可能範囲外)
 +-使用例
 +#html{{
 +<pre class="brush: c;">
 +#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);
 +  }
 +}
 +</pre>
 +}}
 +
 +***DX_CalcTimeout [#ued093cb]
 +ボーレートとステータスパケットのパラメータサイズを元にタイムアウト時間を算定する。
 + uint32_t DX_CalcTimeout (int num);
 +-パラメータ
 +--int '''num'''
 +~バイト数
 +-戻り値
 +~タイムアウト時間[ms]
 +
 +***DX_Ping [#bf72833f]
 +指定されたIDを持つデバイスを対象に、PINGを発行する。IDがわかっている場合に使用する。
 + bool DX_Ping (uint8_t id, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 指定IDのデバイスが見つかった~
 +false: 指定IDのデバイスがタイムアウト時間を超過しても見つからない
 +
 +***DX_Ping2 [#nf87452a]
 +不特定のIDを持つデバイスを対象に、PINGを発行する(ブロードキャストIDを使用してPING)。IDがわからないデバイスに対して使用するため、ネットワーク上に接続されるデバイスは1台のみとする事。
 + bool DX_Ping2 (uint8_t *id, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''*id'''
 +~検出されたデバイスのIDを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~検出タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 何らかのデバイスが応答しIDを取得できた~
 +false: デバイスがタイムアウト時間を超過しても見つからない
 +
 +***DX_ReadByteData [#f32225e1]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1バイトのデータを読み出す。
 + bool DX_ReadByteData (uint8_t id, uint8_t adr, uint8_t *result, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_ReadWordData [#m5230d39]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムから1ワード(2バイト)のデータを読み出す。
 + bool DX_ReadWordData (uint8_t id, uint8_t adr, uint16_t *result, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint16_t *'''result'''
 +~読み出したデータを保存するuint16_t型の変数のアドレス
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_ReadBlockData [#d0ba2a9e]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを読み出す。
 + bool DX_ReadBlockData (uint8_t id, uint8_t adr, uint8_t *result, uint8_t len, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~253: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t *'''result'''
 +~読み出したデータを保存するuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~読み出すバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteByteData [#nd22b7cf]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1バイトのデータを書き込む。
 + bool DX_WriteByteData (uint8_t id, uint8_t adr, uint8_t dat, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint8_t '''dat'''
 +~0~255: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteWordData [#f8044400]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムに指定された1ワード(2バイト)のデータを書き込む。
 + bool DX_WriteWordData (uint8_t id, uint8_t adr, uint16_t dat, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--uint16_t '''dat'''
 +~0~65535: 送信データ
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteBlockData [#f5423302]
 +指定されたIDを持つデバイスを対象に、指定アドレスのアイテムを起点に指定されたサイズの連続したデータを書き込む。
 + bool DX_WriteBlockData (uint8_t id, uint8_t adr, const uint8_t *dat, uint8_t len, uint32_t timeout, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''id'''
 +~0~254: 対象デバイスのID
 +--uint8_t '''adr'''
 +~0~254: 対象アドレス
 +--const uint8_t *'''dat'''
 +~書き込むデータを保存したuint8_t型の配列のアドレス
 +--uint8_t '''len'''
 +~datのバイト数
 +--uint32_t '''timeout'''
 +~0~500: 受信タイムアウト時間[ms]
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗
 +
 +***DX_WriteSyncData (new) [#uebb1423]
 +SYNCインストラクションを使用して複数のデバイスの同一アイテムに対して各々異なる値を一括送信する。
 + bool DX_WriteSyncData (uint8_t size, const uint8_t *dat, uint16_t *errcode);
 +-パラメータ
 +--uint8_t '''size'''
 +~datのバイト数
 +--const uint8_t *'''dat'''
 +~SYNCインストラクションのパラメータ部分を記述したuint8_t型の配列のアドレス
 +--uint16_t  '''*errcode'''
 +~デバイスおよびライブラリのエラーコードを取得するuint16_t型の変数のアドレス、もしくはNULL
 +-戻り値
 +~true: 成功~
 +false: 失敗


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