ページへ戻る

− Links

 印刷 

BTA022​/BTA023 ユニバーサルドライバ3 のバックアップソース(No.1) :: Besttechnology

knowledge:BTA022/BTA023 ユニバーサルドライバ3 のバックアップソース(No.1)

  Next »[4]
TITLE:ユニバーサルドライバ3マニュアル
#norelated
#contents
**概要 [#x0a22961]
本製品は2個のDCモータ用ブリッジ回路を搭載したインテリジェンスモータコントローラです。~
モータドライバの他に11本のデジタル入出端子を備え、そのうち8本はアナログ入力を兼用します。また、リアルタイムカーネルとしてToppersを採用し、マルチタスクによる複数の処理を同時にこなすことが出来ます。~

|CENTER:BGCOLOR(red):||c
|  :idea:|本製品は使用方法によっては人や財産を失う恐れがある可能性があります。本ドキュメントを熟読し、危険性の理解と運用方法を順守してください。|

**仕様 [#r881cac5]
***同梱内容 [#m79dd66b]
|型式 |数量 |備考 |
|ユニバーサルドライバ3本体 |1 |E093B |
|USBケーブル |1 |150cm |
|コネクタキット |1 |Dynamixel I/F(MPU・センサ電源)用 ([[50-37-5043>http://www.molex.com/molex/products/datasheet.jsp?part=active/0050375043_CRIMP_HOUSINGS.xml&channel=Products&Lang=ja-jp]]x1, [[08-70-1040>http://www.molex.com/molex/products/datasheet.jsp?part=active/0008701040_CRIMP_TERMINALS.xml&channel=Products&Lang=ja-jp]]x5)&br;モータ電源用 ([[No.05023>http://kopropo.co.jp/wp/?cat=40&paged=5]]x1)&br;モータ用 ([[No.05001>http://kopropo.co.jp/wp/?cat=40&paged=5]]x2)  |

***基本仕様 [#pb0bf34c]
|品番 |BTA022/BTA023 |
|リビジョン |E093B |
|動作温度範囲 |0~+50℃ 結露無きこと |
|寸法 |外形:53x78mm (±1mm)&br;取り付け穴:45.7x66.7mm 4-φ2.2 |
|厚み |突起物を含み約25mm |
|重量 |70g以下 |
|MPU |AT91SAM7S256もしくはAT91SAM7S512 (48MHz ARM7TDMI) |
|MPUU内蔵メモリ |フラッシュROM:256kもしくは512kbyte(ブートローダ領域を含む)&br;RAM:64kbyte |
|モータ電源  |入力: DC5~DC24V (絶対最大定格電圧:75V)&br;出力: UD3定格20A (FET 定格電流:240A パルス電流:960A)&br;許容損失電力(25℃): 300W |
|MPU及びセンサ電源 |入力: DC8~24V (絶対最大定格電圧:DC35V)&br;出力: DC5V 7A(最大) |
|I/F |入力用プッシュスイッチx2&br;入力用4bitロータリーDIPスイッチx1&br;リセット用プッシュスイッチx1 |
|モータドライバ |2ch Hブリッジ&br;4象限の制御領域&br;1~200kHz(1kHz単位で任意)のPWMキャリア周波数 |
|ワイヤレス |BTA023のみBluetoothモジュール(ZEAL-C01)装備 |
|コネクタ |ホストPC間: USB (miniB)x1&br;GPIO: 2.5mmピッチ3ピンオスヘッダ(信号・5V・GND)x11&br;モータ用電源:近藤科学 ストロングゴールドコネクターx1&br;モータ用: 近藤科学 レーシングコネクターx2&br;Dynamixel I/F (MPU&センサ電源用):molex 22-03-5045x1 |
|GPIO機能 |GPIOは全部で11ch装備し以下の機能を割当可能(排他含)&br;汎用入力:11ch(プルアップON/OFF機能あり)&br;汎用出力:11ch(オープンドレイン出力機能あり)&br;アナログ入力:8ch(分解能10bit)&br;パルス幅計測:3ch(分解能16bit 基準クロックは47k~24MHzの中で5段階)&br;PWM出力:3ch(分解能16bit 基準クロックは47k~24MHzの中で5段階) |
|環境配慮 |Rohs未対応 |

***内部簡略ブロック [#y6e0b9c7]
#ref(ud3_block.png,100%)

***外観 [#uec5ec4d]
写真はBTA023です。BTA022にはBluetoothモジュールが装備されません。
| TOP | BOTTOM |
| #ref(E093B_TOP.png,40%) | #ref(E093B_BOTTOM.png,40%) |
| SIDE |
| #ref(E093B_SIDE.png,40%) |

***外形・端子配置 [#lc74b433]
#ref(ud3_layout.png,100%)
RIGHT:(単位:mm)

以下特に断りのない限り本図のレイアウトを正として端子番号やそれらの方向、位置等を示す。

****CN1 [#c95ac81b]
|CENTER:BGCOLOR(red):||c
|  :idea:|電源の逆接続は電源回路の即時破壊・全損扱いとなる。&br;本端子に電源が印加され、CN3(モータ用電源)の電源供給が断たれている状態では、モータのイネーブル信号を発行してはならない。イネーブルするとゲートドライバに過大な負荷がかかり破損する。|

|基板側ヘッダー |[[22-03-5045>http://www.molex.com/molex/products/datasheet.jsp?part=active/0022035045_PCB_HEADERS.xml&channel=Products&Lang=ja-jp]] |
|ハウジング |[[50-37-5043>http://www.molex.com/molex/products/datasheet.jsp?part=active/0050375043_CRIMP_HOUSINGS.xml&channel=Products&Lang=ja-jp]] |
|ターミナル |[[08-70-1040>http://www.molex.com/molex/products/datasheet.jsp?part=active/0008701040_CRIMP_TERMINALS.xml&channel=Products&Lang=ja-jp]] |

-Dynamixel I/Fに準拠したコネクタで、RS485によるシリアル通信及び5Vロジック・3.3Vロジック・12Vゲートドライバの一次電源を兼ねる
-[[図>#lc74b433]]右より順に ①:DM(RS485), ②:DP(RS485), ③:+(センサ&MPU電源), ④:-(GND) の端子割り当て
-RS485による通信を行わない場合は①②ピンは未接続にしておく
-入力絶対最大定格:DC35V
-入力定格電圧:DC8~24V(リプルなき事)
-④ピン(GND)はボード内全て(ロジックおよびモータ電源)において共通
-本端子から供給される電源によりボード内で使用されるDC5V電源とDC3.3Vが作られ、更にJ1~J12端子からの5V出力がなされる
-CN3とは別の電源から供給する事
-J1~J12及びボード内で使用されるDC5V電源の総電流が7Aを超えてはならない。

****CN2 [#q01a8c34]
-USB Mini-B
-PC(ホスト)と本ボード上のMPU(デバイス)間のUSBによる通信用
-USBバスパワーによるロジック電源供給用(CN1からの電源が優先)
-USBバスパワーからはJ1~J12及びゲートドライバへの電源供給は行われない

****CN3 [#c0d4bab9]
|CENTER:BGCOLOR(red):||c
|  :idea:|電源の逆接続はブリッジ回路の即時破壊・全損扱いとなる。&br;CN1に電源が印加され、本端子の電源供給が断たれている状態では、モータのイネーブルを発行してはならない。イネーブルするとゲートドライバに過大な負荷がかかり破損する。|

|ストロングゴールドコネクター  オス |[[No.05022>http://kopropo.co.jp/wp/?cat=40&paged=5]] |
|ストロングゴールドコネクター  メス |[[No.05023>http://kopropo.co.jp/wp/?cat=40&paged=5]] |

-Hブリッジ(モータ)電源供給用
-[[図>#lc74b433]]上より順に ①:+(モータ電源), ②:-(GND) の端子割り当て
-入力定格電圧:DC5~24V (DC16V以下を推奨)
-入力絶対最大定格:DCV75V
-②ピン(GND)はボード内全て(ロジックおよびモータ電源)において共通
-本端子から供給される電源がHブリッジ回路に供給されM1ないしM2端子を介して負荷へと供給される
-CN1とは別の電源から供給する事

****M1 [#p68e0f67]
|レーシングコネクター メス |[[No.05002>http://kopropo.co.jp/wp/?cat=40&paged=5]] |
|レーシングコネクター オス |[[No.05001>http://kopropo.co.jp/wp/?cat=40&paged=5]] |
-負荷接続用端子
-[[図>#lc74b433]]左より順に ①:M1+, ②:M1+, ③:M1-, ④:M1-
-①と②端子(M1+)および③と④端子(M1-)は各々ボード内で接続されている
-DCモータ等を接続した場合の回転方向はモータに依存するが、ソフト的にプラスのデューティを指定するとM1+側からプラスの出力が得られる

****M2 [#s05e2d77]
|レーシングコネクター メス |[[No.05002>http://kopropo.co.jp/wp/?cat=40&paged=5]] |
|レーシングコネクター オス |[[No.05001>http://kopropo.co.jp/wp/?cat=40&paged=5]] |
-負荷接続用端子
-[[図>#lc74b433]]左より順に ①:M2+, ②:M2+, ③:M2-, ④:M2-
-①と②端子(M2+)および③と④端子(M2-)は各々ボード内で接続されている
-DCモータ等を接続した場合の回転方向はモータに依存するが、ソフト的にプラスのデューティを指定するとM2+側からプラスの出力が得られる

****PB1(プッシュボタン) [#j5e009fe]
-ブートローダおよびアプリケーションにて使用

****PB2(プッシュボタン) [#y59d09cb]
-ブートローダおよびアプリケーションにて使用

****PB3(プッシュボタン) [#u237602b]
-押下でMPUの強制リセット

****DIP1(ロータリーディップスイッチ) [#r4a636d8]
-アプリケーションにて使用
-4bit(16段階)

****LED1 [#g2b739d3]
-橙色
-ブートローダ内でコンソール入力があるとフラッシュ
-アプリケーションにてプログラマブルに点灯・消灯

****LED2 [#uca490ef]
-赤色
-CN1から電源を供給した後、ボード内で5V電源が供給開始されると点灯
-CN2(USBバスパワー)の接続でもリーク電流で点灯する場合がある

****LED3 [#c8b9f642]
-緑色
-Bluetoothによるワイヤレス接続が確立すると点灯
-BTA022の場合は常時消灯

****LED4 [#f3885109]
-赤色
-CN3から電源を供給すると点灯
-CN1(MPU&センサ電源)の接続でもリーク電流で点灯する場合がある
-電源供給を断っているにもかかわらずLEDが点灯している場合は、コンデンサに蓄積した電荷が残っている状態である。完全に消灯していない状態でCN3のリードを導電性の物で短絡するとアークが飛び危険である。

****J1~J8 [#y6c5f6b8]
-[[図>#lc74b433]]左より順に ①:SIG, ②:5V出力, ③:GND の端子割り当て
-J1~J8の各①ピン(SIG端子)がGPIO0~GPIO7に相当する
-①ピン(SIG端子)は5V入力トレラント対応~
IEC61000-4-2 level4のESD保護~
電流制限用に47Ωの直列抵抗搭載~
出力時の最大電圧は3.3V
-②ピン(5V出力)はJ0~J4とJ5~J8の2グループで共通で、各々4Aトリップのリセッタブルヒューズを装備
-③ピン(GND)はボード内全て(ロジックおよびモータ電源)において共通
-プログラマブルな内蔵プルアップ抵抗(約100kΩ)を搭載。

****J9~J11 [#mcb1b14c]
-[[図>#lc74b433]]左より順に ①:SIG, ②:5V出力, ③:GND の端子割り当て
-J9~J11の各①ピン(SIG端子)がGPIO8~GPIO10に相当する
-①ピン(SIG端子)は5V入力トレラント対応~
IEC61000-4-2 level4のESD保護~
電流制限用に47Ωの直列抵抗搭載~
出力時の最大電圧は3.3V
-②ピン(5V出力)はJ9~J12共通で4Aトリップのリセッタブルヒューズを装備
-③ピン(GND)はボード内全て(ロジックおよびモータ電源)において共通
-プログラマブルな内蔵プルアップ抵抗(約100kΩ)を搭載。

****J12 [#u979e189]
-出荷時にピンヘッダ等は未実装
-[[図>#lc74b433]]左より順に ①:SIG, ②:5V出力, ③:GND の端子割り当て
-①ピン(SIG端子)と③ピン(GND)を短絡すると5V用DCDCコンバータがシャットダウン(ボード内の5V・3.3V・12Vの電源がOFFになる)し消費電流が0.3mA以下に減少する~
なおUSB(CN2)からのバスパワーは本端子の影響を受けないため、シャットダウン中でもMPUのみ活性化する
-シャットダウンさせない場合は①ピン(SIG端子)をオープンにしておく事

****JP1 [#sde6761c]
-基板BOTTOM側 CN1近傍に配置された半田ジャンパで、ショートする事でRS485 I/Fのターミネータが活性化する
-出荷時にショート(ターミネータON)

**各機能の詳細 [#db9530a6]
***電源の印加順序 [#l7a7e35f]
CN1とCN2の電源の接続時には誤動作や破損を防ぐため、出来る限り以下の順序に従ってください。なお、CN2から供給されるPCからのUSBバスパワーは本手順に影響しません。
~&color(red){電源ON};
+CN1にMPU及びセンサ用電源を接続しLED2の点灯を確認(この時点でモータのイネーブルが発行されてはいけない)
+CN3にモータ用電源を接続(これ以後にモータのイネーブルを発行する事)

~&color(red){電源OFF};
+負荷を駆動していない状態でCN3からモータ用電源を切断(この時点でモータのイネーブル信号はディスエーブルにしておく)
+CN1からMPU用電源を切断

***MPU電源 [#c08ff775]
MPU電源の入力方法は3つあり、各々目的が異なります。
-CN1~
外部の電源装置からCN1に電源を接続すると、モータを除く本ボード上の全ての電源(3.3V・5V・12V)回路が活性化し、LED2が点灯します。この状態であればJ1~J12の②ピンから5Vが出力されます。~
ユーザプログラムが書き込まれていれば自動的に実行が開始されます。~
J12に入力される信号により3.3V・5V・12V回路全ての電源供給のON/OFF(省電力モード)が可能です。~
-CN2(PCからのUSBバスパワー)~
電源が入ったPCとUSBケーブルで接続すると同時に本ボード上の3.3V回路(MPU・Bluetooth)と一部の5V回路(RS485 I/F)に電源が供給され、J1~J12への5Vの電源は行われず、ゲートドライバは停止し、LED2は点灯しません。~
ユーザプログラムが書き込まれていれば自動的に実行が開始されます。~
この状態ではJ1~J12の②ピンから5V電源が供給されない都合、GPIOの信号の入出力が正常に行えません。
J12に入力される信号とは連動しません。~
-CN1とCN2両方~
いずれかから入力される電圧の高い方を優先する回路となっているため、両社を接続したとしても大抵の場合はCN1からの電源が優先されることになります。~
ユーザプログラムが書き込まれていれば自動的に実行が開始されます。~
J12に入力される信号がOFF(省電力モード)の場合は3.3V回路(MPU・Bluetooth)と一部の5V回路(RS485 I/F)のみが機能し、ONの場合はモータを除く本ボード上の全ての電源(3.3V・5V・12V)回路が活性化します。

***USB [#f213387d]
PCのUSBバスパワーでボード内の電源供給を行う他に、PCとMPUとの有線による通信手段を提供します。~
PCとUSBケーブルで接続し、予め書き込まれたブートローダのコマンドモードが起動すると、PCからは増設シリアルポートとして見えます。

***ブートローダ [#ueb4c356]
本装置を操作するための専用プログラムが予め搭載されており、USB(ボーレート:任意)・Bluetooth(ボーレート:任意)・Dynamixel I/F(ボーレート:1Mbps)のいずれかを経由してユーザプログラムの転送や諸設定を行う事が出来ます。~
SIMPLE TERMで該当のポートを開き、ブートローダのコマンドモードに入ると以下のメッセージ及びプロンプトが表示されます。
 --< UDIII Ver.2.1 by BestTechnology >--
 >
この状態で使用出来るコマンドは'?'を入力すると表示されます。
 >?
 --< UDIII Ver.2.1 by BestTechnology >--
  [w]:UPLOAD [g]:BOOT [i]:FLASH INFO [e]:ERASE [b]:BLUETOOTH
 >
-w (UPLOAD)~
UD3用にコンパイルされたユーザプログラムをフラッシュROMに転送するモードです。ダウンロードして実行出来るファイルは、GCC Developer LiteにてUD3向けにコンパイルされたバイナリファイルのみです。
-g (BOOT)~
フラッシュROMに転送されたユーザプログラムへ実行を遷移します。ユーザプログラムエリアが消去されていれば実行されません。
-i (FLASH INFO)~
ユーザプログラム用フラッシュROMの状態を表示します。
-e (ERASE)~
ブートローダ本体を除くユーザプログラムエリアに書き込まれたデータを完全消去します。消去したデータは復活させる事が出来ません。
-b (BLUETOOTH)~
Bluetoothの設定モードに遷移します。Bluetooth経由でブートローダのコンソールにアクセスしている場合は設定出来ません。USBケーブルでPCと接続された状態でのみBluetoothの設定変更が出来ます。

なお、ユーザプログラムが書き込まれている場合は、電源投入直後にユーザプログラムが実行されるため、ブートローダのコマンドモードにはなりません。ユーザプログラムの転送や消去といった操作を行う場合は、以下の手順に従ってください。
+UD3にUSBないし外部電源を接続し電源を印加する
+PB1とPB2を押しっぱなしにする
+その状態のままPB3を1秒程度押してから放す
+ブートローダのコマンドモードに入ると「ピロッ」という起動音とLED1が一度フラッシュするので、押していたPB1とPB2を放す。
+SIMPLE TERMで該当のCOMポートを開けば、コマンドモードの操作が可能になる。

***Bluetooth [#vb8c51d8]
BTA023のみBluetoothによるコンソールやコントローラの無線化に対応しています。搭載されるBluetoothモジュールであるZEAL-C01の出荷時の設定は以下の通りです。~
-サポートプロファイル:SPPのみ
-DTE速度:460.8kbps (UD3搭載のMPUとZEAL間のUSARTの速度)
-PINコード:0000 (文字列の'0000')
-認証:あり (SIXAXISモード以外時に適用)
-暗号化:なし
-デバイス検出への応答:あり
-フロー制御:ハード的に無効
-機器名称:UDIII-xxxxxxx (xxxはシリアル番号)
-パフォーマンスレベル:9 (可能な限り高速動作,省電力に貢献しない)
-接続モード:自動待ち受け

このうち、ユーザ自ら変更出来るのは接続モードとPINコードで、ブートローダから選択及び変更が出来ます。ブートローダからBluetoothの設定を行う場合は、コマンドモードのプロンプトが'>'の状態で'b'を入力します。Bluetoothの設定モードに入ると、プロンプトは'BT'に変わります。この状態で使用出来るコマンドは'?'を入力すると表示されます。なお、Bluetooth経由でブートローダのコンソールを操作している場合はBluetoothの設定が行えませんので、その場合は他のI/Fを使用してください。

 --< UDIII Ver.2.1 by BestTechnology >--
 >b
  CONNECTING TO BLUETOOTH MODULE .......
 BT>?
 -- BLUETOOTH CONFIGURATION --
   [o]:SLEEP [w]:MASTER [c]:SLAVE [s]:SIXAXIS [p] PIN [i]:info [ESC]:exit
 BT>

-i (INFO)~
ZEAL-C01のMACアドレスと、現在のBluetoothの接続モードを表示します。自動待ち受けの場合は'WAITING MODE'、自動接続の場合は接続先のMACアドレスが表示されます。
-ESC (EXIT)~
Bluetoothの設定モードを抜けます。
-o (SLEEP MODE)~
Bluetoothモジュールを待機状態に設定します。他のBluetooth機器からの検索や接続が出来なくなります。
-w (MASTER MODE)~
自動待ち受けに設定します。他のBluetooth機器から本装置を検索させ、接続させる場合に選択します。~
-c (SLAVE MODE)~
自動接続に設定します。本装置から他のBluetooth機器を検索及び選択、もしくは直接MACアドレスを入力して自動的に接続させる場合に選択します。
 BT>c
  SEARCHING...
  0: INPUT MAC
  1: 001122334455 (RC100B)
  2: 5566778899AA (HOGEHOGE)
  3: BBCCDDEEFF00 ()
  OTHER: exit
  NO =
接続先がSPPに対応している必要があります。なお、接続先がPINコードを要求する場合はPINコードを合わせておく必要があります。
-s (SIXAXIS MODE)~
PlayStation®3用のワイヤレスコントローラであるSIXAXISないしDUALSHOCK®3からの接続を待ち受けます。~
使用するSIXAXIS側に予めUD3に搭載されたBluetoothモジュールのデバイスアドレスを設定しておく必要があります。SIXAXISの設定変更に関しては[[こちら>SIXAXIS]]を参照ください。
-p (PINコード設定)~
PINコードを設定します。現在設定されているPINコードが表示されるので、最大16文字までの0から9の任意の数字を入力します。未設定は許容しません。

**開発環境 [#v1eb2eaa]

***GCC Developer Lite [#v57a2534]
GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~
コンポーネントの選択中にフルインストールないし「ユニバーサルドライバⅢ(AT91SAM7S)でのみ使用)」を選択する事で必要なコンポーネントが自動的にインストールされます。~
#ref(GDL_UD3_Select.png)
UD3で使用される主要なコンポーネントを簡単に紹介します。
-''[[GCC Developer Lite>GCC Developer Lite#GCCDevL]]''
~ソースプログラムを編集するためのテキストエディタとその他のツールを起動するためのランチャ機能を有する。
-''[[SIMPLE TERM>GCC Developer Lite#STERM]]''
~汎用シリアルターミナル。簡易的なTLENETクライアントとしても機能する。~
USB等で提供されるCOMポートの動的な検出と、COMポートを使用する弊社ツールとの排他制御機能を持つ。
-''ARMGCC''
~ARMコア向けC/C++言語向けのコンパイラ。出来る限り最新のパッチを適用しているため、時に互換性を失う。
-''デバイスドライバ''
~弊社提供のAT91SAM7シリーズ向けUSB CDCエミュレーションドライバ。
-''ターゲットファイル''
~MPUの内蔵ペリフェラルを定義したヘッダファイルやUARTを簡便に使うためのAPI、USBをシリアルポートとして使用するためのAPI、GDBにてデバッグする際に使用する初期化ファイル、シリーズ毎に異なるメモリマップを定義したリンカスクリプトファイル、スタートアップルーチンを含む。基本的にコンパイル済みライブラリとしてソースとリンクして使用する。

****ターゲットファイル [#l9fe78a0]
[[GCC Developer Lite>GCC Developer Lite]]ではUD3用の設定を1種類備えています。~
#ref(GDL_CompileOption_TargetList.png)
以下にUD3に対応した設定リストの一覧とその設定における機能を紹介します。
-''UD3''
~USB・Bluetoooth・RS485 I/Fを介してDynamixelプロトコルをサポートするタスクとUD3搭載機能を簡便に使用するためのライブラリとして提供される。~
同時にOSとしてAT91SAM7Sシリーズ用Toppersカーネルもリンク対象となる。~
~ビルドするとブートローダにてMPUのフラッシュROMへ転送するための.bin(バイナリ)ファイルが作られる。~
ビルドが成功すると、STERM.exe(SIMPLE TERM)が起動する。~

****SIMPLE TERMとブートローダ [#zd751f4a]
ブートローダはUD3のUSB・Bluetooth・RS485を使用して外部からユーザーログラムの書き換えや操作を行う事が出来ます。~
ブートローダを使用して動作するプログラムが構成出来る設定リストは以下の通りで、これ以外の設定リストで構成されたプログラムをブートローダで転送しても正常に動作しないまでか、ボードが破損する可能性があります。
-UD3 (Bootloader)

PCとUD3をUSBケーブルで接続して使用するケースを紹介します。~
USBを仮想シリアルポートとして認識させるためのPC用デバイスドライバは、[[GCC Developer Lite>GCC Developer Lite]]をインストールした際にWindowsのシステムフォルダにコピーされます。USBケーブルでUD3とPCを接続するとデバイスドライバを要求されますが、自動検索させる事でインストールが行われます。~
インストール後、新しいCOMポートがWindowsのデバイスとして追加され、SIMPLE TERMから該当するCOMポートを選択(COMポート番号はPCの環境によって変わるが、デバイス名に「AT91 USB to Serial Converter」が表示されたポートを選択)しオープンするとブートローダの各種コマンドが使用可能となります。その他の設定は以下の通りです。~
 Baudrate:USB経由では意味を持たないので何でも構わない
 Databits:8
 Stopbits:1
 Parity:Non
 Flow Control:Non
 Protocol:Xmodem
#ref(AT91SAM7_BL_COM.png,100%)

なお、ユーザプログラムが既に書き込まれている場合は、電源投入およびリセット直後にユーザプログラムが実行される仕様です。[[こちら>#ueb4c356]]の手順にてブートローダのコマンドモードにしておく必要があります。

先の設定リストでソースプログラムをコンパイルし成功するとSTERM.exe(SIMPLE TERM)が自動起動されます。COMポート以外に関しては、以下の条件で起動します。
-既にSIMPLE TERMが実行中であれば2重に起動しない。
-ボーレートや転送プロトコルは要求される設定が自動的になされる。
-コンパイル済み.binファイルの情報が渡る(ステータスバーにて確認可)。
-ユーザプログラムを転送する際の手順を記述したスクリプトファイルが使用出来る様になる。

#ref(AT91SAM7_STERM_SCRIPT1.png,100%)

UD3がブートローダのコマンドモードであれば、「スクリプト実行[STERM UD3]」をクリックするだけで転送するファイルを手動で選択する事無く転送にかかる処理と実行までが全て自動的に行われます。
#ref(AT91SAM7_STERM_SCRIPT2.png,100%)
本機能により、手動で間違ったファイルを選択して転送してしまったり、転送不可能な状態で転送をしてしまうといったミスを軽減する事が出来ます。

**UD3向けターゲットファイル及びライブラリ [#zfc66a9e]
[[GCC Developer Lite>GCC Developer Lite]]では1つのソースプログラムのみを対象とするため、機能別にソースを分割して編集やコンパイルするといった使い方は出来ません(完全に出来ないという訳でもありません)。だからと言って全ての機能を一つのソースに記述する事は、プログラムの見通しが悪くなりバグの温床になりかねません。~
そこで、複数のソースに分割する事無くある程度のソースプログラムサイズでコーディングするために、頻繁に使用されるであろう一部の機能が専用のライブラリとして提供されます。~
GCC Developer Liteを標準的な環境のPCへインストールすると、「C:\Program Files\BestTech\GCC Developer Lite\TARGET」フォルダに必要なファイルがコピーされます。必要に応じて本フォルダを参照出来ますし、ユーザがソースを修正しライブラリを再構築する事も可能です。~
~
UD3は複数のライブラリを組み合わせて使用するため、実体はかなり複雑になっています。
-''SAM7S用ライブラリ''~
AT91SAM7Sシリーズ共通の内蔵ペリフェラルを簡便に扱う為のライブラリ。
-''AT91SAM7Sシリーズ用 TOPPERS/ASP''~
μITRON4.0仕様準拠であるリアルタイムカーネル[[Toppers>http://www.toppers.jp/]] ASPのAT91SAM7Sシリーズ向けベステクカスタム版。OSを搭載してもある程度のリアルタイム性を確保出来る事から採用。
-''UD3ライブラリ''~
UD3ライブラリはToppersを採用することで、2チャンネルあるモータドライバを全く違う目的で各々個別のタスクで動かしたり、ホストPCとDynamixelプロトコルで通信を行うタスクを走らせながらシステムを運用といった機能を提供。~
実際にはToppersのそれを意識する必要はほとんどない。

**UD3 API [#c8cb0041]
ユーザ自らMPUのペリフェラルへ直接アクセスするコーディングをする訳ではなく、GCC Developer Liteが提供するUD3専用ライブラリを介してUD3の機能へアクセスする事になります。~
APIを使用する前に、ソースプログラムの先頭に ud3.h をインクルードしてください。
 #include <ud3.h>

本APIを使用したアプリケーションはシステムとして1つのタスクが静的に常時占有されます。このタスクは主にDynamixelプロトコルによる通信処理等に使用されますが、通信が発生しない限り軽微な負荷で動作しています。

APIの詳細は以下に列挙しますが、GCC Developer Lite Version2.3.2.6r4以降に収録されたUD3ライブラリを前提として記述されていますので、それより古いバージョンでは対応しないAPIが存在します。ご注意ください。

***システム及びタスク関連 [#aacb0ce6]
OSで管理されるタスクや時間に関するサブルーチンです。~
ユーザは任意のタスクを最大4つまで作成可能で、自動的にマルチタスクで動作する設定になっています。システムで予約されたタスク(TASK5)は自動的に登録されますが、意図的に停止させてしまうと全APIが正常に動作しなくなりますので絶対に停止させないでください。

****UD3_INITIALIZE [#bd0f80b9]
一般的なC言語のプログラムで言えばmain関数に相当し、一番最初に実行される初期化関数。タスクの起動やGPIOの初期化等はこの関数内で記述する。
 void UD3_INITIALIZE(void);
-パラメータ
~なし
-戻り値
~なし
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // 動作環境設定
   // GPIO8/9/10をPWMキャプチャモードに設定
   UD3_CFG_GPIO8 (GPIO_PWM_CAP);
   UD3_CFG_GPIO9 (GPIO_PWM_CAP);
   UD3_CFG_GPIO10 (GPIO_PWM_CAP);
   // モータの設定
   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_TASK1 [#n10e53c9]
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK1の名称で作られた関数は自動的にタスク1としてOSに登録される。~
タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
複数のタスクを定義し活性化すると各々のタスクは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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (1);  // タスク1をアクティブ化
 }

****UD3_TASK2 [#xb6d65de]
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK2の名称で作られた関数は自動的にタスク2としてOSに登録される。~
タスクの活性化はタスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
で行う。~
複数のタスクを定義し活性化すると各々のタスクは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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (2);  // タスク2をアクティブ化
 }

****UD3_TASK3 [#e13da6de]
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK3の名称で作られた関数は自動的にタスク3としてOSに登録される。~
タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
複数のタスクを定義し活性化すると各々のタスクは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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (3);  // タスク3をアクティブ化
 }

****UD3_TASK4 [#w06ef286]
UD3は最大4つのユーザ定義タスクを同時に実行出来るが、UD3_TASK4の名称で作られた関数は自動的にタスク4としてOSに登録される。~
タスクの活性化は[[UD3_ACTIVE_TASK>#f9cdcf0a]]で行う。~
複数のタスクを定義し活性化すると各々のタスクは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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (4);  // タスク4をアクティブ化
 }

****UD3_ACTIVE_TASK [#f9cdcf0a]
指定したタスクをアクティブにする。タスクをアクティブにしていない場合には、タスクを定義してあってもそのタスクは実行されない。

 void UD3_ACTIVE_TASK (task);
-パラメータ
--int_t '''task'''
~タスク番号。指定出来るタスク番号は1~4。
-戻り値
~なし
-使用例
 #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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (1);  // タスク1をアクティブ化
 }

****UD3_SUSPEND_TASK [#j900e682]
指定したアクティブなタスクをサスペンドする。レジュームするには[[UD3_RESUME_TASK>#l31e0f36]]を使用する。

 int UD3_SUSPEND_TASK (char 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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (1);  // タスク1をアクティブ化
 }

****UD3_RESUME_TASK [#l31e0f36]
指定したサスペンドしているタスクをレジュームする。サスペンドするには[[UD3_SUSPEND_TASK>#j900e682]]を使用する。

 int UD3_RESUME_TASK (char 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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (1);  // タスク1をアクティブ化
 }

****UD3_WAIT [#ja9bd39f]
ミリ秒単位でプログラムの実行を待つ。
 void UD3_WAIT (int_t tm);
-パラメータ
--int_t '''tm'''
~待ち時間(msec)を指定。
-戻り値
~なし
-使用例
 #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秒待ち
   }
 }

 UD3_INITIALIZE () {
   UD3_ACTIVE_TASK (1);
 }

****UD3_GET_ELAPSEDTIME [#lf9e26fd]
アプリケーション起動時からの経過時間をミリ秒単位で取得。
 uint32_t UD3_GET_ELAPSEDTIME (void);
-パラメータ
~なし
-戻り値
~uint32_t 経過時間
-使用例
 // 経過時間を取得します。
 uint32_t tm = UD3_GET_ELAPSEDTIME ();

****UD3_SET_DXPACKETENABLE [#pd1e307a]
Dynamixelパケット通信機能を開始・停止する。デフォルトで開始されるが、Bluetooth・USB・RS485経由の通信をDynamixelパケットで占有されずにユーザ自らのコンソールとして使用する場合は停止させておく必要がある。
 void UD3_SET_DXPACKETENABLE (bool mode);
-パラメータ
--bool '''mode'''
~false: Dyanmixelパケット処理を停止する~
true: Dyanmixelパケット処理を開始する
~デフォルトはtrue
-戻り値
~なし

****UD3_GET_BTCONNECT [#odf822c9]
Bluetoothの接続状態を取得する。なお、接続相手の強制的な電源断等が発生した場合は、状態の繊維に数秒の時間を要する場合がある。
 bool UD3_GET_BTCONNECT (void);
-パラメータ
~なし
-戻り値
~bool  Bluetoothの接続状態
~true :接続中~
false :切断中
-使用例
 bool stat = UD3_GET_BTCONNECT();

***GPIO関連 [#u6745dd8]
GPIO0~11の初期設定や状態の取得サブルーチン関連です。

****UD3_CFG_GPIO0 [#c10e9d62]
GPIO0の端子機能を設定する。
 int UD3_CFG_GPIO0 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO0 (GPIO_ADC);
 }

****UD3_CFG_GPIO1 [#y4f5f690]
GPIO1の端子機能を設定する。
 int UD3_CFG_GPIO1 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO1 (GPIO_ADC);
 }

****UD3_CFG_GPIO2 [#l7586e65]
GPIO2の端子機能を設定する。
 int UD3_CFG_GPIO2 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO2 (GPIO_ADC);
 }

****UD3_CFG_GPIO3 [#a02184b5]
GPIO3の端子機能を設定する。
 int UD3_CFG_GPIO3 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO3 (GPIO_ADC);
 }

****UD3_CFG_GPIO4 [#l791e053]
GPIO4の端子機能を設定する。
 int UD3_CFG_GPIO4 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO4 (GPIO_ADC);
 }

****UD3_CFG_GPIO5 [#ad4fd1e3]
GPIO5の端子機能を設定する。
 int UD3_CFG_GPIO5 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO5 (GPIO_ADC);
 }

****UD3_CFG_GPIO6 [#x95d33cb]
GPIO6の端子機能を設定する。
 int UD3_CFG_GPIO6 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO6 (GPIO_ADC);
 }

****UD3_CFG_GPIO7 [#c82b29f3]
GPIO7の端子機能を設定する。
 int UD3_CFG_GPIO7 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~以下のリストから一つだけ選択出来る。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_ADC (2:アナログ入力)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // ADC
   UD3_CFG_GPIO7 (GPIO_ADC);
 }

****UD3_CFG_GPIO8 [#n31eda6b]
GPIO8の端子機能を設定する。
 int UD3_CFG_GPIO8 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~GPIO端子の動作内容を設定。以下のリストから一つだけ選択出来る。なお、GPIO_ADC(2:アナログ入力)は設定出来ない。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)~
GPIO_PWM_CAP (5:パルス幅計測用入力かつプルアップON)~
GPIO_PWM (6:PWM出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場に-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // PWMキャプチャモードに設定
   UD3_CFG_GPIO8 (GPIO_PWM_CAP);
 }

****UD3_CFG_GPIO9 [#u201f4af]
GPIO9の端子機能を設定する。
 int UD3_CFG_GPIO9 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~GPIO端子の動作内容を設定。以下のリストから一つだけ選択出来る。なお、GPIO_ADC(2:アナログ入力)は設定出来ない。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)~
GPIO_PWM_CAP (5:パルス幅計測用入力かつプルアップON)~
GPIO_PWM (6:PWM出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場に-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // パルス幅計測モードに設定
   UD3_CFG_GPIO9 (GPIO_PWM_CAP);
 }

****UD3_CFG_GPIO10 [#d2dd2f39]
GPIO10の端子機能を設定する。
 int UD3_CFG_GPIO10 (TGPIOMode conf);
-パラメータ
--TGPIOMode '''conf'''
~GPIO端子の動作内容を設定。以下のリストから一つだけ選択出来る。なお、GPIO_ADC(2:アナログ入力)は設定出来ない。
~GPIO_IN_PULLUP_OFF (0:入力かつ内蔵プルアップOFF)~
GPIO_IN_PULLUP_ON (1:入力かつ内蔵プルアップON)~
GPIO_OUT_OPENDRAIN (3:オープンドレイン出力)~
GPIO_OUT_PUSHPULL (4:プッシュプル出力)~
GPIO_PWM_CAP (5:パルス幅計測用入力かつプルアップON)~
GPIO_PWM (6:PWM出力)
~デフォルトはGPIO_IN_PULLUP_OFF。
-戻り値
~成功すると0 、パラメータエラーがあった場に-1が返される。
-使用例
 #include <ud3.h>

 UD3_INITIALIZE ()
 {
   // パルス幅計測モードに設定
   UD3_CFG_GPIO10 (GPIO_PWM_CAP);
 }

****UD3_GET_GPIOINPUT [#qdba2bbc]
GPIOの端子状態を取得。入力に使用するGPIOをUD3_CFG_GPIOxで設定する必要がある。
 uint16_t UD3_GET_GPIOINPUT (void);
-パラメータ
~なし
-戻り値
~uint16_t 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  |
-使用例
 // GPIOの入力値
 uint16_t input = UD3_GET_GPIOINPUT ();

****UD3_SET_GPIOOUTPUT [#sb36fb83]
UD3_CFG_GPIOxにてGPIO_OUT_OPENDRAINないしGPIO_OUT_PUSHPULLに設定された端子のみ出力状態を変更する。
 int UD3_SET_GPIOOUTPUT (uint16_t out);
-パラメータ
~uint16_t '''out'''
~出力データを設定。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が返される。
-使用例
 UD3_CFG_GPIO0(GPIO_OUT_PUSHPULL); // GPIO0を出力に
 UD3_CFG_GPIO1(GPIO_OUT_PUSHPULL); // GPIO1を出力に
 UD3_CFG_GPIO2(GPIO_OUT_PUSHPULL); // GPIO2を出力に

 UD3_SET_GPIOOUTPUT (0x01); // GPIO0のみにHighを出力
 UD3_SET_GPIOOUTPUT (0x02); // GPIO1のみにHighを出力
 UD3_SET_GPIOOUTPUT (0x04); // GPIO2のみにHighを出力
 UD3_SET_GPIOOUTPUT (0x07); // GPIO0~2にHighを出力
 UD3_SET_GPIOOUTPUT (0x07); // GPIO0~2にLowを出力

****UD3_GET_ADC [#f0162d6a]
GPIO0~7に入力された電圧値を取得する。~
ADCに使用するGPIOをUD3_CFG_GPIOxで設定する必要がある。
 uint16_t UD3_GET_ADC (uint8_t ch);
-パラメータ
--uint8_t '''ch'''
~0~7(GPIO0~GPIO8)のチャネル番号
-戻り値
~uint16_t 指定したチャネルの0(0V)~1023(3.3V)のアナログ値
-使用例
 // GPIO0に入力された電圧を取得します。
 adc = UD3_GET_ADC (0);

***MMI関連 [#e45522b5]
プッシュボタン・ディップスイッチ・LED・ブザー関連のサブルーチンです。

****UD3_SET_BUZZER [#y8fc67a7]
任意周波数・音長でブザーを鳴らす。
 int UD3_SET_BUZZER (uint8_t scale, uint8_t len);
-パラメータ
--uint8_t '''scale'''
~音程を0~52の範囲で設定。
--uint8_t '''len'''
~音長を0~250(x10ms)の範囲で設定。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 UD3_SET_BUZZER (24, 20);
 UD3_WAIT (300);
 UD3_SET_BUZZER (30, 20);

****UD3_SET_LED [#q6f1d21e]
LEDの点灯/消灯。~
 int UD3_SET_LED (uint8_t on);
-パラメータ
--uint8_t '''on'''
~0で消灯、1で点灯する。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 // LEDを点滅させます。
 while (1) {
   UD3_SET_LED (1);
   UD3_WAIT (200);
   UD3_SET_LED (0);
   UD3_WAIT (200);
 }

****UD3_GET_PUSHBUTTON1 [#xe62248e]
PB1の状態を取得。
 bool UD3_GET_PUSHBUTTON1 (void);
-パラメータ
~なし
-戻り値
~bool PB1の状態
~true :押されている~
false :放されている
-使用例
 // PB1が押されている場合にLEDを点灯させます。
 UD3_SET_LED (UD3_GET_PUSHBUTTON1 ());

****UD3_GET_PUSHBUTTON2 [#t4c165bb]
PB2の状態を取得。
 bool UD3_GET_PUSHBUTTON2 (void);
-パラメータ
~なし
-戻り値
~bool PB2の状態
~true :押されている~
false :放されている
-使用例
 // PB2が押されている場合にLEDを点灯させます。
 UD3_SET_LED (UD3_GET_PUSHBUTTON2 ());

****UD3_GET_DIPSWICH [#o08f8c1c]
DIP1の状態を取得。
 uint8_t UD3_GET_DIPSWICH (void);
-パラメータ
~なし
-戻り値
~uint8_t DIP1に設定された値(0x00~0x0f)
-使用例
 // DIP1の状態を取得します。
 uint8_t sw = UD3_GET_DIPSWICH ();

***モータアンプ関連 [#u7a23908]
2つのモータドライバの初期設定やデューティー関連のサブルーチンです。

なお、設定デューティ値と出力の相関は以下の図に従い、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'''
~_UD_MOTOR_BRAKE (0:ブレーキモード)~
_UD_MOTOR_DRIVE (1:ドライブモード)
~デフォルトは_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_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'''
~_UD_MOTOR_BRAKE (0:ブレーキモード)~
_UD_MOTOR_DRIVE (1:ドライブモード)
~デフォルトは_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_SET_MOTORREVRSE [#m604c98d]
M1/2の回転方向を反転させる。
 int UD3_SET_MOTORREVRSE (int8_t rev);
-パラメータ
--int8_t '''rev'''
以下のビットで各々反転を設定。
~_M1_REV (0x1;M1反転)~
_M2_REV (0x02:M2反転)
~デフォルトは0。
-戻り値
~成功すると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。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。
-使用例
 // モータ駆動回路を活性化する。
 UD3_SET_MOTORENABLE (1);

****UD3_GET_MOTORENABLE [#t660991d]
モータの駆動ゲート回路の状態を取得する。
 bool UD3_GET_MOTORENABLE (void);
-パラメータ
~なし
-戻り値
~bool  駆動ゲート回路の状態
~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ミリ秒あたりの増分を1~200‰の値で与える。~
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'''
~M1用デューティーを-1000[‰]~0~1000[‰]で指定。~
--int16_t '''m2duty'''
~M2用デューティーを-1000[‰]~0~1000[‰]で指定。
-戻り値
~成功すると0 、パラメータエラーがあった場合は-1が返される。~
-使用例
 // M1を30%,M2を20%のDUTYで動作させます。
 UD3_SET_DUTY (300, 200);

***GPIOパルス入出力関連 [#o25124f6]
****UD3_SET_PWM8CLOCK [#g666594c]
PWM8のPWM出力及びPWM幅計測用ベースクロックを設定する。PWMは本クロックを基準に16bitカウンタとして機能する。~
GPIO8を[[UD3_CFG_GPIO8>#u201f4af]]でGPIO_PWMに設定する必要がある。
 int UD3_SET_PWM8CLOCK (uint8_t clock);
-パラメータ
--uint8_t '''clock'''
~ベースクロックを0~4で選択。
~_UD_PWM_CLOCK_24M   (0:24MHz)~
_UD_PWM_CLOCK_6M    (1:6MHz)~
_UD_PWM_CLOCK_1500K (2:1.5MHz)~
_UD_PWM_CLOCK_375K  (3:375kHz)~
_UD_PWM_CLOCK_46K   (4:46.875kHz)
-戻り値
~成功すると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 [#ae26f679]
PWM9のPWM出力及びPWM幅計測用ベースクロックを設定する。PWMは本クロックを基準に16bitカウンタとして機能する。~
GPIO9を[[UD3_CFG_GPIO9>#u201f4af]]でGPIO_PWMに設定する必要がある。
 int UD3_SET_PWM9CLOCK (uint8_t clock);
-パラメータ
--uint8_t '''clock'''
~ベースクロックを0~4で選択。
~_UD_PWM_CLOCK_24M   (0:24MHz)~
_UD_PWM_CLOCK_6M    (1:6MHz)~
_UD_PWM_CLOCK_1500K (2:1.5MHz)~
_UD_PWM_CLOCK_375K  (3:375kHz)~
_UD_PWM_CLOCK_46K   (4:46.875kHz)
-戻り値
~成功すると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 [#cd6005d8]
PWM10のPWM出力及びPWM幅計測用ベースクロックを設定する。PWMは本クロックを基準に16bitカウンタとして機能する。~
GPIO10を[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWMに設定する必要がある。
 int UD3_SET_PWM10CLOCK (uint8_t clock);
-パラメータ
--uint8_t '''clock'''
~ベースクロックを0~4で選択。
~_UD_PWM_CLOCK_24M   (0:24MHz)~
_UD_PWM_CLOCK_6M    (1:6MHz)~
_UD_PWM_CLOCK_1500K (2:1.5MHz)~
_UD_PWM_CLOCK_375K  (3:375kHz)~
_UD_PWM_CLOCK_46K   (4:46.875kHz)
-戻り値
~成功すると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に設定する必要がある。
 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に設定する必要がある。
 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に設定する必要がある。
 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_GPIO9>#j90d8ac4]],[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWM_CAPに設定する必要がある。
~本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>

 UD3_INITIALIZE () {
   // GPIO8,9をパルス幅計測モードに
   UD3_CFG_GPIO8 (GPIO_PWM_CAP);
   UD3_CFG_GPIO9 (GPIO_PWM_CAP);
   // モータの駆動モード設定
   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_GPIO9>#j90d8ac4]],[[UD3_CFG_GPIO10>#d2dd2f39]]でGPIO_PWM_CAPに設定する必要がある。
 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_trc2);
-パラメータ
--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>

 UD3_INITIALIZE () {
   // GPIO8,9をパルス幅計測モードに
   UD3_CFG_GPIO8 (GPIO_PWM_CAP);
   UD3_CFG_GPIO9 (GPIO_PWM_CAP);
   // モータの駆動モード設定
   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_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_GX [#wa4f160b]
SIXAXISのX軸加速度を取得する。
 uint16_t UD3_GET_GX(void);
-パラメータ
~なし
-戻り値
~uint16_t 0~1023の範囲でX軸の加速度を返す。
-使用例
 uint16_t gx = UD3_GET_GX ();

****UD3_GET_GY [#m9f9751e]
SIXAXISのY軸加速度を取得する。
 uint16_t UD3_GET_GX(void);
-パラメータ
~なし
-戻り値
~uint16_t 0~1023の範囲でY軸の加速度を返す。
-使用例
 uint16_t gy = UD3_GET_GY ();

****UD3_GET_GZ [#i5505dd1]
SIXAXISのZ軸加速度を取得する。
 uint16_t UD3_GET_GZ(void);
-パラメータ
~なし
-戻り値
~uint16_t 0~1023の範囲でZ軸の加速度を返す。
-使用例
 uint16_t gz = UD3_GET_GZ ();

****UD3_GET_GYRO [#pcb0b72f]
SIXAXISの角加速度を取得する。
 uint16_t UD3_GET_GYRO(void);
-パラメータ
~なし
-戻り値
~uint16_t 0~1023の範囲で角加速度を返す。
-使用例
 uint16_t gyro = UD3_GET_GYRO ();

***コンソール関連 [#d0d4a9b4]
コンソールとして使用出来るUSB・Bluetooth・RS485のいずれかを介したシリアル通信を行います。デフォルトのコンソールはUSBとなっていますが、いすれかのI/Fからの受信が発生する事でデフォルトコンソールが切り替わります。~
なお、USB・Bluetooth・RS485のI/FはDynamixelパケットによる通信に使用されるため、コンソールとしてのみ使用するには[[UD3_SET_DXPACKETENABLE>#pd1e307a]]でDynamixelパケット処理を停止しておく必要があります。その場合はDynamixelパケット処理が行われなくなります。~
また、コンソールへの送信にはシリアル通信の都合からそれ相応の時間を要します。高速で動作させているタスクの中で高い頻度で送信を行うと処理時間が長くなります。

****UD3_PUTC [#w4f6854d]
コンソールに1文字送信する。
 void UD3_PUTC (char c);
-パラメータ
--char '''c'''
~送信文字(1バイト)を指定
-戻り値
~なし
-使用例
 UD3_PUTC('A');

****UD3_GETC [#ibd505dc]
コンソールから1文字取得する。受信バッファが空の場合は最低1バイト受信するまで返らない。
 char UD3_GETC (void);
-パラメータ
~なし
-戻り値
~char 受信文字
-使用例
 while (UD3_RXBUFF()) UD3_PUTC(UD3_GETC());

****UD3_PUTS [#qc95c51a]
コンソールへ文字列を送信する。
 void UD3_PUTS (char *s);
-パラメータ
--char '''*s'''
~送信文字列(NULLターミネーション)のポインタを指定
-戻り値
~なし
-使用例
 UD3_PUTS("HELLO!\n");

****UD3_PUTSB [#e16d8efa]
コンソールへ指定バイト数のデータを送信する。
 void UD3_PUTSB (char *s, int len);
-パラメータ
--char '''*s'''
~送信データのポインタを指定
--int '''len'''
~送信バイト数を指定
-戻り値
~なし
-使用例
 char s[]={'A','B','C','D'};
 UD3_PUTS(s, 4);

****UD3_RXBUFF [#w6cb53ad]
コンソールから受信されたバイト数を返す。
 int UD3_RXBUFF (void);
-パラメータ
~なし
-戻り値
~int 受信バイト数。
-使用例
 while (UD3_RXBUFF()) UD3_PUTC(UD3_GETC());

****UD3_PRINTF [#xd168578]
コンソールへ書式化文字列を送信する。
 int UD3_PRINTF (const char *format, ...) {
-パラメータ
--const char '''*format'''
~書式文字列
--...
~可変個引数
-戻り値
~int 送信バイト数。
-使用例
 int i ;
 while UD3_PRINTF("HELLO! %d\n", i++);

**サンプルプログラム [#kf8170aa]
APIを使用したいくつかのサンプルプログラムを用意しました。以下よりダウンロードして解凍した上でご利用ください。
#ref(UD3_SMPL1.2.zip)
詳細はコメントおよびAPIのドキュメントを参考に読み解いてください。
-更新履歴~
2010/9/25 Ver.1.2~
コメントを追加~
DUALSHOCK3を使用するサンプル追加~
相撲ロボット向けのサンプルの挙動を共通化

***相撲ロボット向けサンプルについて [#jf8d7859]
いきなりフルパワーで暴走すると危険ですので、いくつかのサンプルでは以下のマクロで最終段の出力を抑えています。
 #define POWERGAIN 30   // ★出力を調整するためのゲイン 0~100%で指定
パワーが上がらなのはバッテリやモータの問題ではありませんので、必要に応じてこの値を0~100の範囲で変更し、再度コンパイルし直してください。

相撲ロボット向けサンプルプログラムが想定している周辺機器の接続イメージは以下の通りです。
#ref(ud3_sumou_peripheral.png,40%)
各コネクタの詳細を以下に示します。
: CN1 | MPU及びセンサ用の一次電源。供給電圧は8V以上を必要とする。
: CN2 | PCとUD3をUSBケーブルで接続して通信を行う。プログラムのダウンロードを行ったら外しておく。
: CN3 | モータ用の一次電源。電源ラインにヒューズを挿入する事を推奨。
: J1 (GPIO0) | 左前土俵検出を目的としたセンサを接続。ここでは[[BTE003B 反射型フォトインタラプタ>BTE003B]]を想定し、5Vの電源供給も含め3線を接続する。
: J2 (GPIO1) | 右前土俵検出を目的としたセンサを接続。ここでは[[BTE003B 反射型フォトインタラプタ>BTE003B]]を想定し、5Vの電源供給も含め3線を接続する。
: J3 (GPIO2) | 左前ないし左にいる相手検出を目的としたセンサを接続。ここでは[[BTE023 800mm光センサ>BTE023]]を想定し、5Vの電源供給も含め3線を接続する。
: J4 (GPIO3) | 前方にいる相手検出を目的としたセンサを接続。ここでは[[BTE023 800mm光センサ>BTE023]]を想定し、5Vの電源供給も含め3線を接続する。
: J5 (GPIO4) | 右前ないし右にいる相手検出を目的としたセンサを接続。ここでは[[BTE023 800mm光センサ>BTE023]]を想定し、5Vの電源供給も含め3線を接続する。
: J8 (GPIO7) | ラジコン用受信器の電源供給用。未使用のJ6ないしJ7でも構わない。5Vで利用出来る受信器を想定。
: J9 (GPIO8) | ラジコン用受信器のCH1。右側のモータ(M1)のパワー及び回転方向を指令する信号が供給される前提。
: J10 (GPIO9) | ラジコン用受信器のCH2。左側のモータ(M2)のパワー及び回転方向を指令する信号が供給される前提。
: J11 (GPIO10) | 非常停止時に0.2秒以上LOWの信号を出力する何らかの非常停止装置を想定。
: M1 | 右側に配した車輪を駆動するモータを接続。プラスのデューティーを指令すると後退する方向に回転する前提。
: M2 | 左側に配した車輪を駆動するモータを接続。プラスのデューティーを指令すると前進する方向に回転する前提。

***基本操作フロー [#heb0404f]
個々の詳細に関してはサンプルプログラム内のコメントを参照していただくとして、コンパイルしてUD3に転送して実行させるまでの流れを書いておきます。
+GCC Developer Liteで任意のソースをコンパイラオプションで「UD3」を選択してコンパイル。
+コンパイル成功と同時にSIMPLE TERMが勝手に起動する。二重に起動する事はない。
+PCとUD3をUSBケーブルで接続し、PB1とPB2を押しながらPB3のリセットを押す。PB3だけを放しUD3から「ピロッ」という起動音が聞こえたら全てのボタンを放して構わない。
+SIMPLE TERMのポートを適宜設定しポートを開くと、SIMPLE TERMのターミナルウィンドウに起動メッセージが表示されたら転送可能状態。
+SIMPLE TERMの転送メニューからスクリプト実行をクリックし、プログラムの転送を開始する。スクリプトはプログレスバーが100%になれば転送を完了し、転送したプログラムを実行する。
+転送したプログラムに実行が遷移する際にSIMPLE TERMで開いているポートが切断されるが、プログラムが正常に実行されてしまえば再度活性化してポートが自動的に開く。

**注意事項 [#hc748965]

|CENTER:BGCOLOR(red):||c
|&nbsp; :idea:|下記に記載された事項以外にも、経験を踏まえた危険回避方策を講じる事。&br;安全に配慮しない場合は人命や財産を失う恐れがある。&br;また従わない場合は保証対象外となる。|
-搭載されるMPUはロットにより2種類混在するが選択は出来ない。
-知識と認識がある場合を除き、MPU及びセンサ用電源とモータ用電源は同じソースから供給しない事。
-一般的な直流電源装置をモータ用電源として使用しない事。モータの状態によっては容易に見かけ上の電源電圧が上昇し、破損の恐れがある。
-モータ用の電源を印加せずMPU・センサ用の電源のみを印加している状態ではモータの[[イネーブル>#x441e3d8]]を行ってはならない。イネーブルするとゲートドライバの負荷が上がり、発熱ないし破損する。
-高いモータ用電源の使用はひかえる事。当然アクチュエータにもよるが、ノイズ等の影響を考慮し公称7.4Vバッテリパックを2本直列程度にとどめる事を強く推奨する。
-ノイズが大きいモータを使用する場合はノイズ対策を十分に施す事。アークが飛ぶ程の高インダクタンスなモータの使用は推奨しない。また、そういったモータへ定格を超える電源を印加する事は絶対にしてはならない。駆動回路のアバランシェ破壊を誘発する可能性が高くなる。
-基本的にフルパワーからのモータの瞬時逆回転は許容しない事。急反転等を行うと仕様以下の電源電圧であっても逆起電力やノイズにより見かけ上の電源電圧が上昇し、もしその電圧がFETの絶対最大定格を超えた場合はFETが即時短絡破壊する。
-最悪ケースでFETがショート状態の故障モードに陥るため、その際にバッテリ等が超過放電にならないよう最終的に電流を遮断するためのヒューズ等を電源ラインに挿入しておく事。
-モータ駆動用のHブリッジが破損するときわめて大きな短絡電流が流入する。その際モータ用電源として接続したバッテリが電流制限ないし保護機能を持っていない場合は、極めて重篤な事態を生じる可能性がある。
-運転中以外はバッテリは全て取り外す事。
-許容損失電力を考慮し、場合によっては強制空冷措置を講じる事。
-コネクタのリードに直接半田したり不用意に導電性の物と接触させてはならない。
-移動台車等を構成した際にUSBケーブルを接続したまま使用しない事。
-FET部分を覆うシールドプレートは取り外してはならない。
-Bluetoothを使用する場合は電波が遮蔽されないよう留意する事。
-ラジコン用のプロポをUD3に近づけると正常な動作を得られなくなる。最低でも数メートル以上離す事。
-ゲートON中は指令値が0であっても電気的にバックドライバビリティが低下する。
-タスクを複数起動すると1つのタスクの実行時間が延びる。動作時間を優先する場合はシングルタスクにとどめておくことを推奨する。
-本製品にかかるいかなる損害が生じても、本製品の単価を超える保障は行わない。

  Next »[4]