2011/04/11

LEGO Mindstorms RCX1.0 で leJOSでも

子供がプログラムを始めたので、随分前に買ったレゴマインドストームRCXを利用することにした。言語はJava。でもマインドストーム用にアレンジされたleJOS(レホス)というもので、コンパクトで扱いやすい環境。

マインドストームにはグラフィカルなプログラム環境も提供されているが、あまりプログラムの勉強にならないような気がしたので、いきなりleJOSを使うことにした。ちょっと難しいかなと思ったが、意外と抵抗なくスラスラとアルゴリズムを考え出したので心配は無用だった。このBlogには、何をやったのかを備忘録程度に残しておこうと思う。

マインドストームとは?
マインドストームとはレゴ社が開発したレゴブロックを基本に、マイコン、モータ、センサー等がセットになったシステム。パソコンでプログラミングすることでロボットなどを自作することがでる。レゴブロックの特徴であるパーツの自由な組合わせと、プログラミングのコンビネーションは、おもちゃとしての領域を超えて、2000年ぐらいから教育現場を中心に教材としても広く使われるようになった。マインドストームは現在NXT(2006年発売)というシリーズへ移行。ここで扱うのは1998年に発売された初代のRCX。もう生産終了しているモデルで、現在のNXTとはハードもソフトも大きく違っていて、互換性はない。

RCXの主な仕様
CPU:
8bitマイクロプロセッサH8/3292 16MHz(日立→ルネサス エレクトロニクス)
メモリ: 
ROM 16kbyte CPU内蔵(0x0000~0x3fff) (512BのオンボードRAM)
RAM 32kbyte 外部RAM(0x8000~0xffff) (ファームウェアとユーザプログラムを入れる)
インターフェース: 
センサ制御ポート(input port)×3
モータ制御ポート(output port)×3
赤外線通信ポート×1
LCD 5文字(7セグ)
ボタンスイッチ×4
サウンド制御 (ビープ音)
インターバルタイマー
電源
乾電池 単3形 ×6本(9V)
AC 9~12V (交流を入れる仕様 日本ではあまりお目にかからない)

IrTower
パソコンとRCXの赤外線通信に使う重要なアイテム。

マインドストームRCXをJavaで動かす意味
マインドストームを買うと「Robotics Invention System」というプログラミング環境が付属している。プログラミングをしたことがない人を対象としたもので、グラフィカルなGUIにより、簡単にマインドストームを動かせるようにと考えられたプログラム環境。マインドストームの商品としてはこれでよいが、プログラミングを勉強しようとした場合、なるべく汎用的なプログラミング言語の方が好ましい。現在マインドストームRCXで利用可能なプログラミング言語は、いくつか存在している。RCXで最も使われているのはNQC。そのNQCをBricx Command Centerというプログラミング環境でプログラミングするのがポピュラー。マインドストーム用の開発言語は他にもいくつかあるが、実際にはマインドストーム専用の特殊な言語であることが多く、そのため簡易的であったり、特殊な命令があったりして、他の汎用的なプログラミング言語とはかなり違う。これらの目的はマインドストームを動かすためなので、プログラミングの効率や実行速度を重視している。一方leJOSはマインドストーム専用のJVM(Java Virtual Machine)でJavaの機能限定版と考えていい。つまりJavaプログラムそのものを動かすことができる。他の言語に比べ、マインドストームを動かすという意味では実行速度が遅かったり、メモリをたくさん使ってしまったり、ダウンロードに時間がかかったりなど欠点も多々あるが、Javaそのものを扱えるという利点は大きい。マインドストームでJavaをかじってから、Javaの本格的なプログラミングの世界へ移行するというのもありだと思う。

Robotics Invention System (マインドストーム付属)

NQC & Bricx Command Center(教育現場では広く利用されているようだ)

leJOS & Eclipse(Java)

マインドストーム内部とleJOSの関係
マインドストーム内のプログラムは大きくROMとRAMに分かれている。ROMは16Kbyteで書き換え不可能な部分。RAMは32Kbyteあり、ここにファームウェアとオリジナルプログラムをPCから書き込んで動かすことになる。leJOS JVM(Java Virtual Machine)が16Kbyteを使っているので、残りの16Kbyteが利用できる領域になる。実際にプログラムを書き込める領域は12Kbyteのようだ。

leJOSでの制約など
型の制約:
longは使えない。小数が必要なときはfloatが使えるので問題は無い。

配列:
配列の大きさに制限がある。500程度まで? 大きな配列ではうまく動かなかった。

制御文:
Switch文は使えない。まぁあまり問題ない。

ダウンロード可能なプログラム数:
1つまで。複数のプログラムを切り替えることは出来ないので、1つのプログラムにいくつものプログラムを入れて切り替えられるような工夫が必要。

ガベージコレクション:
実はない。Javaの特長であるメモリ管理がない。これは注意すべき点だろう。

上記のように多少の制約はあるが、かなり自由にプログラミングできる環境であるといえる。

leJOSに必要なハードウェア&ソフトウェアなど
■パソコン
これがなくてはプログラムは組めない。ここではWindowsXPを使う。

■マインドストーム RCX & USB IrTower
これがなくては、マインドストームとはいえない。パソコンと通信するために必要な USB IrTowerも重要。

■レゴブロック
マインドストームで遊ぶには、付属しているパーツ以外にも、いろいろレゴブロックがあったほうが楽しい。

■Robotics Invention System 2.0
付属ソフトウェア。ファームウェアの更新とか、初期化とか、何かと必要になる。

■J2SDK jdk
http://www.java.com/ja/
最新のものがあればよい。

■Eclipse
http://www.eclipse.org/
開発環境。これを使わない方法もあるが、Javaをやるなら便利な環境なので利用することにする。

■leJOS RCX plugin for Eclipse IDE org.lejos.ldt_1.2.0
http://lejos.sourceforge.net/index.php
Eclipse用のleJOSを使う。

※パソコンとマインドストーム、レゴブロック以外は無料で入手可能。

開発環境の準備
開発環境を整える手順は少しやっかいかもしれない。上記のソフトを各ホームページからダウンロードし、それをパソコンにインストールして開発環境を作って行くのだが、複数のソフトウェアから構築されるので時間がかかる。また各ソフトウェアはバージョンが複数存在していて、場合によっては動かないこともある。

Robotics Invention System2.0 (RIS2.0) のインストール
あらかじめマインドストームを付属のソフトPCにインストールする。このソフトを使って標準ファームウェアをRCX本体にダウンロードしておく。USBタワーが正常に使えるようにしておくことと、マインドストーム本体にちゃんと標準のファームウェアが入っていることが重要で、そうしないとleJOSのインストールができない。

WindowsXPでは、USB IrTowerにアクセスするとフリーズした。このときは、XPに対応したドライバをLEGOホームページからダウンロードしてインストール。インストール後はデバイスマネージャーでバージョンの確認。バージョンが1.0.50.164ならXPで動作している。

さらにRIS2.0は、Windowsの起動と共に勝手に起動する。うっとうしく感じる場合は、RIS20XPPatch.exeというパッチを当てて起動しないようにする。このexeはダブルクリックするだけで反映される。すでにLEGOのホームページではダウンロードできなくなったようだ。どこかにあるのかな?

以上でようやく、標準ソフトウェアが使えるようになった。次にパソコンにJava開発環境を整える。

J2SDKのダウンロード及びインストール
最新版でよいと思う。
パスの設定

Eclipseのダウンロード及びインストール
最新版でよいと思う。

leJOSのダウンロード及びインストール
Download plugin for Eclipse IDE をダウンロード 3.23MB 
ついでにlejos APIドキュメントも一緒にダウンロード。
lejos_win32_2_1_0.doc
後々APIが読めるかどうかがJavaを使いこなせるかどうかに関わってくる。
プラグインのインストール方法は独特
ダウンロードしたファイルを解凍するとorg.lejos.ldt_1.2.0というフォルダが出現する。中にはfeaturesとpluginsというフォルダがある。これをそのままEclipseフォルダにドラッグすることでインストールされる。上書きしますかという警告がでるので、「はい」を押してインストール。プラグインをプラグインフォルダに入れるだけでは、ちゃんとインストールされないので注意。

マインドストームを動かす
まずEclipseを起動したら、メニューの leJOS > Install firmware をクリックし、マインドストーム本体へJVM(Java Virtual Machine)をダウンロードする。ダウンロードには時間がかかる。完了したらJavaによるプログラミングが可能になる。

マインドストーム用プログラムの作成
http://lejos.sourceforge.net/p_technologies/rcx/tutorial/index.html
上記オフィシャルページを参考にプログラムを書く。とりあえずマインドストームの液晶に文字を表示させる簡単なプログラムからスタート。サンプルは以下の通り。
import josx.platform.rcx.*;
public class DistributionSmokeTest{
  public static void main (String[] args)throws Exception{
     LCD.clear(); 
     TextLCD.print ("HELLO"); 
     Thread.sleep(1000); 
     TextLCD.print ("JAVA");
     Thread.sleep(1000); 
  }
}
内容はLCDに「HELLO」と1秒間表示し、次に「JAVA」と1秒間表示して終了するプログラム。
次にソースファイルをコンパイルしてバイトコードというものを生成する。これをRCXに転送することになる。

leJOSのプログラムをRCXにダウンロードするには少し時間がかかる。また標準のRobotics Invention Systemでは5つまでプログラムをダウンロード可能だが、leJOSでは1つしかできない。

ダウンロード後に正しくプログラムが動くかチェック。RCX本体の「Run」を押す。写真のように液晶に表示されれば成功。
こんな感じでプログラムを進めていく。
つづく。