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 <fd.h> // キーボード入力関数 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]]に戻る
(This host) = http://www.besttechnology.co.jp