2024年10月29日
001-1.ロボットの基礎-第3回「ソフトウェアを作る」
今回はロボット作りの3要素のラスト、「ソフトウェア」(略して、「ソフト」と呼ぶことにします)のノウハウを紹介します。ソフトウェアとはプログラムなどを表す言葉で、ハードウェアと逆の意味に使います。ハードが「固い」のに対して、ソフトは「やわらかい」のです。あいまいで分かりにくい話になってしまいますが、実際に手を動かしてみればそうでもないはずです。(文/松原拓也)
◆プログラムとはなにか?

まず、使っている言葉を理解しないといけません。
「プログラム」とは何でしょうか?
たとえば、運動会にも「プログラム」があります。
運動会のプログラムは「xx時に100m走」とか「xx時から昼食」とか紙に書かれた予定のことですが、実はコンピューターのプログラムも同じような意味です。コンピューターのプログラムには「xxをしろ」という命令が連なっているのです。

たとえば、レゴ・マインドストームNXT(以下、NXT)のインテリジェントブロックに何か命令を与えたいとします。
たとえば「1+1」という計算をさせたいとしましょう。
この時、インテリジェントブロックに向かって「1+1は?」と質問するだけだったら、とても便利なのですが、、、相手はそこまで頭が良くありません。
ここに描いたイラストはウソのイラストです。

実際、インテリジェントブロックは人間の言葉が理解できませんので、コンピューターの言葉で命令を与えます。
この命令を作るためにはパソコンが必要です。パソコンで命令を作ることが「プログラムする」ことになります。プログラムは実体がない電気的な情報です。一番最初に言った「やわらかい(ソフト)」という意味はこのためです。
はるか昔、コンピューターが真空管で動いていた時代があったのですが、その頃は計算方法を変えるためには真空管の並びを変える必要がありました。プログラムがハードなものだったのです。

ではインテリジェントブロックの理解できる言葉とは一体何でしょうか?

インテリジェントブロックの中には「AT91SAM7」という立派なマイコンが入っています(さらにもう1個入ってますが説明を省きます)。
このマイコンの理解できる言葉でプログラムを書かなくてはいけません。

マイコンの資料は、それを作っている会社のWEBサイトから入手できます。
この難しい資料を理解することでインテリジェントブロックをプログラムできます。しかし、読んでみて分かると思いますが、、、 とてつもなく難しいです。<
◆ NXT-GとROBOLAB登場

「もっとプログラムを簡単にできないか?」という要望の中で誕生したのが、プログラムを2重にする方法です。
NXTには「ROBOLAB(ロボラボ)」や「NXT標準ソフトウェア(NXT-G)」というプログラムをするためのソフトが存在しますが、これらを例に原理を紹介します。

ファームウェア(Firmware)はNXTブロックを動かすための基本的なプログラムのことです。「ROBOLAB」や「NXT標準ソフトウェア」で作ったプログラムは実行ファイルといいます。実行ファイルはファームウェアを通じて動かします。
たとえば、自動車は中の仕組みをあまり知らなくてもハンドルなどの操作だけで運転することができます。難しい部分は機械の内側にしまい込んでいるのです。 NXTのファームウェアもそれに似た働きをしています。理解の難しい部分はファームウェアの内側にしまってあるのです。

実行ファイルの仕様についてはLEGO MINDSTORMS公式ページ(http://mindstorms.lego.com/)の「NXT'reme」の項目で「LEGO MINDSTORMS NXT Executable File Specification」という資料として公開されています。
あと、細かい話になりますが、「ファームウェア」というのは、元々ハードウェアに組み込むソフトウェアのことを表す言葉です。なので、「実行ファイルもファームウェアの一部である」と考えることができます。ただそれだと話がややこしくなるので、このページで「ファームウェア」というのは、NXTを動かすための基本プログラムのことを意味してます。
◆ ROBOLABを使ったプログラム

教育用レゴマインドストームで販売されているプログラミング環境です。
NXTソフトウェアがNXT専用なのに対して、ROBOLABはNXTとRCX両方に対応しています(最新バージョンの2.9から対応)。

これが「1+1」を計算するプログラムです。
どれが何の命令かわかるでしょうか?初めての人にはチンプンカンプンだと思いますが、これがれっきとしたプログラムです。

解説を追加してみました。正方形の一つ一つが命令です。
命令は左から右へ順番に実行されます。ひし形の図形がコンテナです。
青いので「青コンテナ」と呼びます。

「青コンテナ」というのは値の入れ物のことです。最初の命令で青コンテナには「1」が入ります。
次の命令で青コンテナに1が加算されて、コンテナの中身が「2」になります。中身の値がどんどん変わっていくので「変数」ともいいます。 青コンテナ以外にも赤や黄色のコンテナがありますので、好きな色のものを使ってかまいません。

完成したプログラムをインテリジェントブロックに転送します。

USBケーブルを使ってパソコンと接続します。インテリジェントブロックの電源を入れておきます。

「ファームウェアの交換が必要」という表示が出ました。ここでは「OK」を押します。

ファームウェアを確認する表示です。「Robolab」の文字があります。

オレンジ色の部分を押すとプログラムが実行されます。

プログラムを実行すると、このようになります。
青コンテナに計算の答えが格納されています。青コンテナの値は「c1」という部分に表示されています。「c0」と「c2」は赤コンテナと黄色コンテナの値なので関係ありません。
「c1=2」が表示されましたので正解です。
[Download]「1+1」を計算するプログラム(ROBOLAB2.9で作成しました)
◆ 「NXT標準ソフトウェア(NXT-G)」を使ったプログラム

「NXT標準ソフトウェア(NXT-Gと呼びます)」を使ったプログラムも紹介します。 NXT-Gは一般販売のNXTに付属するプログラム環境です。仕様が若干違う教育用もあります。
NXT-Gで「1+1」のプログラムを書くと、写真のようになります。どれが何の命令か分かりますでしょうか?

解説を追加してみました。 4個のブロックのうち、実際に計算をしているのは左から1番目のブロックだけです。残りは画面表示と待つための命令です。計算結果の受け渡しには線をつなぎます。線をつなぎ間違えると正しく動きません。

かなり大きな問題なのですが、 ROBOLAB用のファームウェアを書き込んでいると、 NXT-Gのプログラムが動きません。「file error!」というエラーが出ます。そこで、ファームウェアを書き換える必要があります。
「ツール-ダウンロード」をメニュー選択してファームウェアを更新する画面に移ります。

インテリジェントブロックとパソコンをつなぎ、「ダウンロード」のボタンを押すと、ファームウェアを更新できます。

ファームウェアを確認する表示です。「ROBOLAB」の文字がないことを確認します。

プログラムを実行すると、このようになります。
1+1の答えである「2」が画面に表示されました。
[Download]「1+1」を計算するプログラム(ROBOLAB2.9で作成しました)
◆ 「NXT標準ソフトウェア(NXT-G)」を使ったプログラム

「NXT標準ソフトウェア(NXT-Gと呼びます)」を使ったプログラムも紹介します。 NXT-Gは一般販売のNXTに付属するプログラム環境です。仕様が若干違う教育用もあります。
NXT-Gで「1+1」のプログラムを書くと、写真のようになります。どれが何の命令か分かりますでしょうか?

解説を追加してみました。 4個のブロックのうち、実際に計算をしているのは左から1番目のブロックだけです。残りは画面表示と待つための命令です。計算結果の受け渡しには線をつなぎます。線をつなぎ間違えると正しく動きません。

かなり大きな問題なのですが、 ROBOLAB用のファームウェアを書き込んでいると、 NXT-Gのプログラムが動きません。「file error!」というエラーが出ます。そこで、ファームウェアを書き換える必要があります。
「ツール-ダウンロード」をメニュー選択してファームウェアを更新する画面に移ります。

インテリジェントブロックとパソコンをつなぎ、「ダウンロード」のボタンを押すと、ファームウェアを更新できます。

ファームウェアを確認する表示です。「ROBOLAB」の文字がないことを確認します。

プログラムを実行すると、このようになります。
1+1の答えである「2」が画面に表示されました。
[Download]「1+1」を計算するプログラム(NXT-G)
◆ その他のプログラム方法

「NBC」とは「Next Byte Codes」の略で、NXT用に作られたプログラム言語です。NBCは標準ソフトウェア(NXT-G)やRoboLabとは違い、文字(テキスト)の形式でプログラムを書きます。ここで作成するプログラムファイルの拡張子は"nbc"です。 NBCでプログラミングを行うには「Bricx Command Center(BricxCC)」が必要です。 BricxCCはフリーソフトです。対応機種はWindows 9X/ME/NT/2000/XPです。 BricxCCは次のURLから無償でダウンロードすることができます。
http://bricxcc.sourceforge.net/
[Download]「1+1」を計算するプログラム(NBC)

一方、「NXC」はC言語に似た書式で記述することができるプログラム言語です。NXCでプログラミングを行うためにはNBCと同じく「Bricx Command Center(BricxCC)」が必要です。
[Download]「1+1」を計算するプログラム(NXC)

実行結果です。「2」が表示されました。
長くなってしまうので、ソフトウェアについての紹介を一旦終わりにします。
ここまできて気がつくと思いますが、「1+1」ぐらいの計算をコンピューターにさせてみても意味がありません。プログラムを動かす前に結果が分かってしまうと面白くないからです。
つまり、「人間には解くことが難しい問題」をプログラムしないと意味がないというわけです。それは一体どういうものでしょうか? 続きは自分で考えてみてください。
◆ (おまけ)ファームウェアを書き換える

NXTのファームウェアもプログラムで作られています。ファームウェア自身のプログラムはレゴ社の公式WEBサイトの「NXT'reme」の項目でダウンロードできます。 本来、このような重要なプログラムは秘密にすることが常だったのですが、最近では「公開したほうが大勢の人の利益につながる」という考え方も生まれつつあるようです。 写真はNXTのファームウェアのプログラム(ソース)の一部ですが、とてつもない量です。そして難しいです。これを理解できる人はほとんどいないと思います。

このプログラムはC言語という言語で書かれています。そして、コンパイラというソフトを使って、特殊な実行形式に反訳する必要があります。写真はIARという会社が販売しているARM用のコンパイラです。

プログラムを書き換えるのが難しいので、フォントデータだけを書き換えてみたいと思います。

書き換えてみました。文字の形が少し変わったのが分かりますでしょうか?
画面の見た目だけではなく、もっといろいろなことを書き換えることができるのですが、そのためには大変高度な技術が必要です。既存のファームウェアを利用するだけに留めておきましょう。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。