ページへ戻る

− Links

 印刷 

FDIII-HC Starter Kit Guide​/Chapter4.3 のバックアップソース(No.6) :: Besttechnology

knowledge:FDIII-HC Starter Kit Guide/Chapter4.3 のバックアップソース(No.6)

« Prev[4]  Next »[5]
TITLE:騒音計のプログラミング
*プログラミング [#c7bb54c8]
#ref(SoundMeter_1.png)
「AX-S1で最大音量を測定し、それに対応した角度へAX-12+のホーンを動かす」というプログラムを作成します。

**処理の流れを図にする。 [#fac5abab]
先ず処理の流れを図にします。
#ref(flow.png)
AX-S1の最大音量を取得し、それに対応した角度へAX-12+のホーンを動かすを繰り返すだけとなります。

**準備 [#m074851f]
GCC Developer Liteを起動して、Chapter3で作成したプログラムを開いて下さい。

メニューの「ファイル」→「開く」→ ファイル(AutomaticBar.c)を選択し、「開く」をクリックします。
----
ファイルを別の名前で保存します。

メニューの「ファイル」→「名前を付けて保存」→ファイル名に「SoundMeter.c」と入力して「保存」します。

**バーの開閉から音量最大値の取得へ変更 [#tfcaa108]
バーの開閉部分を削除し、正面赤外線センサの値の取得を音量最大値の取得へ変更します。
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
void main (void) {
  uint8_t ReadData;

  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);

  while (!fd_rx_buff () && !fd_GetPB ()) {
    DX_ReadByteData (100, 27, &ReadData, 10, NULL);
    fd_printf ("%3d\r", ReadData);
    if (ReadData > 100) {
      fd_DXSetPosition (1, 300);
      fd_Wait (2000);
    } else {
      fd_DXSetPosition (1, 512);
    }
    fd_Wait (10);
  }
}
</pre>
}}
#ref(down_arrow.png)
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
void main (void) {
  uint8_t ReadData;

  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);

  while (!fd_rx_buff () && !fd_GetPB ()) {
    DX_ReadByteData (100, 36, &ReadData, 10, NULL);
    fd_printf ("%3d\r", ReadData);
    fd_Wait (10);
  }
}
</pre>
}}
DX_ReadByteDataの第2引数を27から36へ変更します。
[[AX-S1コントロールテーブル>FDIIICHAPTER1.1#ye0e23e2]]にある通り、音量最大保持値はアドレス36です。
音量最大保持値はアドレス35の音量測定値の最大値を保持し続けます。

**AX-12+のホーンを動かす [#r33f5d9f]
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
void main (void) {
  uint8_t ReadData;

  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);

  while (!fd_rx_buff () && !fd_GetPB ()) {
    DX_ReadByteData (100, 36, &ReadData, 10, NULL);
    fd_printf ("%3d\r", ReadData);
    fd_DXSetPosition (1, ReadData);
    fd_Wait (10);
  }
}
</pre>
}}
AX-12+のホーンの角度をメーターに見立て、音量最大保持値に対応した角度にホーンを動かします。

AX-12+のホーンを動かすには、fd_DXSetPosition関数を使います。詳しくは[[Chapter3.3のブザーを鳴らすからバーを開けるに変更>FDIIICHAPTER3.3#o54aa8b3]]を参照して下さい。

音量最大保持値に対応した角度にAX-12+のホーンを動かしますので、ゴールポジション=音量最大保持値です。~
音量最大保持値は変数ReadDataに代入されますので、そのままゴールポジションにReadDataを指定します。

ReadDataの前に&は付けません。変数の前に&を付けるとその変数のアドレスになります。
ゴールポジションに書き込むのは、ReadDataのアドレスではなく、ReadDataに入っている値です。

**ゴールポジションと音量最大保持値のデータ範囲 [#ke591b16]
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
void main (void) {
  uint8_t ReadData;

  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);

  while (!fd_rx_buff () && !fd_GetPB ()) {
    DX_ReadByteData (100, 36, &ReadData, 10, NULL);
    fd_printf ("%3d\r", ReadData);
    fd_DXSetPosition (1, ReadData * 3);
    fd_Wait (10);
  }
}
</pre>
}}
ゴールポジションのデータの範囲は0~1023でした。
音量最大保持値のデータ範囲はどうでしょう。

音量センサの値は[[Chapter2.5の課題>FDIIICHAPTER2.5]]で紹介した通り、128を中心に音がすると音量に応じて上下に揺れます。
音量最大保持値は音量センサの最大値を保持した値なので、音量最大保持値の範囲は128~255となります。

ゴールポジションはせっかく0~1023の範囲があるので、音量最大保持値を3倍した値を代入することで、コールポジションの範囲を384~765にします。~
つまり音量最大保持値が128のときゴールポジションは384、200のとき600、255のとき765になります。

**音量最大保持値のリセット [#ie242320]
音量最大保持値は、音量の最大値を保持し続けます。従って一度値が最大の255になると、それ以降は255から変化することはありません。もう一度初めから測定するために音量最大保持値をプッシュボタンでリセットするようにします。
#html{{
<pre class="brush:c">
#include &lt;fd.h&gt;
void main (void) {
  uint8_t ReadData;

  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);

  while (!fd_rx_buff ()) {
    DX_ReadByteData (100, 36, &ReadData, 10, NULL);
    fd_printf ("%3d\r", ReadData);
    fd_DXSetPosition (1, ReadData);
    if (fd_GetPB ()) {
      DX_WriteByteData (100, 36, 0, 10, NULL);
    }
    fd_Wait (10);
  }
}
</pre>
}}
while文で使用していたプッシュボタンの条件を外し、新たにゴールポジション設定後にif文の条件として使用します。
プッシュボタンが押されたらリセットを行いますので、!(エクスクラメーションマーク)は除きます。
リセットはアドレス36(音量最大保持値)に0を書込むことで実施します。

**動作確認 [#i7d7d3c6]
プログラムが完成しました。プログラムを書き込んで動かしてみましょう。

FDIII-HCのプッシュボタンを押しリセットしてから、音を出すとAX-12+が音量に応じて動くことを確認しましょう。

#ref(SoundMeter_p9.png)

[[次のチャプターへ>FDIIICHAPTER4.4]]~

[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]へ戻る


« Prev[4]  Next »[5]