2: 2010-01-21 (木) 18:57:58 eid7gud ソース 現: 2010-07-15 (木) 11:48:04 eid7gud ソース
Line 1: Line 1:
-''只今編集中です。'' 
- 
*プログラミング [#m6ec823e] *プログラミング [#m6ec823e]
#ref(SoundMeter_p1.png) #ref(SoundMeter_p1.png)
-「AX-S1で最大音量を測定し、それに対応した角度へAX-12+のホーン動かす」というプログラムを作成します。+「AX-S1で最大音量を測定し、それに対応した角度へAX-12+のホーンを動かす」というプログラムを作成します。 
**処理の流れを図にする。 [#z3dcce2c] **処理の流れを図にする。 [#z3dcce2c]
先ず処理の流れを図にします。 先ず処理の流れを図にします。
#ref(SoundMeter_p2.png) #ref(SoundMeter_p2.png)
-AX-S1の最大音量を取得し、それに対応した角度へAX-12+のホーン動かすを繰り返すだけとなります。+AX-S1の最大音量を取得し、それに対応した角度へAX-12+のホーンを動かすを繰り返すだけとなります。
**準備 [#r9783670] **準備 [#r9783670]
Line 19: Line 18:
**不要部位を削除 [#y36d4588] **不要部位を削除 [#y36d4588]
 +#ref(SoundMeter_p3.png)
今回のプログラムでは条件による分岐がありませんので、以下のif~else~文を削除します。 今回のプログラムでは条件による分岐がありませんので、以下のif~else~文を削除します。
   if (ReadData > 100) {    if (ReadData > 100) {
Line 37: Line 37:
**AX-12+のホーンを動かす [#a86b83f6] **AX-12+のホーンを動かす [#a86b83f6]
 +#ref(SoundMeter_p4.png)
AX-12+のホーンの角度をメーターに見立て、音量最大保持値に対応した角度にホーンを動かします。 AX-12+のホーンの角度をメーターに見立て、音量最大保持値に対応した角度にホーンを動かします。
AX-12+のホーンを動かすには、AX-12+のコントロールテーブルのアドレス30,31にゴールポジションを書き込みます。2バイトのデータを書き込むにはfd_DXWriteWordData関数を使います。詳しくは[[Chapter3.3のバーを開ける>FDIII-HC Starter Kit Guide Chapter3.3#icc81839]]を参照して下さい。 AX-12+のホーンを動かすには、AX-12+のコントロールテーブルのアドレス30,31にゴールポジションを書き込みます。2バイトのデータを書き込むにはfd_DXWriteWordData関数を使います。詳しくは[[Chapter3.3のバーを開ける>FDIII-HC Starter Kit Guide Chapter3.3#icc81839]]を参照して下さい。
 fd_DXWriteWordData (1, 30, ゴールポジション);  fd_DXWriteWordData (1, 30, ゴールポジション);
-ゴールポジションの部分には何を入れるべきでしょうか?+ゴールポジションの部分には何を入れれば良いでしょう?
音量最大保持値に対応した角度にAX-12+のホーンを動かしますので、ゴールポジション=音量最大保持値です。~ 音量最大保持値に対応した角度にAX-12+のホーンを動かしますので、ゴールポジション=音量最大保持値です。~
音量最大保持値は 音量最大保持値は
- fd_DXReadByteData (100, 27, &ReadData);+ fd_DXReadByteData (100, 36, &ReadData);
で変数ReadDataに代入されます。従ってゴールポジションにはReadDataと書きます。 で変数ReadDataに代入されます。従ってゴールポジションにはReadDataと書きます。
 +
 +fd_printf ("%3d\r", ReadData); の後ろに
 fd_DXWriteWordData (1, 30, ReadData);  fd_DXWriteWordData (1, 30, ReadData);
-ReadDataの前に&は付けません。変数の前に&を付けるとその変数のアドレスになります(アドレスについては[[Chapter1.4のアドレス>FDIII-HC Starter Kit Guide Chapter1.4#b45fcfd3]]を参照して下さい)。+と入力します。 
 +ReadDataの前に&は付けません。変数の前に&を付けるとその変数の[[アドレス>FDIII-HC Starter Kit Guide Chapter1.4#b45fcfd3]]になります。
ゴールポジションに書き込むのは、ReadDataのアドレスではなく、ReadDataに入っている値です。 ゴールポジションに書き込むのは、ReadDataのアドレスではなく、ReadDataに入っている値です。
**ゴールポジションと音量最大保持値のデータ範囲 [#p2dbd58e] **ゴールポジションと音量最大保持値のデータ範囲 [#p2dbd58e]
 +#ref(SoundMeter_p5.png)
ゴールポジションのデータの範囲は0~1023でした。 ゴールポジションのデータの範囲は0~1023でした。
 +音量最大保持値のデータ範囲はどうでしょう。
 +
 +音量センサの値は[[Chapter2.5の課題>FDIII-HC Starter Kit Guide Chapter2.5]]で紹介した通り、128を中心に音がすると音量に応じて上下に揺れます。
 +音量最大保持値は音量センサの最大値を保持した値なので、音量最大保持値の範囲は128~255となります。
 +
 +ゴールポジションはせっかく0~1023の範囲があるので、音量最大保持値を3倍した値を代入することで、コールポジションの範囲を384~765にします。~
 +つまり音量最大保持値が128のときゴールポジションは384、200のとき600、255のとき765になります。
 +
 + fd_DXWriteWordData (1, 30, ReadData * 3);
 +
 +上記のように書き換えます。*は掛け算です。
 +
 +**音量最大保持値のリセット [#k6c85475]
 +音量最大保持値は、音量の最大値を保持し続けます。従って一度値が最大の255になると、それ以降は255から変化することはありません。もう一度初めから測定するために音量最大保持値をプッシュボタンでリセットするようにします。
 +
 +***プッシュボタンの取得 [#i2b73f37]
 +#ref(SoundMeter_p6.png)
 +以下はFDIII-HCのプッシュボタンの状態を取得する関数です。
 + bool fd_GetPB (void);
 +
 +''戻り値''はプッシュボタンの状態です。ボタンが押されているとtrueを返し、押されていないとfalseを返します。
 +''引数''はありません。
 +
 +uint8_t ReadData;の後ろに
 + bool PB;
 +と入力します。
 +プッシュボタンの状態を保存するための変数です。
 +boolは、true又はfalseで表されるデータの型です。
 +
 +fd_DXWriteWordData (1, 30, ReadData * 3); の後ろに
 + PB = fd_GetPB();
 +と入力します。変数PBにプッシュボタンの状態が代入されます(true:押されている、false:押されていない)。
 +
 +***プッシュボタンが押されたら [#z76b3e95]
 +#ref(SoundMeter_p7.png)
 +プッシュボタンが押されたら音量最大保持値をリセットします。前項より「プッシュボタンが押されたら」は、もし変数PBがtrueならと言い代えられます。
 +もし~なら~という条件分岐には、if分を使います。
 +
 +PB = fd_GetPB();の後ろに
 + if(PB == true){
 + 
 + }
 +と入力します。PB=trueではなくPB==trueです。「=」だとPBにtrueが代入されてしまうだけで、ifの条件にはなりません。
 +変数PBがtrueなら、つまりプッシュボタンが押されたらifの後の{ }内を実行します。
 +
 +***音量最大保持値をリセットする。 [#xd0d0980]
 +#ref(SoundMeter_p8.png)
 +fd_DXWriteByteData関数でAX-S1の音量最大保持値(アドレス36)に0を書き込みます。
 +if(PB == true){の後に
 + fd_DXWriteByteData (100, 36, 0);
 +と入力します。
 +第1引数のIDは100、第2引数のアドレスは36、第3引数の書き込む値は0です。
 +
 +**動作確認 [#f2fe98cd]
 + #include <fd.h>
 + #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}
 + 
 + void main (void) {
 +   uint8_t ReadData;
 +   bool PB;
 + 
 +   fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);
 +   fd_DXWriteWordData (1, 34, 200);
 + 
 +   while (1) {
 +     fd_DXReadByteData (100, 36, &ReadData);
 +     fd_printf ("%3d\r", ReadData);
 +     fd_DXWriteWordData (1, 30, ReadData * 3);
 +     PB = fd_GetPB();
 +     if(PB == true){
 +       fd_DXWriteByteData (100, 36, 0);
 +     }
 +     KEY_QUIT;
 +   }
 + }
 +
 +プログラムが完成しました。プログラムを書き込んで動かしてみましょう。
 +
 +FDIII-HCのプッシュボタンを押しリセットしてから、音を出すとAX-12+が音量に応じて動くことを確認しましょう。
 +
 +#ref(SoundMeter_p9.png)
 +
 +[[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter4.4]]~
 +
 +[[FDIII-HC Starter Kit Guide]]へ戻る


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