組み込みも、はじめの一歩はHello world
レッツ!ハローワールド!!
- [舟元]説明ばっかりだと、よく分からないだろうし、1回プログラミングして動かしてみようか。
- [吉田]そうですね。あまり難しい話しばかりだと眠く。。。
- [舟元]じゃあ、実際にプログラミングする前に、今回の環境を整理しておこうか。まずは、ハードウェアね。
走行体はコンピュータとなるNXT本体を中核に、以下のセンサーやアクチュエータが接続されています。
センサー | 光センサ、タッチセンサ、超音波センサ、ジャイロセンサ |
アクチュエータ | サーボモータ |
- [舟元]次は、ソフトウェア。ETロボコンでは、nxtOSEKというオープンソースのリアルタイムOSとハードウェアを動かすためのライブラリがセットになったものを使うんだ。
走行体用のソフトウェアを開発する際には、nxtOSEKを利用するため、以下のソフトウェアを利用します。
コンパイルプラットホーム | cygwin |
コンパイラ | GNUARM |
ミドルウェア | nxtOSEK |
ソフトウェア転送用ツール | NeXTTool |
- [舟元]それじゃ、nxtOSEKのサイトを見ながら、開発に必要なものをパソコン上にインストールしよう。
- [吉田]手を動かす作業ですねっ!やっと睡魔から開放される!!
nxtOSEKでの開発手順は、公式サイトの「 拡張NXTファームウェア + nxtOSEKのインストール方法(Windows XP/Vista/7) 」 に記載されています。この手順どおりに開発環境をセットアップしてください。
また、nxtOSEKを利用したソフトウェアをコンパイルするためには、別途System Generatorも必要になります。 nxtOSEKのダウンロードページ にある「 お知らせ: nxtOSEKからのsg.exeの削除について(2010/03/01) 」を参照してSystem Generator(sg.exe)をコピーしてください。
今回は、nxtOSEKとNeXTToolはnxtOSEKのサイトにある例のとおりインストールしているものとします。
---- | cygwinでのパス | Windowsでのパス |
---|---|---|
nxtOSEK | /nxtOSEK | C:\cygwin\nxtOSEK |
NeXTTool | /nexttool | C:\cygwin\nexttool |
- [吉田]デキタッ!!いろいろと設定しないといけないことやインストール先を注意しないといけないので、注意が必要ですね。
- [舟元]開発環境のセットアップは、何度もやるものじゃないからね。良い経験だよ。さて次は、開発環境が正しくセットアップされていることの確認も含めて、 "Hello, World" を作って動かしてみようか。
今回は、開発環境の動作確認と開発手順を確認するために、画面に"Hello, World!!"と表示しNXTのENTERキー(オレンジ色のキー)を押すことで終了するソフトウェアを作ってみます。詳細は次回以降で説明していく予定ですが、余裕のある方は今回呼び出している関数について nxtOSEK公式サイトのAPIリファレンス を参照し、各関数を呼び出しときに、どうなるかを確認してみると良いでしょう。
まずは、作業用のディレクトリ(フォルダ)を作成します。cygwinを起動し、表示される $ に続けて以下のように入力し、エンターキーを押します。( $ 自身は入力する必要はありません。)
$ mkdir -p thinkit/helloworld
ここで作成したディレクトリは、Windowsのエクスプローラからは C:\cygwin\use_name\thinkit\helloworld (user_nameとなっているところは、実際のユーザ名に置き換えてください。)となります。このディレクトリに以下の3つのファイルを保存します。
Makefile:
TARGET = helloworld TARGET_SOURCES = helloworld.c TOPPERS_OSEK_OIL_SOURCE = ./helloworld.oil O_PATH ?= build include ../../../../ecrobot/ecrobot.mak
helloworld.c:
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" // 1ミリ秒間隔で呼び出される。 // 今回は何もしない。 void user_1ms_isr_type2() { } TASK(Main) { U32 pressed_counter; // 画面をクリアして文字列を表示。 display_clear(0); display_goto_xy(0, 0); display_string("hello, world!!"); display_update(); // 10ミリ秒間隔でENTERボタンを確認する。 // ENTERボタンが押された状態が10回(100ミリ秒)続いたら終了。 pressed_counter = 0; while (pressed_counter < 10) { if (ecrobot_is_ENTER_button_pressed() == 1) { ++pressed_counter; } else { pressed_counter = 0; } systick_wait_ms(10); } // 終了待ちループ // 四角いグレーのボタンを押して電源OFF。 while (1) { systick_wait_ms(100); } }
helloworld.oil:
#include "implementation.oil" CPU ATMEL_AT91SAM7S256 { OS LEJOS_OSEK { STATUS = EXTENDED; STARTUPHOOK = FALSE; ERRORHOOK = FALSE; SHUTDOWNHOOK = FALSE; PRETASKHOOK = FALSE; POSTTASKHOOK = FALSE; USEGETSERVICEID = FALSE; USEPARAMETERACCESS = FALSE; USERESSCHEDULER = FALSE; }; APPMODE appmode1{}; TASK Main { AUTOSTART = TRUE { APPMODE = appmode1; }; PRIORITY = 1; ACTIVATION = 1; SCHEDULE = FULL; STACKSIZE = 512; }; };
- [吉田]うひゃぁ。こんなに書かないと動かないんですかっ!?
- [舟元]プログラムといえる部分はhelloworld.cだけなんだけど、定義とか設定に関わるものもあるから、ちょっと多めになっちゃうね。よし、ファイルが揃ったらコンパイルだ。
コンパイルは、cygwinにインストールされている make を利用します。先ほど作ったディレクトリに移動し、以下のようにコマンドを入力します。( $ 自体は入力不要です。各行の終わりでエンターキーを入力します。)
$ cd thinkit/helloworld $ make all
問題がなければ、以下のとおりの出力されコンパイルが完了します。
Generating binary image file: helloworld_rom.bin Generating binary image file: helloworld_ram.bin Generating binary image file: helloworld.rxe
- [舟元]よし、コンパイル完了。次はNXTに転送して実行だ。
コンパイルが完了すると、ソフトウェアを転送するためのスクリプトも生成されます。パソコンとNXTをUSBで接続し、NXTの電源を入れます。先ほどのcygwinの続きに以下のコマンドを実行します。
$ sh rxeflash.sh
正しく転送された場合は、以下のように出力されます。
Executing NeXTTool to upload helloworld.rxe... helloworld.rxe=17328 NeXTTool is terminated.
転送が完了すると、いよいよ実行です。実行はNXTの電源を入れ、以下に図示するとおり操作します。
図7:電源投入後からソフトウェアの起動までの操作 |
- [吉田]おぉー!!動きましたよ。出ました!ハローワールド!!
- [舟元]出たねぇ。オメデトウ。組み込みデビューだ。
- [吉田]うーん。でも、このhelloworld.oilとかって何なんですか?main関数が無いのに動いちゃうんですね。
- [舟元]あれ、手を動かしたら眠気が吹っ飛んだ?今回の作ったソフトウェアだけでも説明し始めると長くなっちゃうから、続きは次回だね。
- [吉田]そうしましょう。私も覚えることばかりでパンク寸前です。では、お疲れさまでぇす。
次回は、動作確認で使ったソフトウェアの説明から実際にETロボコンの走行体を動かせればと思っています。
※レゴ、レゴ マインドストームは、レゴグループの登録商標です。
【参照リンク】
<最終アクセス:2011.05>