Page Top

処理の流れを図にする。 anchor.png

先ず処理の流れを図にします。

flow.png

AX-S1の最大音量を取得し、それに対応した角度へAX-12Aのホーンを動かすを繰り返すだけとなります。

Page Top

準備 anchor.png

GCC Developer Liteを起動して、Chapter3で作成したプログラムを開いて下さい。

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


ファイルを別の名前で保存します。

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

Page Top

バーの開閉から音量最大値の取得へ変更 anchor.png

バーの開閉部分を削除し、正面赤外線センサの値の取得を音量最大値の取得へ変更します。

#include <fd.h>
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);
  }
}
down_arrow.png
#include <fd.h>
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);
  }
}

DX_ReadByteDataの第2引数を27から36へ変更します。 AX-S1コントロールテーブルにある通り、音量最大保持値はアドレス36です。 音量最大保持値はアドレス35の音量測定値の最大値を保持し続けます。

Page Top

AX-12Aのホーンを動かす anchor.png

#include <fd.h>
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);
  }
}

AX-12Aのホーンの角度をメーターに見立て、音量最大保持値に対応した角度にホーンを動かします。

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

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

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

Page Top

ゴールポジションと音量最大保持値のデータ範囲 anchor.png

#include <fd.h>
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);
  }
}

ゴールポジションのデータの範囲は0~1023でした。 音量最大保持値のデータ範囲はどうでしょう。

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

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

Page Top

音量最大保持値のリセット anchor.png

音量最大保持値は、音量の最大値を保持し続けます。従って一度値が最大の255になると、それ以降は255から変化することはありません。もう一度初めから測定するために音量最大保持値をプッシュボタンでリセットするようにします。

#include <fd.h>
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);
  }
}

while文で使用していたプッシュボタンの条件を外し、新たにゴールポジション設定後にif文の条件として使用します。 プッシュボタンが押されたらリセットを行いますので、!(エクスクラメーションマーク)は除きます。 リセットはアドレス36(音量最大保持値)に0を書込むことで実施します。

Page Top

動作確認 anchor.png

プログラムが完成しました。プログラムを書き込んで動かしてみましょう。

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

SoundMeter_p9.png

次のチャプターへ

FDIII-HC Starter Kit Guideへ戻る


Front page   Diff ReloadPrint View   Page list Search Recent changes   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Last-modified: 2013-04-09 (Tue) 23:46:46 (JST) (2611d)