*プログラミング1 [#qe8ca20d] #ref(Warning_1.png,100%) 「AX-S1の赤外線反射センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作成します。 プログラムと言うと難しそうだと感じる方もいるかもしれません。しかし本キットは予め用意されたFREEDOMライブラリを使うことで、このプログラムを16行で書くことができます。 FREEDOMライブラリとは、FDIII-HCのための[[関数>FDIIICHAPTER1.4#p52f0f17]]を集めたものです。FDIII-HCを使うに当たって必要だと思われるプログラムが予め用意され、ユーザーはその関数名を書くだけで簡単にプログラミングが可能になります。 **処理の流れを図にする [#x60b5360] プログラミングを始める前に処理の流れを図にしましょう。 #ref(flow.png,100%) スタートから始まり、先ず赤外線反射センサの値を見ます。赤外線反射センサの値をある値(泥棒が来たと判断される値)と比較し、それ以上ならブザーをならし、それ以下ならブザーは鳴りません。その後、再び赤外線反射センサの値取得に戻ります。 今後この図を元にプログラミングを行います。悩んだら見返しましょう。 **準備 [#id067260] ソフトウェアのインストールは終わっていますか?まだの方は[[Chapter1.2のソフトウェアの準備>FDIIICHAPTER1.2]]を見て下さい。~ #ref(gcc_icon.png,100%) デスクトップのGCC Developer LiteのショートカットをダブルクリックしてGCC Developer Liteを起動します。 #ref(gcc_open.png,100%) GCC Developer Liteの青いエリアにプログラムを書いて行きます。プログラムは半角英数で入力します。大文字と小文字を区別して下さい。~ 最初から[EOF]と書いてありますが、これはファイルの終わりを示すものですので気にせず入力して下さい。 **FREEDOMライブラリを使えるようにする [#r44fc0ef] #ref(gcc_edit_1.png,100%) 既に説明した通り、FREEDOMライブラリには便利な関数が用意されています。この関数を使用できるようにするために先ず最初にfd.hをインクルードします。 ---- #ref(gcc_edit_2.png,100%) fd.hという名前のファイルの中に色々な関数が書かれています。~ #include <fd.h>と入力した行の上でCtrlボタンを押しながらダブルクリックするとfd.hを開くことができます。~ まだfd.hの中身を理解する必要はありません。fd.hのウィンドウ右上の×ボタン(GCC Developer Liteウィンドウの×ボタンではありません)で閉じます。 **メイン関数 [#dcba31ee] #ref(gcc_edit_3.png,100%) メイン関数はその名の通り主となる関数です。プログラムはメイン関数内の上から順に実行して行きます。見やすくするために一行開けてメイン関数の中身を書いて行きます。 **変数宣言 [#m4138a34] #ref(gcc_edit_4.png,100%) これから赤外線反射センサの値を読み込むプログラムを書くのですが、読み込んだ値を保存しておく場所が必要になります。保存する場所として[[変数>FDIIICHAPTER1.4#z62e3ad6]]を使います。~ メイン関数のvoid main (void)の次にある空の行にカーソルを移動します。メイン関数内であることがわかりやすいようにTabキーを使ってインデントでスペースを空けてから入力して下さい(プログラムの書き方については[[Chapter1.4のプログラムの書き方>FDIIICHAPTER1.4#s49216c9]]を参照して下さい)。 ReadDataは変数の名前です。~ uint8_tは変数の[[型>FDIIICHAPTER1.4#p7400a94]]です。赤外線反射センサ値などのFREEDOMライブラリで扱う値が、符号の無い8ビット(1バイト)単位であることを意味しています。unsigned charと同義です。 **FDIII-HCの初期化 [#l316e5db] #ref(gcc_edit_5.png,100%) FDIII-HCを使用するためにはメイン関数の初めに初期化をしなければなりません。 ***[[fd_SetBeepCondition>FDIIILIB#ke8d1df6]] [#v29dcde7] 警告音として、ビープ音を鳴らすための条件を設定します。但し、ビープ音を鳴らす必要がなければ本関数は省略しても問題ありません。 | パラメータ | ビープ音発生条件 | |FD_BEEP_BOOTUP |起動直後 | |FD_BEEP_LOWVOLTAGE |低電圧検出時 | |FD_BEEP_PACKETERR |パケットエラーないしアラーム発生時 | |FD_BEEP_MMI |ディップスイッチ/プッシュボタン操作時 | ***[[fd_SetUVThreshold>FDIIILIB#ce52eef3]] [#w641dc92] FDIII-HCの電源電圧低下を検出する閾値を設定します。fd_SetBeepCondition関数でFD_BEEP_LOWVOLTAGEを指定してされている場合、ビープ音が鳴ります。 ***[[DX_ChangeBaudrate>FDIIILIB#n66c725c]] [#m3a51f05] Dynamixel製品との通信速度(ボーレート)を変更します。ライブラリ内で静的に1M(1000000)で初期化されていますが、Dynamixel製品の通信速度が変更されている場合はプログラム側で同じ通信速度に変更する必要があります。~ Dynamixel製品が125k[bps]の場合、プログラムで125k[bps]の設定を行う例 #html{{ <pre class="brush: c"> #include <fd.h> void main (void) { DX_ChangeBaudrate (125000); } </pre> }} **赤外線反射センサの値の取得 [#wc909078] #ref(gcc_edit_6.png,100%) 初期化まで終わりましたので、[[処理の流れを描いた図>#x60b5360]]の通り、赤外線反射センサの値を取得します。~ [[DX_ReadByteData>FDIIILIB#t86b5caf]]はDynamixel製品から様々なデータを直接取得する関数です。~ ''第1引数''は、Dynamixelの[[ID>FDIIICHAPTER1.1#s7a3f1f6]]です。AX-S1のIDは100です。~ ''第2引数''は、[[AX-S1コントロールテーブル>FDIIICHAPTER1.1#ye0e23e2]]のメモリマップアドレスです。AX-S1の正面の赤外線反射センサ値のメモリマップアドレスは27です。 ''第3引数''は、読み出したデータを入れるための変数の[[アドレス>FDIIICHAPTER1.4#s0d770ec]]です。変数の頭に&をつけるとその変数のアドレスという意味になります。AX-S1のコントロールテーブルのメモリマップアドレスとは関係ありません。 ''第4引数''は、タイムアウト時間(ms)です。ここではタイムアウト時間を10msに設定しています。タイムアウトが頻発して正しくデータが取得できない場合はタイムアウト時間を延長して下さい。 ''第5引数''には本来、エラーの戻り値を入れるための変数のアドレスを指定しますが、今回はエラーの内容を見ないため、NULLを指定しています。 **センサ値の表示 [#p736b10d] 次に[[処理の流れ>#x60b5360]]を描いた図では取得したセンサの値とある閾値を比較するとなっていますが、そもそもセンサの値がどのような数値なのか分からないことには、閾値を決める事ができません。よって先ず取得したセンサの値を表示します。 #ref(gcc_edit_7.png,100%) [[fd_printf>FDIIICHAPTER1.4#k44284d5]]はパソコンに文字列を表示するための関数です。~ %3dの部分にReadDataの値が3桁で表示されます。 ** 繰り返し [#l145a3e5] #ref(gcc_edit_8.png,100%) このままでは一回センサの値を取得して表示するとプログラムが終わってしまいます。センサ値取得と表示の部分を[[while>FDIIICHAPTER1.4#o8733fa9]]で囲って繰り返し実行するようにします。~ whileで囲ったらその間の行はTabキーで字下げしましょう。~ whileは()内の条件が成立(true)していれば{}内を繰り返す関数です。ここでは{}内を無限に繰り返すという意味になります。 [[fd_Wait>FDIIILIB#o4813042]]は指定時間(ms)の間、処理を停止する関数です。 ''第1引数''は、処理の停止時間(ms)です。ms(ミリ秒)とは1000分の1秒のことで、1秒=1000ミリ秒となります。ここでは10ms停止しますので、0.01秒の停止となります。 whileを使用する際は必ずfd_Waitを使用します。fd_Waitを使用しない場合、システム側の監視機能が働いてプログラムが強制終了する可能性があります。 **プログラムを実行する [#vb9c5600] 既に動くプログラムとなっていますので、FDIII-HCにプログラムを書き込んで実際に動かしてみましょう。~ ここでは書き込み方法を簡単に説明します。詳細は[[Chapter1.3の動作確認>FDIIICHAPTER1.3]]を参照して下さい。~ -機器の接続は[[Chapter2.2の組み立て>FDIIICHAPTER2.2]]を参照して下さい。~ FDIII-HCの電源をOFFにし、プッシュボタンを押しながらUSBケーブルを差し込む事を忘れないで下さい。 -メニューの「ツール」→「コンパイルオプション」で「FREEDOM III library for FDIII-HC」を選択しOKをクリックします。~ 但し既に一度サンプルプログラムを書き込んでおり、ステータスバーに「FREEDOM III library for FDIII-HC」と表示されている場合は必要ありません。 #ref(gcc_statusbar.png,100%) -メニューの「コンパイル」→「ビルド」をクリックします。ファイルを保存するダイアログが表示されますので、[[サンプルプログラム>FDIIICHAPTER1.3#r86cf508]]と同じフォルダにAlarmUnit.cとして保存しましょう。 #ref(gcc_save_dialog.png,100%) -コンパイルが成功したらOKをクリックします。自動的にSIMPLE TERMが起動します。 -SIMPLE TERMのメニューの「ファイル」→「プロパティ」をクリックし適切な設定を行います。~ 詳しくは[[こちら>FDIIICHAPTER1.3#a3b0dd1e]]をご覧下さい。 既に設定を行っている場合は必要ありません。 -SIMPLE TERMのメニューの「通信」→「ポートオープン」をクリックします。 -[[プログラムの転送>FDIIICHAPTER1.3#aaed87f4]]を行います。 -<SUCCESS>と表示されたらキーボードで「g」を入力しプログラムを実行します。 -FDIII-HCの電源スイッチをONにします。このとき電源が供給されるとAX-S1のブザーが「ピッ」と鳴ります。 ---- SIMPLE TERM上の最終行に数字が表示されているはずです。AX-S1の正面のセンサに手をかざし、数値が変動することを確認して下さい。 #ref(Warning_p13.png,100%) #ref(simple_term_exec.png,100%) 値はセンサの前に何もないと0、手を近づけて行くとだんだん増え、255まで増えるとそれ以上は増えなくなります。つまり値の範囲は0~255です。 [[次のチャプター>FDIIICHAPTER2.4]]へ~ [[FDIII-HC Learning Guide>FDIII-HC Learning Guide]]へ戻る
(This host) = https://www.besttechnology.co.jp