#nomenubar
#navi(NQC入門)

簡単な例として、RISのインストラクションの10〜25ページで説明されているような左右にモータを2つ装備した車を作り、この車を前後に動かしたり方向変換させたりするプログラムを考えましょう。 

目次
#contents

* 2.1 最初のプログラム [#j0043f4b]

基本的には左右のモータを同じ方向に回転させると前進したり後進したりできます。
右側のモータだけを前方向に動かせば左に曲がり、 
左のモータだけを前方向に動かせば右に曲がります。 
また2つのモータを逆に回転させればその場で旋回して方向転換ができます。 

まず普段使っているエディタ((たいていの最近のGNU/Linuxシステムで使えるエディタとしては kedit,kwrite,gedit,emacs,xemacs などがあります。Windowsの場合はアクセサリの中にある「メモ帳」をエディタとして使うことができます。))(ワープロは使わないように)で以下のような簡単なプログラムを作成してロボットを動かしてみましょう。

MacNQCやBrixCCで作業する場合にはそれぞれのソフトに付属のエディタを
使用します。

 /*  出力 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 出力のモータを止める
 }

コメント文(以下で説明)に関しては日本語でも構いませんが
((ただし MacNQCでは日本語が使えません))、
それ以外の部分は空白も含めてすべて半角の英数字や記号で書いてください。
また 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_music;
      …
     stop play_music;
 }
 
 task play_music()
 {
      …
 }
この例では main だけでなく、play_music という名前の task も定義されています。


&color(#000000,#ccccff){RCXの出力について};

RCX にはモータを接続するための3つの出力ポート(A,B,C)が付いています。
NQCのプログラムではそれぞれ、OUT_A, OUT_B, OUT_C で表します。
また OUT_A+OUT_C と書くことによって A と C の出力を一つの命令で
まとめて制御することができます。 

もし OnFwd という命令にもかかわらずモータが逆に回ってしまう場合には、
プログラムを変更しなくてもモータへのコネクタを逆に接続することで回転を逆にすることができます。 

&color(#000000,#ccccff){プログラムの保存};

最初のプログラムが書けたらファイルに保存しましょう。 この時、NQCのプログラムであることがわかるようにファイル名には .nqc という拡張子をつけます (例えば test.nqc という名前にする)。日本語のファイル名はOSごと
に扱いが違うので避けたほうが無難です。


* 2.2 RCX にプログラムを送る [#g85db17f]

MacNQCの場合には、「Program」→「Compile & Download」を実行することで、作成したプログラムをコンパイルしてロボットに転送してくれるので以下の操作(ファームウェアの送信を除く)は必要ありません。

以下では GNU/Linux上でプログラムを転送する方法について説明しますが
WindowsのDOS窓やMacOSXのターミナルを使用することで、ほぼ同じようにプログラムを転送することができます。


&color(#000000,#ccccff){ファームウェアの送信};

作成したプログラムをロボットに実行させるためには、
あらかじめファームウェア(firmware)と呼ばれるプログラムを RCX
に送信しておく必要があります。 
ちなみにNQCではLEGO社純正のファームウェアを使用しますが、
独自のファームウェアを使用するプログラミング環境もあります。

このファームウェアはRIS2.0付属の CD-ROM に入っています。
実際には、付録のWindows用ソフトのインストール後にみつかる 「Program Files\LEGO MINDSTORMS\Robotics Invention System 2.0\script\Firmware\firm0328.lgo」というファイルがファームウェアですが、GNU/Linux上でも wine を使って「wine Setup.exe」のような感じでセットアップしたことにすれば firm0328.lgo が取り出せます。

%%また、[[LEGO社のサイト:http://mindstorms.lego.com/sdk2beta/default.asp]]からもダウンロードすることができます (Software Developer's Kit をダウンロードして解凍すればfirm0328.lgo というファイルが見つかります。これがファームウェア)。%%((2008年10月10日現在、このページはなくなってしまったようです。残念!))

実際には、付録のWindows用ソフトのインストール後にみつかる 「Program Files\LEGO MINDSTORMS\Robotics Invention System 2.0\script\Firmware\firm0328.lgo」というファイルがファームウェアですが、GNU/Linux上でも wine を使って「wine Setup.exe」のような感じでセットアップしたことにすれば 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/user というディレクトリで 作業していて、/home/user/nqc/test.nqc というファイル をコンパイル/送信したい場合には、 

 nqc -d nqc/test.nqc

あるいは 

 nqc -d /home/user/nqc/test.nqc

のようにしてファイル名を指定します。 

&color(#000000,#ccccff){プログラム番号の指定};

実はRCXは、5つの違うプログラムを保存することができます。
そしてユーザがそれらを選択して実行させることができので、同一のロボットでもいろいろなプログラムを作成してその違いを調べたり、数人で違うプログラムを作成してそれらを比較することが容易にできます。
プログラムを選択するには転送前に、Prgmと書かれた灰色のボタンでプログラム番号を選択するか、あるいは

 nqc -d  -pgm 3 ファイル名

のように転送時に -pgm オプションでプログラムの番号(1〜5まで)を指定します(この例では3番目のプログラム)。

&color(#000000,#ccccff){転送ポートの指定};

シリアルポートや USB など、パソコンのどのポートから送信するかは、-S 
という オプションで指定できます。USBのIRタワーから送る場合には、 

 nqc -Susb -d ファイル名

とします((配布した授業用のCDではUSB接続がデフォルトになっていますのでこのオプションは必要ありません))。
シリアル接続の 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 用のコマンドや拡張された機能を使った時にはこのオプションをつけてください
((配布したCDではrcx2がデフォルトになっているのでこのオプションは必要ありません))。

ちなみにSPC(スパイボティクスのコントローラ)へ転送するときには、-Tspy と指定します。

&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/ttyS0 -d test.nqc

という長いコマンドを 

 nqc -d test.nqc

のように短く書くことができます。 

ちなみに%%10番教室のパソコンでは%%配布した授業用のCDでは、あらかじめシステムのデフォルトとして、

 RCX_PORT="usb"
 NQC_OPTIONS="-Trcx2"
 export RCX_PORT NQC_OPTIONS

のように USB のIRタワーがデフォルトとして指定されているので、
シリアルのIRタワーを使う場合には、そのつどポートを指定するか、
個人の .bashrc に

 export RCX_PORT="/dev/ttyS0"

という一行をいれておきましょう。

#navi(NQC入門)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS