1: 2010-07-26 (月) 19:07:14 eid7gud ソース 現: 2010-07-27 (火) 13:45:28 eid7gud ソース
Line 1: Line 1:
-只今編集中です。 
- 
*プログラミング [#ha3bcc28] *プログラミング [#ha3bcc28]
**処理の流れを図にする [#s66356df] **処理の流れを図にする [#s66356df]
 +
 +SIMPLE TERMからのキー入力によって、カメラを動かす方向を変えます。
 +キーボードのテンキーを使って6なら右、4なら左、8なら上、2なら下へ動き、0でブートローダへ移行します。
 +
 +
 +#ref("camera_block.png")
**準備 [#k7be398a] **準備 [#k7be398a]
Line 10: Line 14:
 #include <fd.h>  #include <fd.h>
 + 
 + void main (void) {
 +   fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);
 + }
 +
 #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}  #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}
 +は、何かキー入力があったらブートローダに戻るという記述ですが、今回はキー入力を使うのでKEY_QUITは使えません。
 +キー入力が0ならfd_SoftReset関数を実行するようにします。
 +**変数の用意 [#w5bf1723]
 +
 +入力された文字を取得する変数cと、パン(横振り)・チルト(上下振り)のポジション用に使う変数PanPositionとTiltPositionを用意します。
 +
 + char c;
 + uint16_t PanPosition = 512, TiltPosition = 512;
 +
 +AX-12+のホーンが丁度真ん中になる512に初期化します。
 +
 +**トルクリミット [#n7c8498d]
 +
 +ID=1と2のAX-12+のトルクリミット(アドレス34,35)を400にします。
 +
 +fd_Initの後に以下を入力します。
 +
 + 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]]を使用します。
 +キーボードのテンキーを使って上下左右にカメラを動かします。
 +
 +while文内の文字取得の後に以下を入力します。
 +
 + switch (c) {
 +   case '6' :
 +     // 右へ
 +     break;
 +   case '4' :
 +     // 左へ
 +     break;
 +   case '8' :
 +     // 上へ
 +     break;
 +   case '2' :
 +     // 下へ
 +     break;
 +   case '0' :
 +     // ブートローダへ
 +     break;
 + }
 +
 +キーボードで6を入力すると右へ、4で左へ、8で上へ、2で下へ動くように、0でブートローダへ移行するようにプログラミングします。
 +
 +**パン [#l35044ee]
 +
 +もし6が入力されたらPanPositionを1マイナスし、ポジションを送信します。~
 +もし4が入力されたらPanPositionを1プラスし、ポジションを送信します。
 +
 +switch文内のcase '6'とcase '4'に以下を入力します。
 +
 + case '6' :
 +   PanPosition --;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 + case '4' :
 +   PanPosition ++;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 +
 +
 +
 +取り付け方によってはプラスマイナスが逆になるかもしれません。
 +
 +**チルト [#w4773b87]
 +
 +もし8が入力されたらTiltPositionを1マイナスし、ポジションを送信します。~
 +もし2が入力されたらTiltPositionを1プラスし、ポジションを送信します。
 +
 +switch文内のcase '8'とcase '2'に以下を入力します。
 +
 + case '8' :
 +   TiltPosition --;
 +   fd_DXWriteWordData (2, 30, TiltPosition);
 +   break;
 + case '2' :
 +   TiltPosition ++;
 +   fd_DXWriteWordData (2, 30, TiltPosition);
 +   break;
 +
 +取り付け方によってはプラスマイナスが逆になるかもしれません。
 +
 +**ブートローダへ移行 [#vf532598]
 +
 +ブートローダへ移行する関数はfd_SoftResetです。
 +
 +switch文中のcase '0'にfd_SoftReset関数を入力します。
 +
 + case '0' :
 +   fd_SoftReset();
 +   break;
 +
 +**ポジションリミット [#v0593392]
 +
 +フレームが干渉してしまうようなポジションを送信すると、AX-12+に過大な負荷がかかり、破損する場合があります。そのようなポジションを送信しないよう、ポジションにリミッターを設けます。
 +
 +各caseに対し以下のように追記します。
 +
 +     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の値を表示します。
 +
 +while文内に以下を入力します。
 +
 + 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になるのです。
 +
 +以下のように、if文の条件を「PanPositionが60000より大きければ」に変えてみましょう。
 +
 + case '6' :
 +   PanPosition --;
 +   if (PanPosition > 60000) PanPosition = 0;
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   break;
 +
 +**プログラム完成 [#dc82a12a]
 +
 +以上で完成です。実行してみましょう。
 +
 + #include <fd.h>
 + 
 void main (void) {  void main (void) {
 +   char c;
 +   uint16_t PanPosition = 512, TiltPosition = 512;
 + 
   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);
 +   fd_DXWriteWordData (1, 34, 400);
 +   fd_DXWriteWordData (2, 34, 400);
 +   fd_DXWriteWordData (1, 30, PanPosition);
 +   fd_DXWriteWordData (2, 30, TiltPosition);
 + 
 +   while (1) {
 +     if (fd_rx_buff () > 0) c = fd_getc ();
 +     switch (c) {
 +       case '6' :
 +         PanPosition --;
 +         if (PanPosition > 60000) PanPosition = 0;
 +         fd_DXWriteWordData (1, 30, PanPosition);
 +         break;
 +       case '4' :
 +         PanPosition ++;
 +         if (PanPosition > 1023) PanPosition = 1023;
 +         fd_DXWriteWordData (1, 30, PanPosition);
 +         break;
 +       case '8' :
 +         TiltPosition --;
 +         if (TiltPosition < 200) TiltPosition = 200;
 +         fd_DXWriteWordData (2, 30, TiltPosition);
 +         break;
 +       case '2' :
 +         TiltPosition ++;
 +         if (TiltPosition > 800) TiltPosition = 800;
 +         fd_DXWriteWordData (2, 30, TiltPosition);
 +         break;
 +       case '0' :
 +         fd_SoftReset ();
 +         break;
 +     }
 +     fd_printf ("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition);
 +   }
 }  }
 +
 +[[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter7.4]]~
 +
 +[[FDIII-HC Starter Kit Guide]]に戻る


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