#navi(NQC入門) 目次 #contents * 2.1 最初のプログラム [#j0043f4b] 簡単な例として、RISのインストラクションの10〜25ページで説明されているような左右にモータを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 ; … … } main 以外の task がある例: 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 という命令にもかかわらずモータが逆に回ってしまう場合には、 プログラムを変更しなくてもコネクタを逆に接続することで回転を逆にすることができます。 &color(#000000,#ccccff){プログラムの保存}; 最初のプログラムが書けたらファイルに保存しましょう。 この時、ファイル名には .nqc という拡張子をつけます (例えば test.nqc という名前にする)。 * 2.2 RCX にプログラムを送る [#g85db17f] 以下では GNU/Linux上でプログラムを転送する方法について説明しますが WindowsのDOS窓やMacOSXのターミナルを使用することで、ほぼ同じようにプログラムを転送することができます。 &color(#000000,#ccccff){ファームウェアの送信}; 作成したプログラムをロボットに実行させるためには、 あらかじめファームウェア(firmware)と呼ばれるプログラムを RCX に送信しておく必要があります。 ちなみにNQCではLEGO社純正のファームウェアを使用しますが、 独自のファームウェアを使用するプログラミング環境もあります。 このファームウェアは付属の CD-ROM に入っています。 また、[[LEGO社のサイト:http://mindstorms.lego.com/sdk2beta/default.asp]]からもダウンロードすることができます (Software Developer's Kit をダウンロードして解凍すればfirm0328.lgo というファイルが見つかる。これがファームウェア)。 そしてこの firmware 自体も nqc を使って RCX に転送することができます。 nqc -firmware firm0328.lgo USBタワーの場合は、 nqc -Susb -firmware firm0328.lgo ただし、firm0328.lgo はファームウェアのファイル名です。 転送には数分かかります。 ファームウェアは電源を切っても消えませんが、電池を交換するときには注意が 必要です。その場合には電源を切ってすばやく(2分以内くらい) に電池を交換すれば、ファームウェアは消えません。 しかし電池交換にあまり時間を費したり、間違って電源ボタンを押したりすると、 ファームウェアが消えてしまい、再び送信しなければいけません。 &color(#000000,#ccccff){基本的なコンパイル/送信の仕方}; 保存したプログラムを RCX に送るには、 Linux や MacOSX の場合、シェルを立ち上げ (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 のようにしてファイル名を指定します。 実はRCXには、5つの違うプログラムを送信することができ、それらを選択して 実行させることができます。プログラムを選択するには転送前に、Prgmと書かれた灰色のボタンでプログラム番号を選択するか、あるいは nqc -d -pgm 3 ファイル名 のように転送時に -pgm オプションでプログラムの番号(1〜5まで)を指定します(この例では3番目のプログラム)。 &color(#000000,#ccccff){転送ポートの指定}; シリアルポートや USB など、パソコンのどのポートから送信するかは、-S という オプションで指定できます。USBのIRタワーから送る場合には、 nqc -Susb -d ファイル名 とします。シリアル接続の IR タワーの場合には (Linuxでは) nqc -S/dev/ttyS0 -d ファイル名 のようにしてポートを指定することができます。この例は一つ目のシリアルポートを使う場合ですが、2つめのシリアルポートを使用する場合には -S/dev/ttyS1 というオプションにします。 また、USB-シリアル変換機を使ってシリアルのIRタワーからプログラムを転送するには、 nqc -Trcx2 -S/dev/ttyUSB0 -d ファイル名 とします(/dev/ttyUSB0 は Linux上のデバイス名)。 &color(#000000,#ccccff){ターゲットの指定}; RCX 2.0 のファームウェア(1.0よりかなり高機能になっている)用の プログラムを送る場合には、 nqc -Trcx2 -d ファイル名 とします (-T は target を意味する)。 RCX 2.0 用のコマンドや拡張された機能を使った時には このオプションをつけてください。 &color(#000000,#ccccff){その他のオプション}; その他にも多くのオプションがありますが、詳しくは man nqc で調べてください (Linux の場合)。 &color(#000000,#ccccff){オプションを環境変数として定義しておく}; 上のようなオプションを毎回入力するのが面倒な場合には、 UNIX の環境変数として例えば .bashrc あたりに RCX_PORT=/dev/ttyS0 NQC_OPTIONS="-Trcx2" export RCX_PORT NQC_OPTIONS のように書いておけきましょう。そうすれば、 nqc -Trcx2 -S/dev/ttyUSB0 -d test.nqc という長いコマンドを nqc -d test.nqc のように短く書くことができます。 なみに10番教室のパソコンでは、あらかじめシステムのデフォルトとして、 RCX_PORT="usb" NQC_OPTIONS="-Trcx2" export RCX_PORT NQC_OPTIONS のように USB のIRタワーがデフォルトとして指定されているので、 シリアルのIRタワーを使う場合には、そのつどポートを指定するか、 個人の .bashrc に export RCX_PORT="/dev/ttyS0" という一行をいれておきましょう。 #navi(NQC入門)