ページへ戻る

− Links

 印刷 

FDIII-HC Starter Kit Guide​/Chapter7.3 のバックアップソース(No.2) :: Besttechnology

knowledge:FDIII-HC Starter Kit Guide/Chapter7.3 のバックアップソース(No.2)

« Prev[4]  Next »[5]
TITLE:雲台のプログラミング
*プログラミング [#l7fd2c23]

**処理の流れを図にする [#td3b0eb7]

SIMPLE TERMからのキー入力によって、カメラを動かす方向を変えます。
キーボードの十字キー、又はテンキーの'8'、'2'、'4'、'6'を使って上下左右に動き、[ESC]キーでプログラムを終了します。


#ref(flow.png,100%)

**初期化 [#m41943fd]

GCC Developer Liteを起動し、初期化部分を記述します。

#ref(gcc_edit_1.png, 100%)

**キーボード入力関数の作成 [#y215f66b]

通常のキー入力では1回の押下で1バイトが入力されます。十字キーの場合は、1回の入力で3バイトも入力されます。
| 1バイト目 | 2バイト目 | 3バイト目 | キー |
| 0x1b      | 0x5b      | 0x41      | 上キー |
|^          |^          | 0x42      | 下キー |
|^          |^          | 0x43      | 右キー |
|^          |^          | 0x44      | 左キー |
十字キーをテンキーの数字に合わせます。
#ref(gcc_edit_2.png,100%)

**変数 [#nfde1082]
パン(横振り)・チルト(上下振り)のポジション用に使う変数PanPositionとTiltPositionを用意します。AX-12+のホーンが真ん中になるよう、初期値を512とします。

**トルクリミット [#b23b37f8]

ID=1と2のAX-12+のトルクリミットを154にします。

**初期ポジションへ移動 [#n7949229]
トルクリミット設定後、ID1とID2のゴールポジションを変更します。

#ref(gcc_edit_3.png,100%)

**ポジションリミット [#i21b9509]

フレームが干渉してしまうようなポジションを送信すると、AX-12+に過大な負荷がかかり、破損する場合があります。そのようなポジションを送信しないよう、ポジションにリミッタを設けます。

| 条件 | 移動方向 | リミッタ |
|右へ移動 | パン位置減算 | パン位置 > 0 |
|左へ移動 | パン位置加算 | パン位置 < 1023 |
|上へ移動 | チルト位置減算 | チルト位置 > 200 |
|下へ移動 | チルト位置加算 | チルト位置 < 800 |

取り付け方によっては、移動方向やリミッタの数値が異なります。フレームが干渉しないように十分確認して下さい。

**メインループ [#vfd65e43]

プッシュボタンが押されるか、ESCが押されると終了するwhile文を作成します。~
キー入力の有無を[[fd_rx_buff>FDIIILIB#c1552bcf]]関数で確認し、キー入力があれば作成したキーボード入力関数を呼出します。十字キーはテンキーに置き換えられていますので、テンキーの数字でパン位置とチルト位置を変更します。~
パン位置とチルト位置を設定した後、現在の座標を表示します。

#ref(gcc_edit_4.png,100%)

**プログラム完成 [#d361e94a]

以上で完成です。まず、名前を付けて保存します。名前はCameraPlatform.cとします。保存後、ビルドして実行してみましょう。
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
// キーボード入力関数
int getCrossKey () {
  int result = -1;  // 戻り値
  int cnt = 0;      // ループ用カウンタ
  int rcv = 0;      // 入力文字バッファ
  while (fd_rx_buff () && cnt < 3) {
    rcv = fd_getc ();
    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;
}

void main (void) {
  int inkey, iend = 0;
  uint16_t PanPosition = 512, TiltPosition = 512;

  fd_SetBeepCondition (FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP);
  fd_SetUVThreshold (7.4);
  DX_ChangeBaudrate (1000000);

  fd_DXSetTorqueLimit (1, 154); // ID1のトルクリミットに154を設定
  fd_DXSetTorqueLimit (2, 154); // ID2のトルクリミットに154を設定
  fd_DXSetPosition (1, PanPosition);    // パン位置の設定
  fd_DXSetPosition (2, TiltPosition);   // チルト位置の設定

  while (!fd_GetPB () && !iend) {
    if (fd_rx_buff ()) {
      inkey = getCrossKey ();
      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;
      }
      fd_DXSetPosition (1, PanPosition);
      fd_DXSetPosition (2, TiltPosition);
      fd_printf ("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition);
    }
    fd_Wait (10);
  }
}
</pre>
}}
[[次のチャプターへ>FDIIICHAPTER7.4]]~

[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る

« Prev[4]  Next »[5]