Chapter2.3 プログラミング①で赤外線反射センサの値を表示するところまでプログラムを書きました。 いよいよブザーを鳴らして完成させます。
処理の流れ[3]を描いた図を見て下さい。次はセンサ値とある閾値を比較するというところです。センサ値の範囲は0~255である事を確認しました。閾値は例として100にします。後で必要に応じて調節して下さい。
もしセンサ値が100以下なら何もしない、100より大きければブザーを鳴らすという条件分岐です。条件分岐はif文[4]を使います。
センサ値表示の後ろに
if(ReadData > 100) { }
と入力して下さい。
もしReadDataが100より大きければ{ }内を実行するという意味になります。
{ }内にブザーを鳴らすプログラムを書きます。
AX-S1のブザーを鳴らします。ブザーはAX-S1に音階と音の長さを指定することで鳴ります。if関数の{ }内に
fd_DXWriteByteData (100, 40, 10); fd_DXWriteByteData (100, 41, 10);
と入力して下さい。1行目は音階、2行目は音の長さを指定します。
fd_DXWriteByteDataはAX-S1やAX-12+に1バイトのデータを書き込むための関数です。
fd_DXWriteByteDataは関数名です
第1引数は、DynamixelのIDです。AX-S1のIDは100です。
第2引数は、AX-S1コントロールテーブル[6]のアドレスです。アドレス40は音階、アドレス41は音の長さです。
第3引数は、書き込む値です。ここでは例としてそれぞれ10を入力しました。ソの音を1秒(10×0.1秒)鳴らすことになります。
AX-S1のアドレス40はブザーの音階です。詳細はAX-S1コントロールテーブルのBuzzer Data 0[7]を参照して下さい。
AX-S1のアドレス41はブザーの音の長さです。0.1秒単位で音の長さを調節します。詳細はAX-S1コントロールテーブルのBuzzer Data 1[8]を参照して下さい。
#include <fd.h> void main (void) { uint8_t ReadData; fd_Init (0, BT_CONSOLE, 0, 7.4); while (1) { fd_DXReadByteData (100, 27, &ReadData); fd_printf("%3d\r", ReadData); if(ReadData > 100) { fd_DXWriteByteData (100, 40, 10); fd_DXWriteByteData (100, 41, 10); } } }
プログラムが完成しました。空行を含めてもたったの16行です。如何ですか?
意外と簡単だと感じられたでしょうか?
それではプログラムを書き込んで動かしてみましょう。
ここでは書き込み方法を簡単に説明します。詳細はChapter1.3の動作確認[10]を参照して下さい。
--< FDIII Ver1.0 by BestTechnology >--
AX-S1の前方センサに手を近づけて行き、センサ値が100を超えるとブザーが鳴るはずです。
これを泥棒が入ってきそうな場所に設置しておけば、泥棒が来てもビックリして帰って行くかもしれません。
(This host) = https://www.besttechnology.co.jp