「AX-S1の赤外線反射センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作成します。
プログラムと言うと難しそうだと感じる方もいるかもしれません。しかし本キットは予め用意されたFREEDOMライブラリを使うことで、このプログラムを16行で書くことができます。
FREEDOMライブラリとは、FDIII-HCのための関数を集めたものです。FDIII-HCを使うに当たって必要だと思われるプログラムが予め用意され、ユーザーはその関数名を書くだけで簡単にプログラミングが可能になります。
プログラミングを始める前に処理の流れを図にしましょう。
スタートから始まり、先ず赤外線反射センサの値を見ます。赤外線反射センサの値をある値(泥棒が来たと判断される値)と比較し、それ以上ならブザーをならし、それ以下ならブザーは鳴りません。その後、再び赤外線反射センサの値取得に戻ります。
今後この図を元にプログラミングを行います。悩んだら見返しましょう。
ソフトウェアのインストールは終わっていますか?まだの方はChapter1.2のソフトウェアの準備を見て下さい。
デスクトップのGCC Developer LiteのショートカットをダブルクリックしてGCC Developer Liteを起動します。
GCC Developer Liteの青いエリアにプログラムを書いて行きます。プログラムは半角英数で入力します。大文字と小文字を区別して下さい。
最初から[EOF]と書いてありますが、これはファイルの終わりを示すものですので気にせず入力して下さい。
既に説明した通り、FREEDOMライブラリには便利な関数が用意されています。この関数を使用できるようにするために先ず最初にfd.hをインクルードします。
fd.hという名前のファイルの中に色々な関数が書かれています。
#include <fd.h>と入力した行の上でCtrlボタンを押しながらダブルクリックするとfd.hを開くことができます。
まだfd.hの中身を理解する必要はありません。fd.hのウィンドウ右上の×ボタン(GCC Developer Liteウィンドウの×ボタンではありません)で閉じます。
これから赤外線反射センサの値を読み込むプログラムを書くのですが、読み込んだ値を保存しておく場所が必要になります。保存する場所として変数を使います。
メイン関数のvoid main (void)の次にある空の行にカーソルを移動します。メイン関数内であることがわかりやすいようにTabキーを使ってインデントでスペースを空けてから入力して下さい(プログラムの書き方についてはChapter1.4のプログラムの書き方を参照して下さい)。
ReadDataは変数の名前です。
uint8_tは変数の型です。赤外線反射センサ値などのFREEDOMライブラリで扱う値が、符号の無い8ビット(1バイト)単位であることを意味しています。unsigned charと同義です。
警告音として、ビープ音を鳴らすための条件を設定します。但し、ビープ音を鳴らす必要がなければ本関数は省略しても問題ありません。
パラメータ | ビープ音発生条件 |
FD_BEEP_BOOTUP | 起動直後 |
FD_BEEP_LOWVOLTAGE | 低電圧検出時 |
FD_BEEP_PACKETERR | パケットエラーないしアラーム発生時 |
FD_BEEP_MMI | ディップスイッチ/プッシュボタン操作時 |
FDIII-HCの電源電圧低下を検出する閾値を設定します。fd_SetBeepCondition関数でFD_BEEP_LOWVOLTAGEを指定してされている場合、ビープ音が鳴ります。
Dynamixel製品との通信速度(ボーレート)を変更します。ライブラリ内で静的に1M(1000000)で初期化されていますが、Dynamixel製品の通信速度が変更されている場合はプログラム側で同じ通信速度に変更する必要があります。
Dynamixel製品が125k[bps]の場合、プログラムで125k[bps]の設定を行う例
#include <fd.h> void main (void) { DX_ChangeBaudrate (125000); }
Dynamixel製品より1バイトのデータを直接取得する関数です。
第1引数は、DynamixelのIDです。AX-S1のIDは100です。
第2引数は、AX-S1コントロールテーブルのメモリマップアドレスです。AX-S1の正面の赤外線反射センサ値のメモリマップアドレスは27です。
第3引数は、読み出したデータを入れるための変数のアドレスです。変数の頭に&をつけるとその変数のアドレスという意味になります。AX-S1のコントロールテーブルのメモリマップアドレスとは関係ありません。
第4引数は、タイムアウト時間(ms)です。ここではタイムアウト時間を10msに設定しています。タイムアウトが頻発して正しくデータが取得できない場合はタイムアウト時間を延長して下さい。
第5引数には本来、エラーの戻り値を入れるための変数のアドレスを指定しますが、今回はエラーの内容を見ないため、NULLを指定しています。
次に処理の流れを描いた図では取得したセンサの値とある閾値を比較するとなっていますが、そもそもセンサの値がどのような数値なのか分からないことには、閾値を決める事ができません。よって先ず取得したセンサの値を表示します。
パソコンに文字列を表示するための関数です。
第1引数は、出力する書式です。%3dは3桁の数字を出力します。\nは改行を表します。
第2引数は、書式で指定した型(%3d)で出力する変数を指定します。
書式内に複数の型指定がある場合は、引数を追加します。
例)書式内に文字列と数字を指定(第3引数まで使用)
#include <fd.h> void main (void) { char *msg = "OK"; int i = 10; fd_printf ("%s %d\n", msg, i); }
このままでは一回センサの値を取得して表示するとプログラムが終わってしまいます。センサ値取得と表示の部分をwhileで囲って繰り返し実行するようにします。
whileで囲ったらその間の行はTabキーで字下げしましょう。
whileは()内の条件が成立(true)していれば{}内を繰り返す関数です。ここでは{}内を無限に繰り返すという意味になります。
指定時間(ms)の間、処理を停止します。
第1引数は、処理の停止時間(ms)です。ms(ミリ秒)とは1000分の1秒のことで、1秒=1000ミリ秒となります。ここでは10ms停止しますので、0.01秒の停止となります。
whileを使用する際は必ずfd_Waitを使用します。fd_Waitを使用しない場合、システム側の監視機能が働いてプログラムが強制終了する可能性があります。
既に動くプログラムとなっていますので、FDIII-HCにプログラムを書き込んで実際に動かしてみましょう。
ここでは書き込み方法を簡単に説明します。詳細はChapter1.3の動作確認を参照して下さい。
SIMPLE TERM上の最終行に数字が表示されているはずです。AX-S1の正面のセンサに手をかざし、数値が変動することを確認して下さい。
値はセンサの前に何もないと0、手を近づけて行くとだんだん増え、255まで増えるとそれ以上は増えなくなります。つまり値の範囲は0~255です。