GCC Developer Liteを起動して、Chapter3で作成したプログラムを開いて下さい。
メニューの「ファイル」→「開く」→ ファイル(AutomaticBar.c)を選択し、「開く」をクリックします。
ファイルを別の名前で保存します。
メニューの「ファイル」→「名前を付けて保存」→ファイル名に「SoundMeter.c」と入力して「保存」します。
バーの開閉部分を削除し、正面赤外線センサの値の取得を音量最大値の取得へ変更します。
#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); } }
#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の音量測定値の最大値を保持し続けます。
#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に入っている値です。
#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になります。
音量最大保持値は、音量の最大値を保持し続けます。従って一度値が最大の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を書込むことで実施します。