処理の流れを描いた図を見て下さい。次はセンサ値とある閾値を比較するというところです。センサ値の範囲は0~255である事を確認しました。閾値は例として100にします。後で必要に応じて調節して下さい。
#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); while (true) { DX_ReadByteData (100, 27, &ReadData, 10, NULL); fd_printf ("%3d\r", ReadData); if (ReadData > 100) { } fd_Wait (10); } }
もしセンサ値が100より大きければ{ }内を実行するという条件分岐です。条件分岐はif文を使います。
今回は{ }内にブザーを鳴らすプログラムを書きます。
#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); while (true) { DX_ReadByteData (100, 27, &ReadData, 10, NULL); fd_printf ("%3d\r", ReadData); if (ReadData > 100) { DX_WriteByteData (100, 40, 10, 10, NULL); DX_WriteByteData (100, 41, 10, 10, NULL); } fd_Wait (10); } }
AX-S1のブザーを鳴らす為、音階と音の長さを指定しています。
Dynamixel製品へ1バイトの値を直接設定します。
第1引数は、DynamixelのIDです。AX-S1のIDは100です。
第2引数は、AX-S1コントロールテーブルのアドレスです。アドレス40は音階、アドレス41は音の長さです。
第3引数は、書き込む値です。ここでは例としてそれぞれ10を入力しました。ソの音を1秒(10×0.1秒)鳴らすことになります。
第4引数は、タイムアウト時間(ms)です。ここではタイムアウト時間を10msに設定しています。タイムアウトが頻発して正しくデータが設定できない場合はタイムアウト時間を延長して下さい。
第5引数には本来、エラーの戻り値を入れるための変数のアドレスを指定しますが、今回はエラーの内容を見ないため、NULLを指定しています。
AX-S1のアドレス40はブザーの音階です。詳細はAX-S1コントロールテーブルのBuzzer Data 0を参照して下さい。
AX-S1のアドレス41はブザーの音の長さです。0.1秒単位で音の長さを調節します。詳細はAX-S1コントロールテーブルのBuzzer Data 1を参照して下さい。
プログラムが完成しました。空行を含めてもたったの18行です。如何ですか?
意外と簡単だと感じられたでしょうか?
それではプログラムを書き込んで動かしてみましょう。
ここでは書き込み方法を簡単に説明します。詳細はChapter1.3の動作確認を参照して下さい。
AX-S1の前方センサに手を近づけて行き、センサ値が100を超えるとブザーが鳴るはずです。
これを泥棒が入ってきそうな場所に設置しておけば、泥棒が来てもビックリして帰って行くかもしれません。