今回は第256話である。ソフトウエア開発者にとって,16,32,・・・128,256は,きりのよい数字である。今回は256話記念として本来のテーマであるLEGO MINDSTORMSに戻って,がっつりとお送りしたい。Unix系OSの用語だらけになるので,この日記のいつものスタイルとは異なるが,適宜解説も入れていく。

 筆者は昨年度より,秋に富山市のテクノホールで開催されるITフェアに合わせて実施されるロボットプログラミング競技会に関与している。競技会に参加するのは,富山のソフト開発会社や情報処理会社の若手社員や高専生,そして今年度からは地元の大学生も参加するらしい。打ち合わせの席で,今回は車体の基本モデルを統一した上で,プログラムに工夫をしてもらおうという話になった。

 ライントレースロボットの有名なモデルというと,思い浮かぶのはエッジくんETロボコンのモデルである。

6月10日 エッジくんを真似てハードを作ってみる。

 エッジくんとETロボコンのモデルに共通の特徴は,モーター1個をステアリングに使うことだ。

 裏を見ていただくと,ステアリングの仕組みがよくわかるだろう。実はここで大きなミスを犯しているのだが,この日はそれに気付かなかった。

 駆動のモーターには,ディファレンシャルギヤを使う。エッジくんの場合,この画像と同様に駆動用モーターを1個だけ使う方法と,2個並べてよりハイパワーにする方法がある。ETロボコンのモデルでは,同様にディファレンシャルギヤを使うのだが,ギヤの組み方がもう少し複雑で,駆動用のタイヤが大きい。

 とりあえず,NQCでプログラムを作り走らせてみた。黒い線と白い地色のエッジは検出するのだが,すぐコースアウトしてしまう。

 うまくいかない憂鬱な気分のままこの日は終了したが,一つうれしいこともあった。私がロボットを作る様子をみていたほのちゃん(小学3年生)が,「わたしも走る車作ってみたい」と言い,こんな車を作った。

 ギヤの組み合わせで回転方向を90度変えているところがミソである。

 6月13日 組み立てミスに気付かないまま,ソフトウエア開発環境の整備を始める。

 C言語ライクなNQCは,LEGO MINDSTORMSの純正ファームウエア上で動くが,より高速な反応が欲しいときには,ファームウエアをbrickOSに入れ替える必要がある。brickOSは西暦2000年以前から開発されてきたlegOSの後継である。ファームウエアとOSは別だろうという指摘もあると思うが,マインドストームの本体RCXのソフトウエアは,以下の図のような構成だと考えてほしい。

 brickOSは,プリエンティブなマルチタスクのPOSIXなRCX用OSである。わけのわからない言葉だらけなので,注*1を参照していただきたい。

*1 マルチタスクとは,複数のアプリケーションや処理を同時に並行して行う機能のこと。プリエンティブなマルチタスクとは,OS自体がタスクを管理し,時分割的にすべてのタスクに時間を与える方式であり,Windows 95/NT以降,UNIX系OSで採用されている。POSIX(Portable Operating System Interface)は,異なる実装のUNIX OSをはじめとする各種OSに共通のAPIを定め,移植性の高いUNIXアプリケーションの開発を容易にすることを目的として,IEEEが策定したアプリケーション・インタフェース規格。

 さて,実はここからが長い道のりなのである。

 brickOSは,ソースコードの圧縮ファイルとして提供される。RCXのマイコンは日立製作所製のH8である。H8用のバイナリを作成するには,クロスコンパイラ*2が必要となる。そして,クロスコンパイラのバイナリを作成するためにもコンパイラが必要である。

*2 クロスコンパイラとは,開発マシンとは違う環境で動くバイナリを作るコンパイラのこと。

 しかも,これらのソースコードを書いた人はWindowsのPCではなく,UNIX系OSのマシンを使っていたのである。だから,LinuxのPCが用意できれば,少し簡単になる。そうでない場合は,Windows PCにCygwin*3という,大雑把に言うとエミュレータをインストールするところから始まる。

*3 Cygwinでは,WindowsAPIをcygwin1.dllとしてラッピングすることで,UNIXのAPIを使えるようにしている。

 1.のCygwinのインストールから始める。筆者はsorceforgeの説明ページを参考にした。

 バージョンの違いで,表示される項目の並びなどに違いがあるが,install from internetを選び,インストールすればよい。大事なのはダウンロードするパッケージの選択である。上記のページにある最低限必要なものを選んでいくと,選び忘れがあったりして,2.クロスコンパイラの作成の工程でエラーになる。遠慮なくドバドバッとインストールするほうが手っ取り早い。もちろん,WWWサーバーapacheなどという種類のパッケージは選択する必要はない。
 
 2.の工程で,Hitachi-H8用のクロスコンパイラを作成する。sorceforgeの説明ページにはスタートメニューからCygwin Bash Shell*4を立ち上げて,buildディレクトリを作れと書いてあるが,そこに重要な意味はない。c:\cygwinのサブディレクトリとしてbuildを作ればよいだけだ。

*4 bashはLinuxの標準的なシェルで,コマンドを実行できる。シェルはOSの核であるカーネルと操作する人間の橋渡しだと考えることができる。

 sorceforgeの説明ページのリンクをたどって,c:\cygwin\buildにgcc-2.95.2.tar.gz,binutils-2.10.1.tar.gz,そしてlegos-buildgcc.zipの三つのファイルをダウンロードしたら, legos-buildgcc.zipを展開する。二つのdiffファイルとスクリプトファイルbuildgcc.shがc:\cygwin\buildにできれば,OKだ。

 次は,Cygwin Bash Shellを立ち上げ,buildgcc.shを実行する。コマンドは以下の通り。

$ cd /build
$ ./buildgcc.sh

($はプロンプト。表示されているプロンプトに続けてコマンドを入力する)

 buildgcc.shの中にクロスコンパイラの作成に必要な手順が記述されているので,必要なパッケージが首尾よくダウンロードされていれば,クロスコンパイラが作成される。

 3.のbrickOSのクロスコンパイルに進もう。sorceforgeの説明ページのリンクにしたがって,brickos-0.9.0.tar.gzをダウンロードして,C:\cygwinにおく。$ cd /でC:\cygwinに戻り,$ tar xvfz brickos-0.9.0.tar.gzで復元する*5

*5 tarはファイルやディレクトリを圧縮・復元する。この例ではgzip形式のファイルを復元している。

$ ln -s brickos-0.9.0 brickOS
$ cd /brickOS
$ ./configure; make
$ cd util
$ make strip

 ln -sはシンボリックリンクを作る。ディレクトリbrickos-0.9.0にbrickOSというショートカットを作成しているのだ。次行でcd /brickOSとしてディレクトリbrickos-0.9.0にチェンジ・ディレクトリしている。

 configureは,makeするために必要な情報を集め,Makefileに書き込む。makeはコンパイルだ。make stripをするとバイナリのサイズが小さくなるようだ(サイズが小さくなったことを確認していないので,気弱な書き方をしているがお許しいただきたい)。

 4.のbrickOSのダウンロードに進む。以下のコマンドでファームウェアがダウンロードできる。

$ ./firmdl3 ../boot/brickOS.srec

 しかし,ファームウエアがすでに入っている場合は,delete firmware failedとエラーが出てダウンロードできない。ファームウエアを消去する方法は,何通りかある。ボタンを押す組み合わせで消去できるらしいが,なかなかうまくいかない。確実なのは,電池を1本抜いてOn-Offの赤いボタンを押し,その後,電池を入れ直しONにする。ピーピーと音がしてファームウエアが消える。

 再度,ダウンロードすると数分でbrickOSがダウンロードされた。

 本来なら,次は適当なエディタでプログラムを作成し,クロスコンパイル(5)してダウンロード(6)するところだが,demoサブ・ディレクトリにある,すでにコンパイル済みのプログラムをダウンロードしてみる。
 
 次のように入力,実行する。

$ ./dll ../demo/helloworld.lx

 バイナリファイルの拡張子はlxである。

 LCDにhelloと表示され,デジタルカメラのシャッターを切り終えたころにはworldに変わった。

6月17日 legOS 0.2.3用のライントレースプログラムソースをエッジくんのページからダウンロードし,c:\cygwin\brickOS\demoに入れる。
 Cygwin Bash Shellを起動し,

$ cd /brickOS/demo
$ make ume2x.lx

とコマンドを入力しコンパイルする。次に/brickOS/demoに移り,./dll ../demo/ume2x.lxでダウンロードする。しかし,またエラーが出る(error deleting program)。いちいち先に入っていたプログラムを消去してやらなければいけないようだ。

./dll --delete=helloworld.lx

 上記のコマンドを実行し,helloworld.lxを消去して再度,ume2x.lxをダウンロードする。しかし,走行させてみるとNQCのときと同じ動きをした。brickOSでRCXが動くようになるまで,ハードウエアの構造に問題があるという結論を先延ばしにしていたのである。
 
 ETロボコンのページを眺めていて,やっと気づいた。ステアリングの向きに合わせて,ライトセンサーも動かしてやればいいのだ。

 進行方向を決めるタイヤの軸の動きに合わせて,ライトセンサーが首を振るように改造した。

 結果,エッジくんもどきは高速でエッジを検出しライントレースするようになった。

 ETロボコンのモデルでは,これにタッチセンサーを加え,ステアリングが切られているか否かの判断をするようだ。