1: 2010-07-26 (月) 19:07:14 eid7gud ソース 2: 2010-07-26 (月) 20:04:34 eid7gud ソース
Line 15: Line 15:
   fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);    fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);
 }  }
 +
 +**変数の用意 [#w5bf1723]
 +
 +入力された文字を取得する変数と、パン(横振り)・チルト(上下振り)のポジション用に使う変数を用意します。
 +
 + char c;
 + uint16_t PanPosition = 512, TiltPosition = 512;
 +
 +AX-12+のホーンが丁度真ん中になる512に初期化します。
 +
 +**トルクリミット [#n7c8498d]
 +
 +ID=1と2のAX-12+のトルクリミット(アドレス34,35)を400にします。
 +
 + fd_DXWriteWordData (1, 34, 400);
 + fd_DXWriteWordData (2, 34, 400);
 +
 +**初期ポジションへ移動 [#v9823fe6]
 +
 +AX-12+のホーンを初期ポジションへ移動します。ゴールポジションはアドレス30,31です。
 +
 +  fd_DXWriteWordData (1, 30, PanPosition);
 +  fd_DXWriteWordData (2, 30, TiltPosition);
 +
 +**文字入力を取得する [#wd8c6dc7]
 +
 + while (1) {
 +   if (fd_rx_buff() > 0) c = fd_getc ();
 + }
 +
 +fd_rx_buffは、入力された文字数を返す関数です。fd_getcは入力された文字を1文字取得する関数です。
 +つまり、「もし入力された文字数が0より大きければ(文字が入力されたら)、1文字取得して変数cに代入する」となります。
 +
 +** switch文[#y3b41bdd]
 +取得した文字によって条件を分岐するために[[switch文>http://www.besttechnology.co.jp/modules​/knowledge/?FDIII-HC%20Starter%20Kit%20G​uide%20Chapter1.4#x577fb19]]を使用します。
 +キーボードのテンキーを使って上下左右にカメラを動かします。
 +
 + switch (c) {
 +   case '6' :
 +     // 右へ
 +     break;
 +   case '4' :
 +     // 左へ
 +     break;
 +   case '8' :
 +     // 上へ
 +     break;
 +   case '2' :
 +     // 下へ
 +     break;
 +   case '0' :
 +     // ブートローダへ
 +     break;
 + }
 +
 +キーボードで6を入力すると右へ、4で左へ、8で上へ、2で下へ動くように、0でブートローダへ移行するようにプログラミングします。
 +
 +**パン [#l35044ee]
 + case '6' :
 +   PanPosition --;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 + case '4' :
 +   PanPosition ++;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 +
 +もし6が入力されたらPanPositionを1マイナスし、ポジションを送信します。
 +
 +もし4が入力されたらPanPositionを1プラスし、ポジションを送信します。
 +
 +**チルト [#w4773b87]
 + case '8' :
 +   TiltPosition --;
 +   fd_DXWriteWordData (2, 30, TiltPosition);
 +   break;
 + case '2' :
 +   TiltPosition ++;
 +   fd_DXWriteWordData (2, 30, TiltPosition);
 +   break;
 +
 +もし8が入力されたらTiltPositionを1マイナスし、ポジションを送信します。
 +
 +もし2が入力されたらTiltPositionを1プラスし、ポジションを送信します。
 +
 +**ブートローダへ移行 [#vf532598]
 +
 +ブートローダへ移行する関数はfd_SoftResetです。
 +
 + case '0' :
 +   fd_SoftReset();
 +   break;
 +
 +**ポジションリミット [#v0593392]
 +
 +フレームが干渉してしまうようなポジションを送信するととても危険です。
 +AX-12+に過大な負荷がかかり、破損する場合がありますので、十分注意しましょう。
 +
 +     case '6' :
 +       PanPosition --;
 +       if (PanPosition < 0) PanPosition = 0;
 +       fd_DXWriteWordData (1, 30, PanPosition);
 +       break;
 +
 +PanPositionが0より小さいなら、PanPositionを0にします。
 +
 +     case '4' :
 +       PanPosition ++;
 +       if (PanPosition > 1023) PanPosition = 1023;
 +       fd_DXWriteWordData (1, 30, PanPosition);
 +       break;
 +
 +PanPositionが1023より大きいなら、PanPositionを1023にします。
 +
 +     case '8' :
 +       TiltPosition --;
 +       if (TiltPosition < 200) TiltPosition = 200;
 +       fd_DXWriteWordData (2, 30, TiltPosition);
 +       break;
 +
 +TiltPositionが200より小さいなら、TiltPositionを200にします。
 +取り付け方によっては、数値が異なります。フレームが干渉しないように十分確認して下さい。
 +
 +     case '2' :
 +       TiltPosition ++;
 +       if (TiltPosition > 800) TiltPosition = 800;
 +       fd_DXWriteWordData (2, 30, TiltPosition);
 +       break;
 +
 +TiltPositionが800より大きいなら、TiltPositionを800にします。
 +取り付け方によっては、数値が異なります。フレームが干渉しないように十分確認して下さい。
 +
 +**値の表示 [#u0c09df1]
 +PanPositionとTiltPositionの値を表示します。
 +
 + fd_printf("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition);
 +
 +プログラムを実行してみましょう。
 +
 +**uint16_tの範囲 [#c77a4128]
 +
 +6を入力すると、PanPositionがだんだん減って0になり、その後65535という大きな数字になってしまいます。
 +これは変数の型がuint16_tだからです。uint16_tはC言語でいうところのunsigned shortと同じで、値の範囲は0~65535です。そのため0から1マイナスすると65535になるのです。
 +
 + case '6' :
 +   PanPosition --;
 +   if (PanPosition > 60000) PanPosition = 0;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 +
 +if文の条件を「PanPositionが60000より大きければ」に変えてみましょう。


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