[[FDIII-HC Starter Kit Guid]]へ戻る *プログラミング [#kb82317e] #ref(Warning_1.png,100%) 「AX-S1の距離センサに泥棒が反応したら、AX-S1のブザーを鳴らして脅かす」というプログラムを作成します。~ プログラムと言うと難しそうだと思う方もいるかもしれません。しかし本キットは予め用意されたFREEDOMライブラリを使うことでこのプログラムを16行で書くことができます。~ FREEDOMライブラリとは、FDIII-HCのための関数を集めたものです。FDIII-HCを使うに当たって必要だと思われるプログラムが予め用意され、ユーザーはその関数名を書くだけで簡単にプログラミングが可能になります。 **フローチャートを書く [#o0aebfe7] プログラミングを始める前にフローチャートを書きましょう。フローチャートとは作業の流れを図にしたものです。フローチャートには正しい書き方がありますが、今は気にせず自分が分かるように書いて下さい。 #ref(Warning_p1.png,100%) 上図はフローチャートの例です。スタートから始まり先ず距離センサの値を見ます。距離センサの値が泥棒が来たと判断される値と比較し、それ以上ならブザーをならし、それ以下なら何もしません。その後再び距離センサの値取得に戻ります。~ 今後このフローチャートを元にプログラミングを行います。悩んだらこの図を見返しましょう。 **準備 [#v67b2c81] ソフトウェアのインストールは終わっていますか?まだの方は[[ソフトウェアの準備>FDIII-HC Starter Kit Guid Chapter1.2]]の章を見て下さい。~ #ref(write1.png,100%) デスクトップのGCC Developer LiteのショートカットをダブルクリックしてGCC Developer Liteを起動します。 **FREEDOMライブラリを使えるようにする [#ke15e8c6] #ref(Warning_p2.png,100%) 既に説明した通り、FREEDOMライブラリには便利な関数が用意されています。この関数を使用できるようにするために先ず最初に #include <fd.h> と入力して下さい。 ---- #ref(Warning_p3.png,100%) fd.hというファイルの中に関数が定義されています。~ #include <fd.h>と入力した行の上でCtrlボタンを押しながらダブルクリックするとfd.hを開くことができますので見てみましょう。 **メイン関数 [#c9fdea2a] #ref(Warning_p4.png,100%) メイン関数はその名の通り主となる関数です。プログラムはメイン関数内の最初から実行して行きます。見やすくするために一行開けて void main (void) { } と入力して下さい。 void main (void)の後ろの { から } の間にメイン関数の中身を書いて行きます。 **変数宣言 [#k1355d19] #ref(Warning_p5.png,100%) これから距離センサの値を読み込むプログラムを書くのですが、読み込んだ値を保存しておく所が必要になります。保存する場所として変数を使います。メイン関数の中の一行目に uint8_t ReadData; と入力して下さい。関数の中ではTabキーを使ってインデントを付けます(詳しくはこちらを参照して下さい。~ ReadDataは変数の名前です。~ uint8_tは変数の型です(型について詳しくはこちらを参照して下さい)。 これはC言語において通常使う型ではありません。距離センサ値などのFREEDOMライブラリで扱う値が、符号の無い8ビット単位であることを意味してFREEDOMライブラリではこのように書きます。通常のC言語で書くとunsigned charです。 **FREEDOMライブラリ初期化 [#b75be71e] #ref(Warning_p6.png,100%) FREEDOMライブラリを使用するためには必ずメイン関数の初めに初期化をしなければなりません。 変数宣言の後、一行開けて fd_Init (0, BT_CONSOLE, 0, 7.4); と入力して下さい。~ これはFREEDOMライブラリの初期化を行うための関数です(関数について詳しくはこちらをご覧下さい)。~ #ref(Warning_p7.png,100%) 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-HDのブザーの設定です(AX-S1のブザーではありません)。今は使用しないので0と書きます。~ ''第4引数''はブザーがなる供給電圧の閾値です。バッテリを使用する場合に、残量が少ない事を知らせます。ここでは7.4と書いて供給電圧が7.4Vを切るとブザーがなるように設定しましょう。 **距離センサ値の取得 [#se3a7020] #ref(Warning_p8.png,100%) 初期化まで終わると準備は整いました。フローチャートの通り初めに距離センサの値を取得します。初期化の後、一行開けて fd_DXReadByteData (100, 27, &ReadData); と入力して下さい。 これはAX-S1やAX-12+から1バイト(8ビット)のデータを読み出すための関数です。 #ref(Warning_p9.png,100%) fd_DXReadByteDataは関数名です。~ ''第1引数''は、DynamixelのIDです(IDについて詳しくはこちらを参照して下さい)。AX-S1のIDは100です。~ ''第2引数''は、AX-S1のコントロールテーブルのアドレスです。AX-S1コントロールマップを見て下さい。AX-S1の前方の距離センサ値のアドレスは27です。 ''第3引数''は、読み出したデータを入れるための変数のアドレスです(アドレスについて詳しくはこちらを参照して下さい)。変数の頭に&をつけるとその変数のアドレスという意味になります。 **センサ値の表示 [#lf648b8e] 次にフローチャートでは取得したセンサの値とある閾値を比較するとなっていますが、そもそもセンサの値がどのような数値なのか分からない事には、閾値を決める事ができません。よって取得したセンサの値を表示します。 #ref(Warning_p10.png,100%) 距離センサを取得した関数の後に fd_printf("%3d\r", ReadData); と入力して下さい。 fd_printfはパソコンに文字列を表示するための関数です(fd_printfの書き方の詳細はこちらを参照して下さい)。~ %3dの部分にReadDataの値が3桁で表示されます。\rは行を進めずに改行です。 *** 繰り返し[#te218ffe] #ref(Warning_p10.png,100%) このままでは一回センサの値を取得、表示するとプログラムが終わってしまいます。センサ値取得と表示の部分をwhileで囲って繰り返し実行するようにします(while関数の詳細はこちらを参照して下さい)。 while (1) { fd_DXReadByteData (100, 27, &ReadData); fd_printf("%3d\r", ReadData); }
(This host) = http://www.besttechnology.co.jp