2: 2010-07-26 (月) 20:04:34 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>
- #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} + 
 void main (void) {  void main (void) {
   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);
 }  }
 +
 + #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}
 +は、何かキー入力があったらブートローダに戻るという記述ですが、今回はキー入力を使うのでKEY_QUITは使えません。
 +キー入力が0ならfd_SoftReset関数を実行するようにします。
**変数の用意 [#w5bf1723] **変数の用意 [#w5bf1723]
-入力された文字を取得する変数と、パン(横振り)・チルト(上下振り)のポジション用に使う変数を用意します。+入力された文字を取得する変数cと、パン(横振り)・チルト(上下振り)のポジション用に使う変数PanPositionとTiltPositionを用意します。
 char c;  char c;
Line 28: Line 35:
ID=1と2のAX-12+のトルクリミット(アドレス34,35)を400にします。 ID=1と2のAX-12+のトルクリミット(アドレス34,35)を400にします。
 +
 +fd_Initの後に以下を入力します。
 fd_DXWriteWordData (1, 34, 400);  fd_DXWriteWordData (1, 34, 400);
Line 34: Line 43:
**初期ポジションへ移動 [#v9823fe6] **初期ポジションへ移動 [#v9823fe6]
-AX-12+のホーンを初期ポジションへ移動します。ゴールポジションはアドレス30,31です。+AX-12+のホーンを最初のポジションへ移動します。ゴールポジションはアドレス30,31です。 
 + 
 +トルクリミットの設定の後に以下を入力します。
  fd_DXWriteWordData (1, 30, PanPosition);   fd_DXWriteWordData (1, 30, PanPosition);
Line 40: Line 51:
**文字入力を取得する [#wd8c6dc7] **文字入力を取得する [#wd8c6dc7]
 +
 +文字入力を一文字取得します。
 +
 +初期ポジションへの移動の後に以下を入力します。
 while (1) {  while (1) {
Line 51: Line 66:
取得した文字によって条件を分岐するために[[switch文>http://www.besttechnology.co.jp/modules​/knowledge/?FDIII-HC%20Starter%20Kit%20G​uide%20Chapter1.4#x577fb19]]を使用します。 取得した文字によって条件を分岐するために[[switch文>http://www.besttechnology.co.jp/modules​/knowledge/?FDIII-HC%20Starter%20Kit%20G​uide%20Chapter1.4#x577fb19]]を使用します。
キーボードのテンキーを使って上下左右にカメラを動かします。 キーボードのテンキーを使って上下左右にカメラを動かします。
 +
 +while文内の文字取得の後に以下を入力します。
 switch (c) {  switch (c) {
Line 73: Line 90:
**パン [#l35044ee] **パン [#l35044ee]
 +
 +もし6が入力されたらPanPositionを1マイナスし、ポジションを送信します。~
 +もし4が入力されたらPanPositionを1プラスし、ポジションを送信します。
 +
 +switch文内のcase '6'とcase '4'に以下を入力します。
 +
 case '6' :  case '6' :
   PanPosition --;    PanPosition --;
Line 82: Line 105:
   break;    break;
-もし6が入力されたらPanPositionを1マイナスし、ポジションを送信します。 
-もし4が入力されたらPanPositionを1プラスし、ポジションを送信します。+ 
 +取り付け方によってはプラスマイナスが逆になるかもしれません。
**チルト [#w4773b87] **チルト [#w4773b87]
 +
 +もし8が入力されたらTiltPositionを1マイナスし、ポジションを送信します。~
 +もし2が入力されたらTiltPositionを1プラスし、ポジションを送信します。
 +
 +switch文内のcase '8'とcase '2'に以下を入力します。
 +
 case '8' :  case '8' :
   TiltPosition --;    TiltPosition --;
Line 96: Line 125:
   break;    break;
-もし8が入力されたらTiltPositionを1マイナスし、ポジションを送信します。 +取り付け方によってはプラスマイナスが逆になるかもしれません。
- +
-もし2が入力されたらTiltPositionを1プラスし、ポジションを送信します。+
**ブートローダへ移行 [#vf532598] **ブートローダへ移行 [#vf532598]
ブートローダへ移行する関数はfd_SoftResetです。 ブートローダへ移行する関数はfd_SoftResetです。
 +
 +switch文中のcase '0'にfd_SoftReset関数を入力します。
 case '0' :  case '0' :
Line 110: Line 139:
**ポジションリミット [#v0593392] **ポジションリミット [#v0593392]
-フレームが干渉してしまうようなポジションを送信するととても危険です。 +フレームが干渉してしまうようなポジションを送信すると、AX-12+に過大な負荷がかかり、破損する場合があります。そのようなポジションを送信しないよう、ポジションにリミッターを設けます。 
-AX-12+に過大な負荷がかかり、破損する場合がありますので、十分注意しましょう。+ 
 +各caseに対し以下のように追記します。
     case '6' :      case '6' :
Line 149: Line 179:
**値の表示 [#u0c09df1] **値の表示 [#u0c09df1]
PanPositionとTiltPositionの値を表示します。 PanPositionとTiltPositionの値を表示します。
 +
 +while文内に以下を入力します。
 fd_printf("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition);  fd_printf("Pan:%5d Tilt:%5d\r", PanPosition, TiltPosition);
-プログラムを実行してみましょう。+ここでプログラムを実行してみましょう。
**uint16_tの範囲 [#c77a4128] **uint16_tの範囲 [#c77a4128]
Line 158: Line 190:
6を入力すると、PanPositionがだんだん減って0になり、その後65535という大きな数字になってしまいます。 6を入力すると、PanPositionがだんだん減って0になり、その後65535という大きな数字になってしまいます。
これは変数の型がuint16_tだからです。uint16_tはC言語でいうところのunsigned shortと同じで、値の範囲は0~65535です。そのため0から1マイナスすると65535になるのです。 これは変数の型がuint16_tだからです。uint16_tはC言語でいうところのunsigned shortと同じで、値の範囲は0~65535です。そのため0から1マイナスすると65535になるのです。
 +
 +以下のように、if文の条件を「PanPositionが60000より大きければ」に変えてみましょう。
 case '6' :  case '6' :
Line 165: Line 199:
   break;    break;
-if文の条件を「PanPositionが60000より大きければ」に変えてみましょう。+**プログラム完成 [#dc82a12a] 
 + 
 +以上で完成です。実行してみましょう。 
 + 
 + #include <fd.h> 
 +  
 + 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_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