2: 2011-07-11 (月) 18:39:16 yoshida ソース 現: 2013-04-09 (火) 23:52:52 takaboo ソース
Line 5: Line 5:
SIMPLE TERMからのキー入力によって、カメラを動かす方向を変えます。 SIMPLE TERMからのキー入力によって、カメラを動かす方向を変えます。
-キーボードの十字キー、又はテンキーの'8'、'2'、'4'、'6'を使って上下左右に動き、[ESC]キーでプログラムを終了します。+キーボードの方向キー、又はテンキーの'8'、'2'、'4'、'6'を使って上下左右に動き、[ESC]キーでプログラムを終了します。
-#ref(flow.png,100%)+#ref(flow.png)
**初期化 [#m41943fd] **初期化 [#m41943fd]
GCC Developer Liteを起動し、初期化部分を記述します。 GCC Developer Liteを起動し、初期化部分を記述します。
- +#html{{ 
-#ref(gcc_edit_1.png, 100%)+<pre class="brush:c"> 
 +  fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP); 
 +  fd_SetUVThreshold (7.4)
 +  DX_ChangeBaudrate (1000000); 
 +</pre> 
 +}}
**キーボード入力関数の作成 [#y215f66b] **キーボード入力関数の作成 [#y215f66b]
-通常のキー入力では1回の押下で1バイトが入力されます。十字キーの場合は、1回の入力で3バイトも入力されます。 +通常のキー入力では1回の押下で1バイトが入力されます。方向キーの場合は、1回の入力で3バイトも入力されます。~ 
-| 1バイト目 | 2バイト目 | 3バイト目 | キー |+機種により値が異なる可能性がありますので、ご注意ください。 
 +| 1バイト目 | 2バイト目 | 3バイト目 | 方向キー |
| 0x1b      | 0x5b      | 0x41      | 上キー | | 0x1b      | 0x5b      | 0x41      | 上キー |
|^          |^          | 0x42      | 下キー | |^          |^          | 0x42      | 下キー |
|^          |^          | 0x43      | 右キー | |^          |^          | 0x43      | 右キー |
|^          |^          | 0x44      | 左キー | |^          |^          | 0x44      | 左キー |
-十字キーをテンキーの数字に合わせます。 +方向キーをテンキーの数字に合わせます。 
-#ref(gcc_edit_2.png,100%)+| 方向キー | 上キー | 下キー | 右キー | 左キー | 
 +| テンキー | '8' | '2' | '6' | '4' | 
 +テンキーはキーボードの右側に位置している数字キー等のことです。~ 
 +#html{{ 
 +<pre class="brush:c"> 
 +// キーボード入力関数 
 +int getCrossKey ()
 +  int result = -1;  // 戻り値 
 +  int cnt = 0;      // ループ用カウンタ 
 +  int rcv = 0;      // 入力文字バッファ 
 +  while (fd_rx_buff () && cnt < 3) {          // 入力バイトが残っており、3バイト目の処理が終了するまで繰り返す 
 +   rcv = fd_getc ();                        // 1バイト入力 
 +   switch (cnt) { 
 +     case 0: if (rcv == 0x1b) cnt++; break;  // 1バイト目が0x1bか確認 
 +     case 1: if (rcv == 0x5b) cnt++; break;  // 2バイト目が0x5bか確認 
 +     default: 
 +       switch (rcv) {                        // 十字キー以外は読み飛ばし 
 +         case 0x41: result = '8'; break;    // 上キー 
 +         case 0x42: result = '2'; break;    // 下キー 
 +         case 0x43: result = '6'; break;    // 右キー 
 +         case 0x44: result = '4'; break;    // 左キー 
 +       } 
 +       cnt++; 
 +       break; 
 +   } 
 +  } 
 +  if (cnt != 3) result = rcv; // 通常のキーボード入力 
 +  return result; 
 +
 +</pre> 
 +}}
**変数 [#nfde1082] **変数 [#nfde1082]
-パン(横振り)・チルト(上下振り)のポジション用に使う変数PanPositionとTiltPositionを用意します。AX-12+のホーンが真ん中になるよう、初期値を512とします。+パン(横振り)・チルト(上下振り)のポジション用に使う変数PanPositionとTiltPositionをuint16_t型で用意します。AX-12Aのホーンが真ん中になるよう、初期値を512とします。~ 
 +入力バッファ用の変数inkeyと、ESCキー入力時の処理の終了判断を行うためのiendをint型で宣言します。 
 +#html{{ 
 +<pre class="brush:c"> 
 +  int inkey, iend = 0; 
 +  uint16_t PanPosition = 512, TiltPosition = 512; 
 +</pre> 
 +}}
**トルクリミット [#b23b37f8] **トルクリミット [#b23b37f8]
-ID=1と2のAX-12+のトルクリミットを154にします。+ID=1と2のトルクリミットを154にします。 
 + 
 +#html{{ 
 +<pre class="brush:c"> 
 +  fd_DXSetTorqueLimit (1, 154); // ID1のトルクリミットに154を設定 
 +  fd_DXSetTorqueLimit (2, 154); // ID2のトルクリミットに154を設定 
 +</pre> 
 +}} 
 + 
 +トルクが不足している場合は適宜増加します。
**初期ポジションへ移動 [#n7949229] **初期ポジションへ移動 [#n7949229]
トルクリミット設定後、ID1とID2のゴールポジションを変更します。 トルクリミット設定後、ID1とID2のゴールポジションを変更します。
-#ref(gcc_edit_3.png,100%)+#html{{ 
 +<pre class="brush:c"> 
 +  fd_DXSetPosition (1, PanPosition);    // パン位置の設定 
 +  fd_DXSetPosition (2, TiltPosition);  // チルト位置の設定 
 +</pre> 
 +}}
**ポジションリミット [#i21b9509] **ポジションリミット [#i21b9509]
-フレームが干渉してしまうようなポジションを送信すると、AX-12+に過大な負荷がかかり、破損する場合があります。そのようなポジションを送信しないよう、ポジションにリミッタを設けます。+フレームが干渉してしまうようなポジションを送信すると、AX-12Aに過大な負荷がかかり、破損する場合があります。そのようなポジションを送信しないよう、ポジションに仮のリミッタを設けます。
| 条件 | 移動方向 | リミッタ | | 条件 | 移動方向 | リミッタ |
Line 53: Line 110:
**メインループ [#vfd65e43] **メインループ [#vfd65e43]
-プッシュボタンが押されるか、ESCが押されると終了するwhile文を作成します。~ +プッシュボタンが押されるか、ESCが押されると終了(ここでは終了フラグを参照)するwhile文を作成します。 
-キー入力の有無を[[fd_rx_buff>FDIIILIB#c1552bcf]]関数で確認し、キー入力があれば作成したキーボード入力関数を呼出します。十字キーはテンキーに置き換えられていますので、テンキーの数字でパン位置とチルト位置を変更します。~ +#html{{ 
-パン位置とチルト位置を設定した後、現在の座標を表示します。+<pre class="brush:c"> 
 +  while (!fd_GetPB () && !iend) { 
 +</pre
 +}}
-#ref(gcc_edit_4.png,100%)+キー入力の有無を[[fd_rx_buff>FDIIILIB#c1552bcf]]関数で確認し、キー入力があれば作成したキーボード入力関数を呼出します。 
 +#html{{ 
 +<pre class="brush:c"> 
 +if (fd_rx_buff ()) { 
 +  inkey = getCrossKey (); 
 +</pre> 
 +}} 
 +方向キーはテンキーに置き換えられていますので、テンキーの数字でパン位置とチルト位置を変更します。ESCキーが入力されていれば、終了フラグをセットします。 
 +#html{{ 
 +<pre class="brush:c"> 
 +switch (inkey) { 
 +  case '6':  // 右へ移動 
 +   if (PanPosition > 0) PanPosition--; 
 +   break; 
 +  case '4':  // 左へ移動 
 +   if (PanPosition < 1023) PanPosition++; 
 +   break; 
 +  case '8':  // 上へ移動 
 +   if (TiltPosition > 200) TiltPosition--; 
 +   break; 
 +  case '2':  // 下へ移動 
 +   if (TiltPosition < 800) TiltPosition++; 
 +   break; 
 +  case 0x1b:  // 終了 
 +   iend = 1; 
 +   break; 
 +
 +</pre> 
 +}} 
 +パン位置とチルト位置を設定した後、現在の座標を表示します。 
 +#html{{ 
 +<pre class="brush:c"> 
 +fd_DXSetPosition (1, PanPosition); 
 +fd_DXSetPosition (2, TiltPosition); 
 +fd_printf ("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition)
 +</pre> 
 +}}
**プログラム完成 [#d361e94a] **プログラム完成 [#d361e94a]
Line 102: Line 198:
  fd_DXSetPosition (1, PanPosition);    // パン位置の設定   fd_DXSetPosition (1, PanPosition);    // パン位置の設定
  fd_DXSetPosition (2, TiltPosition);  // チルト位置の設定   fd_DXSetPosition (2, TiltPosition);  // チルト位置の設定
 + 
  while (!fd_GetPB () && !iend) {   while (!fd_GetPB () && !iend) {
   if (fd_rx_buff ()) {    if (fd_rx_buff ()) {


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