2004/3/21更新 (c)S.Yajima All rights reserved
コンテンツ |
はじめに |
ここでは、主にLinuxを用いてLego MindstormsのRCXの制御プログラムを書く方法を解説します。
現在、RCXプログラミングの選択肢には主にNQC(Not Quite C)とbrickOS(またはlegOS)を使う方法の2通りがあります。NQCはその名のとおりC言語ライクなプログラミング言語であり、C言語をちょこっとかじったことのある人なら誰でも簡単に扱える言語です。初めてmindstormにさわる人はNQCから入るといいでしょう。(mindstorm付属のGUIプログラミング環境は。。一度さわってみるのもいいかもしれません。。)
NQCはLEGO純正ファームウェア上で動くバイナリを作成、RCXに転送し動かします。しかし純正ファームウェアに飽き足らず、RCXの限界まで制御したい人たちは自分でファームウェアを作ってしまいました。それがlegOSです。legOSを使えば、RCXの能力すべてを使い切った制御が可能になります。そのかわりタスク管理やハードウェアの仕組みなど、ムツカシイ知識が必要になるかもしれません。
legOSは2002/4/19で開発終了し(最終Ver:0.2.6)、現在はbrickOSとして開発が進められています。両者の違いとして、legOSはカーネルと制御プログラムをあわせたファームウェアを作るのに対し、brickOSはファームウェアと制御プログラムが別個になっています。
NQCのインストール |
RCXに初めてさわる人は、是非NQCを使ってみましょう。
NQCのファイルは、
NQC - Not Quite C
からダウンロードできます。
現在最新版のVer.2.5 r3はUSB IRtowerに対応していますが、USBを使わない人はMakefileをいじらないと正常にインストールできません。ファイルを展開後、Makefile内の
USBOBJ = rcxlib/RCX_USBTowerPipe_linux.oをコメントアウトしてからmakeしてください。
(USB IRtowerを持ってる人はhttp://legousb.sourceforge.net/にあるドライバをインストールするといいらしいです)
NQCの使い方は、例えば次のファイル
task main() { OnFwd(OUT_A); Wait(400); Off(OUT_A); } |
nqc -d test.nqcとします(-dオプションをつけるとコンパイル後にRCXに転送してくれます)。NQCの詳しい使い方は、NQCチュートリアル日本語訳を参照してください。
もしbrickOSなどファームウェアを書き換えたRCXを使う場合は、最初に
nqc -firmware firm0328.lgoなどとして、RCXに純正ファームウェアを転送しましょう。ファームウェアはLego Mindstorm SDK2.5の中に入っています。また、この中にWindows用USB IRtowerドライバも入っています。windows用NQC開発環境として、bricxccがあるらしいです。
brickOSのインストール |
RCXには、日立製のH8/300Hというマイコンが載っています。もちろんx86系等のCPU用のバイナリとの互換性はないので、「PC上で、H8用のバイナリを作成する」必要があります。このように、自マシン以外で動くバイナリを作るコンパイラを「クロスコンパイラ」と言います。
brickOSおよび制御プログラムは、H8上で動くようにクロスコンパイルしなければなりません。そこで、まずPC上にクロスコンパイル環境を作ります。gccはインストール時にオプションを与えるだけでクロスコンパイラになってくれます。すごいですね。(たまにパッチとか必要だったりしますが。。)
これからの手順は以下のようになります。
今回使ったファイルおよびバージョンは、
です。バージョンが違うと動かなかったりするので気をつけましょう。 gcc,binutilはftp://ftp.gnu.org から、newlibはredhatのHP から落とせます。パッチはsourceforgeから落とせます(このページはgccのHPからリンクたどっていくこともできます。)
(余談)debianだとapt-get legosで、redhat系もrpmでH8用クロスコンパイラがあったりします。でもrpmはそのままだとg++が入らなくて、brickOSのコンパイルがとおらなかったり。うまい方法あるのかしらん?
binutilsのインストール手順は、以下のようになります。
tar xfj binutils-2.13.2.tar.bz2 cd binutils-2.13.2 mkdir objdir cd objdir ../configure --prefix=/usr/local/crossgcc/h8300-hms --target=h8300-hms gmake all gmake install ←rootで! |
ファイルを展開し、作業ディレクトリを作って、その中でconfigureを実行してMakefileを作成します。configureのオプションの意味は以下のとおりです。
これで、H8用アセンブラ、リンカ等がインストールできました。
手順は以下のとおり。
export PATH=$PATH:/usr/local/crossgcc/h8300-hms/bin tar zxvf gcc-core-3.2.1.tar.gz tar zxvf gcc-g++-3.2.1.tar.gz tar zxvf newlib-1.11.0.tar.gz cd gcc-3.2.1 ln -s ../newlib-1.11.0/newlib . patch -p1 < ../h8300-hms-gcc-3.1-1.patch mkdir objdir cd objdir ../configure \ --prefix=/usr/local/crossgcc/h8300-hms --target=h8300-hms \ --enable-languages=c,c++ --with-newlib gmake all gmake install ←rootで! |
まず、インストールしたbinutilsが使えるように、PATHを通します。
次に、ファイルを展開し、gccと一緒にnewlibもコンパイルできるようにシンボリックリンクを張り、パッチを当てます。
binutilsのときと同じようにconfigureしてgmakeします。gmake installのときはrootでやりましょう。binutilsの時よりconfigureのオプションが増えてますが、見たまんまの意味です。
まず、sourceforgeから brickOSのソースを落としてきましょう。 今回使ったのは brickos-0.2.6.10.6.tar.gzです。
brickOSは、展開(自分のホーム以下がお勧め。この展開ディレクトリで開発するのが楽)して、
./configure make cd util make strip |
configureは、h8用クロスコンパイラの位置を自動で判別して設定してくれます。ここの自動判別がうまくいってないようなら、Makefile.common内のTOOLPREFIXの行を書き換えましょう。
RCXとの通信用のIRタワーをシリアルポートCOM1に接続します。COM1で通信が可能なように、
chmod a+rw /dev/ttyS0 |
cd brickOSを展開したディレクトリ util/firmdl3 boot/brickOS.srec |
(余談)私はなぜかfirmdl3がうまく動いてくれませんでした。そんな時は、nqcを使って
./nqc -firmware brickOS.srec
としてファームウェアをダウンロードすることもできます。
(余談2)brickOSのファームウェアが入ってるRCXの場合、firmdl3で再度転送しようとしても"delete firmware failed"と言われて上書きできません。そんな時は、
demo/ディレクトリ内にはいくつかのサンプルプログラムが入っています。ここでは、helloworld.lx(helloworld.cがクロスコンパイルされたバイナリ)をRCXにダウンロードしてみましょう。ダウンロードにはutil/dllを使います。
cd brickOSを展開したディレクトリ util/dll demo/helloworld.lx |
brickOSの使い方 |
では、実際に自分でプログラムを作って実行してみましょう。まず、次の内容のファイルを、demo/ディレクトリ内に、test.cという名前で作ります。
#include <dmotor.h> int main(int argc, char **argv) { motor_a_speed(150); motor_a_dir(fwd); sleep(3); motor_a_dir(off); return 0; } |
make test.lx |
../util/dll test.lx |
brickOSホームページ
APIリファレンス
Tips for novices
legOS解説
などを参考にしてください。