ロボットに黒い線の上を走らせてみよう

2011年6月13日(月)
吉田 彩花舟元 拓斗

Hello world探訪

突然のロボコン出場を命じられた新人エンジニアの2人。前回のHello worldに続いて、今回は実際にロボットを動かしていきます。

  1. [舟元]じゃあ早速、前回作ったファイルを一つずつ見直していこうか。まずは Makefile ってやつを見ようよ。

Makefile(コメントを追記しています):

# 最終的なソフトウェアの名前
TARGET = helloworld
# コンパイルするソースコードのファイル名
TARGET_SOURCES = helloworld.c
# コンパイルするOILファイルのファイル名
TOPPERS_OSEK_OIL_SOURCE = ./helloworld.oil

# 以下は変えない。
O_PATH ?= build
include ../../ecrobot/ecrobot.mak
  1. [吉田]あ、コメント入れてくれたんだ。ありがとう。これって、ソースコードのファイル名とか書いてあるけど、何に使ってるの?

Makefile には、コンパイルに関連する設定を記述します。nxtOSEKで動作するソフトウェアに関連する共通的な設定は、includeで指定している ecrobot.mak に用意されています。このファイルは、コンパイル時に起動する make というツールが自動的に読み込み指定したとおりにコンパイルを行い、走行体で動作するソフトウェアを生成します。

ここで紹介した Makefile では TARGET_SOURCESに指定した helloworld.c をコンパイルし、TARGETに指定された helloworld をファイル名とするコンパイル結果(実際には、helloworld.rxeや、helloworld.rom、helloworld.ramといったファイル名になります)を得ることができます。

今後、ソースファイルが増えたりした場合はTARGET_SOURCESにスペース区切りでファイル名を追加していきます。例えば、helloworld.cに加え、motor.cをコンパイルしたい場合は、以下のようになります。

motor.cもコンパイルしたいとき:

TARGET_SOURCES = helloworld.c motor.c
  1. [吉田]なるほど。コンパイルに関連することは Makefile に設定するんだねー。
  2. [舟元]うん。次はhelloworld.cだね。これもコメントを追記したから読んでみようか。

helloworld.c(抜粋)

TASK(Main) {
    U32 pressed_counter;

    display_clear(0); // 画面をクリアして、
    display_goto_xy(0, 0); // 表示する位置を左上に設定して、
    display_string("hello, world!!"); // 表示する文字列を設定して、
    display_update(); // 実際に表示を指示する。

    pressed_counter = 0;
    while (pressed_counter < 10) { // 押された状態が10回続くまで続ける
        if (ecrobot_is_ENTER_button_pressed() == 1) { // ENTERボタンが押されたら
            ++pressed_counter; // カウンタをインクリメント
        } else { // でなければ
            pressed_counter = 0; // カウンタをリセット
        }
        systick_wait_ms(10); // 10ミリ秒待つ
    }

    // 終了待ちループ
    // 四角いグレーのボタンを押して電源OFF。
    while (1) {
        systick_wait_ms(100);
    }
}
  1. [吉田]ほほぉ。APIリファレンスに書いてある関数を、うまく組み合わせて処理するだねー。TASK(Main)っていうのは、関数を作っているの?なんか違うように見えるんだけど。
  2. [舟元]これは関数じゃなくて、タスクっていうものを定義しているんだ。

走行体に繋ったセンサーの値を取得したりモータを動かしたりするためには、nxtOSEK内のecrobotというライブラリのAPI(関数)を呼び出します。前回も紹介したとおり、APIの詳細は NXTway-GS 倒立振子制御 C API 解説書 で参照することができます。なお helloworld.c 内の ShutdownOS() だけは、ecrobot の API ではなく、リアルタイムOSのAPIとなっています。こちらについては、nxtOSEKを展開したフォルダ内の toppers_osek/doc/TOPPERS_OSEKカーネル外部仕様書.pdf で詳細を参照できます。

nxtOSEKで利用するリアルタイムOS(OSEK)では、処理単位をタスクと呼びます。パソコンを使うと、インターネットを閲覧するためのプログラム、文章を作成するためのプログラム、表計算をするためのプログラムと、複数のプログラムを開くことができます。このプログラムの一つ一つが処理しなければいけない仕事を担っています。パソコン上では、任意のプログラムを、任意のタイミングで、複数起動することができます。タスクもこれと同等なものと考えれば良いでしょう。

  1. [吉田]んー難しい。このタスクっていうのが、ソフトウェアが起動するときに勝手に呼び出されるのかなぁ?
  2. [舟元]今のところは、タスクも関数みたいなものだと思っていれば大丈夫だよ。ソフトウェアが起動するときに呼び出されるのは、OILファイルに書いたからだよ。

helloworld.oil(抜粋、コメント追記):

TASK Main // Mainという名前のタスクの設定
{
  AUTOSTART = TRUE // appmode1のときに自動的に開始する
  {
    APPMODE = appmode1;
  };
  PRIORITY = 1; // タスクの優先度を設定
  ACTIVATION = 1; // 多重起動なし
  SCHEDULE = FULL; // フルプリエンプティブ
  STACKSIZE = 512; // スタックサイズ
};

OILファイルには、タスク、リソース、イベント、アラームといったソフトウェアから利用したい機能の定義を記述しておきます。helloworld.oilでは、Mainというタスクを利用することと、Mainタスクをどう動かして欲しいかを定義しています。ソフトウェア起動時にhelloworld.cのTASK(MAIN)が自動的に起動したのは、helloworld.oil内で AUTOSTART = TRUE とし自動起動するように設定していたためです。

  1. [吉田]なるほど。3つもファイルを作って大変だったけど、どれも欠かせないものなんだねー。
  2. [舟元]組み込みソフトウェアが動く環境は、いろいろと制約が多いからね。プログラム以外にも設定として書くことで効率化を図っているんだ。よし、前回の復習はこのくらいにして実際にETロボコンで使う走行体を組み立ててみようか。

これが走行体!!

ETロボコンで使用する走行体の組み立て方は参加者のみに配布されます。全チームで共通の走行体となるよう、この組み立て方に従って走行体を組み立てる必要があります。なお、ETロボコンで使用する走行体とは違ったものにはなりますが 同等のロボットを作るための手順書 がnxtOSEKの公式サイトに公開されています。本連載で紹介するプログラムは、この走行体でも動作を試すことができるかと思います。

  1. [舟元]これがETロボコンで使う、教育用レゴ マインドストームNXTのキットだよ。
  2. [吉田]おぉ!ちゃんとセットになってる。これを説明書通りに組み立てれば良いのね。

  1. [吉田]これでよし、と(実際には2時間ほどかかっちゃいました)。あれ、、、?

  1. [吉田]これ立たないんじゃない。倒れちゃうじゃん。
株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。文系出身で右も左もプログラミングも分からない中、ETロボコンへの参加を命じられ四苦八苦中。

株式会社 永和システムマネジメント

永和システムマネジメントに2011年入社。学生時代に二度ETロボコンに参戦。配属されてから役に立ちそうな技術・知識を盗むべく奮闘中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています