Mindstormsの使い方

2004/3/21更新 (c)S.Yajima All rights reserved


コンテンツ

はじめに
NQCのインストール
brickOSのインストール
brickOSの使い方

はじめに

ここでは、主に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);
}
をtest.nqcとして保存し、

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のインストール

1.手順

RCXには、日立製のH8/300Hというマイコンが載っています。もちろんx86系等のCPU用のバイナリとの互換性はないので、「PC上で、H8用のバイナリを作成する」必要があります。このように、自マシン以外で動くバイナリを作るコンパイラを「クロスコンパイラ」と言います。

brickOSおよび制御プログラムは、H8上で動くようにクロスコンパイルしなければなりません。そこで、まずPC上にクロスコンパイル環境を作ります。gccはインストール時にオプションを与えるだけでクロスコンパイラになってくれます。すごいですね。(たまにパッチとか必要だったりしますが。。)

これからの手順は以下のようになります。

  1. クロスコンパイル環境の構築
  2. brickOSのファームウェア(brickOS.srec)をクロスコンパイル
  3. できたファームウェアをRCXにダウンロード
  4. 制御プログラムをクロスコンパイル
  5. プログラムをRCXにダウンロード

2.クロスコンパイル環境の構築

2.1 必要なファイル

今回使ったファイルおよびバージョンは、

です。バージョンが違うと動かなかったりするので気をつけましょう。 gcc,binutilはftp://ftp.gnu.org から、newlibはredhatのHP から落とせます。パッチはsourceforgeから落とせます(このページはgccのHPからリンクたどっていくこともできます。)

(余談)debianだとapt-get legosで、redhat系もrpmでH8用クロスコンパイラがあったりします。でもrpmはそのままだとg++が入らなくて、brickOSのコンパイルがとおらなかったり。うまい方法あるのかしらん?

2.2 binutilsのインストール

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のオプションの意味は以下のとおりです。

makefileができたら、gmakeでmakeします。なるべくgmakeを使った方がいいそうな。gmake installはrootでやりましょう。

これで、H8用アセンブラ、リンカ等がインストールできました。

2.3 gcc&newlibのインストール

手順は以下のとおり。

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のオプションが増えてますが、見たまんまの意味です。

3.brickOSのインストール

まず、sourceforgeから brickOSのソースを落としてきましょう。 今回使ったのは brickos-0.2.6.10.6.tar.gzです。

brickOSは、展開(自分のホーム以下がお勧め。この展開ディレクトリで開発するのが楽)して、
./configure
make

cd util
make strip
でOKです。これでbrickOSのファームウェア、デモ、RCXにプログラムをダウンロードするユーティリティのコンパイルができました。

configureは、h8用クロスコンパイラの位置を自動で判別して設定してくれます。ここの自動判別がうまくいってないようなら、Makefile.common内のTOOLPREFIXの行を書き換えましょう。

4.ファームウェアのダウンロード&テスト

4.1 通信の準備

RCXとの通信用のIRタワーをシリアルポートCOM1に接続します。COM1で通信が可能なように、
chmod a+rw /dev/ttyS0
としてCOM1のパーミッションを変更します。

4.2 ファームウェアのダウンロード

ファームウェアのダウンロードは、firmdl3を用いて行います。brickOSのファームウェアは、brickOSを展開したディレクトリ/boot/brickOS.srec にあるので、これをRCXに転送します。
cd brickOSを展開したディレクトリ
util/firmdl3 boot/brickOS.srec

(余談)私はなぜかfirmdl3がうまく動いてくれませんでした。そんな時は、nqcを使って
./nqc -firmware brickOS.srec
としてファームウェアをダウンロードすることもできます。

(余談2)brickOSのファームウェアが入ってるRCXの場合、firmdl3で再度転送しようとしても"delete firmware failed"と言われて上書きできません。そんな時は、

  1. On-Offボタンを押しっぱなし
  2. Prgmボタンを押す→離す
  3. On-Offボタンを離す
というウラワザでファームウェアを消すことができます。

4.3 実行テスト

demo/ディレクトリ内にはいくつかのサンプルプログラムが入っています。ここでは、helloworld.lx(helloworld.cがクロスコンパイルされたバイナリ)をRCXにダウンロードしてみましょう。ダウンロードにはutil/dllを使います。
cd brickOSを展開したディレクトリ
util/dll demo/helloworld.lx
エラーなく終了したなら、Runボタンを押してみましょう。液晶にHELLO WORLDと読めなくもない記号が表示されるはずですw

brickOSの使い方

1.基本

では、実際に自分でプログラムを作って実行してみましょう。まず、次の内容のファイルを、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;
}
そして、demoディレクトリに移動し、サンプルのmakefileを利用してtest.cをクロスコンパイルします。
make test.lx
test.lxができたら、それをdllを使ってRCXに転送します。
../util/dll test.lx
RUNを押して、Aに接続したモーターが3秒間まわって止まったら成功です。

2.さらなる情報

brickOSホームページ
APIリファレンス
Tips for novices
legOS解説
などを参考にしてください。


戻る