#navi(NQC入門) * 2.1 最初のプログラム [#j0043f4b] 簡単な例として、左右にモータを2つ装備した車を作り、 この車を前後に動かしたり方向変換させたりするプログラムを考えましょう。 基本的には左右のモータを同じ方向に回転させると前進したり後進したりできす。 右側のモータだけを前方向に動かせば左に曲がり、 左のモータだけを前方向に動かせば右に曲がります。 また2つのモータを逆に回転させればその場で旋回して方向転換ができます。 まず普段使っているエディタで以下のような簡単なプログラムを 作成してロボットを動かしてみましょう。 /* 出力 A と C のモータを前に3秒間だけ回転させるプログラム */ task main() { OnFwd(OUT_A); // A 出力に接続されたモータを正回転させる OnFwd(OUT_C); // C 出力に接続されたモータを正回転させる Wait(300); // プログラムの実行を3秒待つ (単位は1/100秒) // この間 A と C のモータは回転したまま (現状維持) Off(OUT_A+OUT_C); // A と C 出力のモータを止める } コメント文(以下で説明)に関しては日本語でも構いませんが、 それ以外の部分は空白も含めてすべて半角の英数字や記号で書いてください。 また C言語同様、大文字と小文字は区別されますので、 違わないように注意してください。 例えば、OnFwd を Onfwd や onfwdと書くのは間違いです。 以下、上のプログラムについていくつかの説明をします。 &color(#000000,#ccccff){コメント文について}; 通常、プログラムには宣言や命令以外にプログラムの説明などを 記しておくことができます。 これらの文はコメント文と呼ばれ、コンパイル時(機械の理解できる言葉に 翻訳する際)には無視されますが、 プログラムを他人が読んでも分かりやすいように、また将来自分が どのようなプログラムを書いたか忘れてもすぐに思い出せるように、 きちんとした説明を書き止めておきましょう。 NQCの場合、コメント文の書き方は以下のように2通りあります。 1つ目は C言語と同じ /* と */ で挟む方法で、 これは複数行にまたがっても構いません。 もう一つは C++ スタイルの // を使う方法です。 その行の // 以降の部分がコメントとして扱われます。 /* これはコメント文 */ /* これも コメント文 (複数行でもかまわない) */ // これもコメント文、ただし行の終りまで ( C++ スタイル ) &color(#000000,#ccccff){空白と空行について}; NQCはC言語同様、いわゆるフリー・フォーマット(自由な書式) なのでプログラムが見やすくなるように変数や演算子などの間に 空白や空行を挿入してもかまいません。 例えば、上のプログラムは、 task main() { OnFwd(OUT_A); OnFwd(OUT_C); Wait(300); Off(OUT_A+OUT_C); } のように1行で書くこともできます。 しかし、読みやすいプログラムにするためには、 一行にたくさんの命令を書かず、また最初の例のようにプログラムの ひとつのまとまりがどこからどこまでなのかすぐにわかるように 字下げをしておくのが一般的です。 ただし、全角の空白(日本語の空白)は使えませんので注意してください。 コンパイル時(以下説明)にエラーになりますが、 どこが間違っているのかなかなか気づきません。 &color(#000000,#ccccff){task と命令について}; 一連の作業(仕事)を定義するには、task というキーワードを使います。 NQCの仕様ではひとつのプログラムに 10個までの task が許されますが、 そのうち一つは必ず main という名前でなければいけません。 そしてプログラムを実行するとこの main というtaskの最初から命令が 実行されます。 また、上で説明したように、一行に多くの命令を書いてもかまいませんが、 1つの命令の終りには必ずセミコロン「;」を書く必要が あります。 task main() { 命令1 ; 命令2 ; 命令3 ; … … } task main() { 命令1 ; 命令2 ; … start play_my_music; … stop play_my_music; } task play_my_music() { … } &color(#000000,#ccccff){RCXの出力について}; RCX にはモータを接続するための3つの出力ポート(A,B,C)が付いています。 プログラムではそれぞれ、OUT_A, OUT_B, OUT_C で表します。 また OUT_A+OUT_C と書くことによって A と C の出力を一つの命令で まとめて制御することができます。 もし OnFwd という命令にもかかわらずモータが 逆に回ってしまう場合には、 コネクタを逆に接続しましょう。 * 2.2 RCX にプログラムを送る [#g85db17f] &color(#000000,#ccccff){基本的なコンパイル/送信の仕方}; 上のようなプログラムが書けたらファイルに保存しましょう。 この時、ファイル名には .nqc という拡張子をつけます (例えば test.nqc という名前にする)。 次に保存したプログラムを RCX に送ります。 Linux の場合、シェルを立ち上げ (MS Windowsの場合は dos 窓を立ち上げ) 、 nqc -d ファイル名 と入力します。-d というオプションをつけるとプログラムを RCX が理解できるプログラムに翻訳(コンパイル)した上で、RCX に送信します。 このオプションがないと単にコンパイルするだけで RCX には送信されません (そのかわり .rcxという拡張子のついたファイルが生成される)。 現在作業をしているディレクトリ(フォルダ)以外のディレクトリにある ファイルをコンパイルして送信する場合には、 パス (絶対パスまたは相対パス)も指定しなければいけません。 例えば、現在、/home/rcx というディレクトリで 作業していて、/home/rcx/floppy/test.nqc というファイル をコンパイル/送信したい場合には、 nqc -d floppy/test.nqc あるいは nqc -d /home/rcx/floppy/test.nqc のようにしてファイル名を指定します。 &color(#000000,#ccccff){USBのIRタワーから送信する場合}; パソコンのどのポートから送信するかは、-S という オプションで指定できます。USBのIRタワーから送る場合には、 nqc -Susb -d ファイル名 とします。また、シリアル接続の IR タワーの場合でも nqc -S/dev/ttyS1 -d ファイル名 のようにしてポートを指定することができます (デフォルトのシリアル・ポートは /dev/ttyS0)。 ついでに UNIX の環境変数として例えば .bashrc あたりに RCX_PORT=/dev/ttyS0 export RCX_PORT のように書いておけば、 その都度コマンドで入力しなくてもいいので便利です。 &color(#000000,#ccccff){RCX 2.0 に送信する場合}; RCX 2.0 の firmware (以下で説明) 用のプログラムを送る場合には、 nqc -Trcx2 -d ファイル名 とします (-T は target を意味する)。 RCX 2.0 用のコマンドや拡張された機能を使った時には このオプションをつけてください。 &color(#000000,#ccccff){firmware の送信}; 説明の順序が逆になりましたが、NQC のプログラムを実行するためには、 あらかじめ firmware と呼ばれるプログラムを RCX に送信しておく必要があります。 この firmware は付属の CD-ROM に入っています。 また、LEGO の Web Page からもダウンロードすることができます。 そしてこの firmware 自体も nqc を使って RCX に転送することができます。 nqc -firmware firm0328.lgo nqc -Susb -firmware firm0328.lgo ただし、firm0328.lgo はLEGO社のサイトからダウンロードした firmware のファイル名。 firmware は電源を切っても消えませんが、電池を交換するときには注意が 必要です。その場合には電源を切ってすばやく(2分以内くらい) に電池を交換すれば、firmware は消えません。 しかし電池交換にあまり時間を費したり、間違って電源ボタンを押したりすると、 firmwareが消えてしまい、再び送信しなければいけません。 &color(#000000,#ccccff){その他のオプション}; その他のよく使うオプションとしては、-pgm というのが あります。 これはプログラム番号を指定するためのオプションで、 nqc -d -pgm 3 ファイル名 の様に使います。この例の場合、3番目のプログラムにダウンロードされます。 指定できる番号は 1 〜 5 までです。 このオプションを指定しないと、現在 RCX で選ばれている番号の プログラムにダウンロードされます。 その他にも多くのオプションがありますが、詳しくは man nqc で調べてください (Linux の場合)。 &color(#000000,#ccccff){オプションを環境変数として定義しておく}; よく使うオプションは環境変数として定義しておけば、 コマンドを入力する際に書かなくてもいいので便利です。 例えば bash の場合、.bashrc に NQC_OPTIONS="-Trcx2" export NQC_OPTIONS などのように書いておきます。 上記のポート指定とあわせて、 RCX_PORT="/dev/ttyUSB0" NQC_OPTIONS="-Trcx2" export RCX_PORT NQC_OPTIONS と定義しておけば、 nqc -Trcx2 -S/dev/ttyUSB0 -d test.nqc という長いコマンドを nqc -d test.nqc のように短く書くことができます。 ちなみに /dev/ttyUSB0 は USB-シリアル変換アダプターを 使ってパソコンの USBポートにシリアル IR タワーをつないだときの ポート名です。 #navi(NQC入門)