「AX-S1の赤外線反射センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作成します。
プログラムと言うと難しそうだと感じる方もいるかもしれません。しかし本キットは予め用意されたFREEDOMライブラリを使うことで、このプログラムを16行で書くことができます。
FREEDOMライブラリとは、FDIII-HCのための関数[2]を集めたものです。FDIII-HCを使うに当たって必要だと思われるプログラムが予め用意され、ユーザーはその関数名を書くだけで簡単にプログラミングが可能になります。
プログラミングを始める前に処理の流れを図にしましょう。
スタートから始まり、先ず赤外線反射センサの値を見ます。赤外線反射センサの値をある値(泥棒が来たと判断される値)と比較し、それ以上ならブザーをならし、それ以下ならブザーは鳴りません。その後、再び赤外線反射センサの値取得に戻ります。
今後この図を元にプログラミングを行います。悩んだら見返しましょう。
ソフトウェアのインストールは終わっていますか?まだの方はChapter1.2のソフトウェアの準備[5]を見て下さい。
デスクトップのGCC Developer LiteのショートカットをダブルクリックしてGCC Developer Liteを起動します。
GCC Developer Liteの青いエリアにプログラムを書いて行きます。プログラムは半角英数で入力します。大文字と小文字を区別して下さい。
最初から[EOF]と書いてありますが、これはファイルの終わりを示すものですので気にせず入力して下さい。
既に説明した通り、FREEDOMライブラリには便利な関数が用意されています。この関数を使用できるようにするために先ず最初に
#include <fd.h>
と入力して下さい。
fd.hという名前のファイルの中に色々な関数が書かれています。
#include <fd.h>と入力した行の上でCtrlボタンを押しながらダブルクリックするとfd.hを開くことができます。
まだfd.hの中身を理解する必要はありません。fd.hのウィンドウ右上の×ボタン(GCC Developer Liteウィンドウの×ボタンではありません)で閉じます。
メイン関数はその名の通り主となる関数です。プログラムはメイン関数内の上から順に実行して行きます。見やすくするために一行開けて
void main (void) { }
と入力して下さい。 void main (void)の後ろの{から}の間にメイン関数の中身を書いて行きます。
これから赤外線反射センサの値を読み込むプログラムを書くのですが、読み込んだ値を保存しておく場所が必要になります。保存する場所として変数[9]を使います。
メイン関数のvoid main (void)の次にある空の行にカーソルを移動します。メイン関数内であることがわかりやすいようにTabキーを使ってインデントでスペースを空けてから
uint8_t ReadData;
と入力して下さい(プログラムの書き方についてはChapter1.4のプログラムの書き方[10]を参照して下さい)。
ReadDataは変数の名前です。
uint8_tは変数の型[11]ですです。
これはC言語において通常使う型ではありません。赤外線反射センサ値などのFREEDOMライブラリで扱う値が、符号の無い8ビット(1バイト)単位であることを意味してFREEDOMライブラリではこのように書きます。通常のC言語で書くとunsigned charです。
FREEDOMライブラリを使用するためには必ずメイン関数の初めに初期化をしなければなりません。 変数宣言の後、一行開けて
fd_Init (0, BT_CONSOLE, 0, 7.4);
と入力して下さい。
これはFREEDOMライブラリの初期化を行うための関数[2]です。
fd_Initは関数名です。
第1引数は、PCとの通信速度です。通常USBやBluetoothを使う場合は関係ありませんので0と書きます。
第2引数は、Bluetoothの通信方法です。BT_DISABLE(Bluetoothを使用しない)、BT_CONSOLE(パソコンと通信)、BT_RC100(別売りリモートコントローラRC-100と通信)から選択します。BT_CONSOLEに設定してもUSB通信を利用できますのでとりあえずBT_CONSOLEと書きます。
第3引数は、FDIII-HCのブザーを鳴らす[13]です(AX-S1のブザーではありません)。今は使用しないので0と書きます。
第4引数はブザーがなる供給電圧の閾値です。バッテリを使用する場合に、残量が少ない事を知らせます。ここでは7.4と書いて供給電圧が7.4Vを切るとブザーがなるように設定します。但し、第3引数のブザーの設定をしていないので今はブザーは鳴りません。
初期化まで終われば準備は整いました。処理の流れを描いた図の通り、初めに赤外線反射センサの値を取得します。初期化の後、一行開けて
fd_DXReadByteData (100, 27, &ReadData);
と入力して下さい。 これはAX-S1やAX-12+から1バイト[15](8ビット[15])のデータを読み出すための関数です。
fd_DXReadByteDataは関数名です。
第1引数は、DynamixelのID[16]です。AX-S1のIDは100です。
第2引数は、AX-S1コントロールテーブル[17]のアドレスです。AX-S1の前方の赤外線反射センサ値のアドレスは27です。
第3引数は、読み出したデータを入れるための変数のアドレス[18]です。変数の頭に&をつけるとその変数のアドレスという意味になります。AX-S1のコントロールテーブルのアドレスとは関係ありません。
次に処理の流れを描いた図では取得したセンサの値とある閾値を比較するとなっていますが、そもそもセンサの値がどのような数値なのか分からないことには、閾値を決める事ができません。よって先ず取得したセンサの値を表示します。
赤外線反射センサを取得した関数の後に
fd_printf("%3d\r", ReadData);
と入力して下さい。
fd_printf[20]はパソコンに文字列を表示するための関数です。
%3dの部分にReadDataの値が3桁で表示されます。
このままでは一回センサの値を取得して表示するとプログラムが終わってしまいます。センサ値取得と表示の部分をwhile[22]で囲って繰り返し実行するようにします。
while (1) { fd_DXReadByteData (100, 27, &ReadData); fd_printf("%3d\r", ReadData); }
whileで囲ったらその間の行はTabキーで字下げしましょう。 whileは()内の条件がtrue(正)なら{}内を繰り返す関数です。true=1ですのでここでは{}内を無限に繰り返すという意味になります。
ここまで書くと既に動くプログラムができ上がっています。FDIII-HCにプログラムを書き込んで実際に動かしてみましょう。
ここでは書き込み方法を簡単に説明します。詳細はChapter1.3の動作確認[24]を参照して下さい。
--< FDIII Ver1.0 by BestTechnology >--
SIMPLE TERM上の最終行に数字が表示されているはずです。AX-S1の正面のセンサに手をかざし、数値が変動することを確認して下さい。
値はセンサの前に何もないと0、手を近づけて行くとだんだん増え、255まで増えるとそれ以上は増えなくなります。つまり値の範囲は0~255です。
プログラムの書式に間違いがあると、コンパイルを行ったときにコンパイラログ(プログラムを入力する青いエリアの下)の最後に赤くコンパイル<失敗>と表示されます。
;や{が1つ足りないだけでもコンパイルに失敗します。入力ミスが無いかもう一度良く確認して下さい。
コンパイラログにピンク色で間違っている個所が表示されます。英語で書かれていますので、解らない場合はその行をダブルクリックすると間違っている個所にカーソルが移動します。
但し必ずしもその行内に間違いがある訳ではなく、その行に関係した箇所に間違いがあると考えて下さい。
どうしても間違いが見つからない場合は以下をコピーして貼り付けて下さい。
#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); } }
それでもコンパイルに成功しない場合は、左下に「FREEDOM III library for FDIII-HC」又は「FREEDOM III library for FDIII-HC(Bootloader)」と表示されているかを確認して下さい。
表示されていない場合は、メニューの「ツール」→「コンパイルオプション」で「FREEDOM III library for FDIII-HC」又は「FREEDOM III library for FDIII-HC(Bootloader)」を選択しOKをクリックします。
(This host) = http://www.besttechnology.co.jp