連載
» 2012年09月11日 10時07分 公開

階層構造を意識して、信頼性の高いプログラムを組もう!マイクロマウスで始める組み込み開発入門(5)(2/2 ページ)

[三月兎,MONOist]
前のページへ 1|2       

北上くんのPi:Co Classic構想

 それでは、北上くんが考えたPi:Co Classicのソフトウェア構成図を見てみましょう。


「Pi:Co Classic」のソフトウェア構成図 図1 「Pi:Co Classic」のソフトウェア構成図

 C言語にはメイン関数が必要です。メイン関数では、初期処理とアプリケーション層のメイン処理を呼び出します。

 初期処理には、電源を[ON]にした後に、一度だけ実行されるハードウェアの初期化モジュールを記述します。

 一方のアプリケーション層では、さまざまな仕事を行います。例えば、Pi:Co Classicのスイッチでモードを切り替えて、迷路探索をさせたり、最短走行をさせたり、LEDを光らせたりといった機能を実現します。

 このアプリケーション層では、ハードウェアを直接意識していません。あくまでもコントローラ層に要求を伝えているだけです。アプリケーション層が意識するのは、迷路一区画のサイズ、スタート位置、ゴール位置などの外的条件などです。

 その下にあるのが、コントローラ層です。ここでは、アプリケーション層からの要求に従って、必要なドライバモジュールを呼び出します。Pi:Co Classicの物理的なパラメータ、例えば、車輪の直径やモータの回転角などを管理します。

 そして、Pi:Co Classicのすぐ上にあるドライバ層が、前述の「ハードウェアを直接制御する層」に該当します。Pi:Co Classicに搭載されている、LEDやスイッチ、ブザーなどを制御するモジュールで構成されています。

 この図だけで見ると、コントローラ層とドライバ層に同じ内容が書いてあるように見えますが、実際は機能が異なります。それでは、コントローラモジュールとドライバモジュールのLEDの制御をつかさどる部分に何が入っているのか、その詳細を見てみましょう。

LEDコントローラとLEDドライバに記述される関数 図2 (左)LEDコントローラと(右)LEDドライバに記述される関数

 LEDドライバには、4個あるLEDをそれぞれ点灯/消灯させる関数が入っているのが分かります。右LEDを点灯させる場合は、コントローラ層の「ctrl_led_r」関数から、ドライバ層の「drv_led_r」関数を呼び出します。

 「……そんなことをしなくても、『ctrl_led_r』関数でLEDを点灯させればいいじゃないか。それに、全LEDを点灯したい時は、コントローラ層にある4つのモジュールを呼び出せばいいでしょ」と思うかもしれません。

 もちろん、それでもプログラムは動作しますが、そうすると「ハードウェアを直接制御するドライバ層とコントローラ層を分離する」という原点から外れてしまいます。

 「このくらい、いいじゃないか」「小さなモジュールなのだから、分からなくなったりしないし」と思うかもしれません。

――そんなとき思い出してほしいのが、プログラマーの心掛けです。

 こうしたところで油断すると、アッという間にプログラムの階層構造が中途半端なものになってしまいます。特に、プロジェクトチームで開発するような場合、各自の判断で原点から外れていってしまうと、プログラム全体の見通しが悪くなってしまいます。

 それでも、「どうせ、Pi:Co Classicは1人で開発しているんだから、自分が把握できていればそれでいいじゃん」と思う方もいらっしゃるかもしれません。

 そんな考えの方にお伝えしたいのが、「3カ月後の自分は他人」という格言(?)です。今のあなたが覚えていることを、3カ月後の自分が同じように覚えているとは限りません。運良く覚えていたとしても、さらに1年後、3年後はどうでしょうか。未来の自分の苦労を軽減するために、今の手間を惜しむのはやめましょう

 実は、ここまでオススメしてきたモジュール化/階層構造化にもデメリットはあります。一番の問題は、必要なモジュールをその都度呼び出すことになるので、その回数が増えると処理が遅くなるという点です。そのため、処理速度を優先するようなシステムの場合には、不都合が生じるかもしれません。もしも、このデメリットによる影響が大き過ぎるようならば、構造化を諦めるのではなくて、C言語を諦めてアセンブリ言語に移行することをオススメします。そうすれば、構造化とアセンブリ言語によるメリットを生かすことができるからです。

 アセンブリ言語自体は、構造化されていない言語(分岐命令を書かざるを得ない言語)です。しかし、モジュール化や階層構造化は可能で、十分に構造化されたプログラムを記述することができます。

北上

どう?

プログラムを階層構造化するメリットは理解できたかな?


えみ

な、なんとなく……。


北上

まぁ、最初は戸惑うかもしれないけど、実際にプログラムを書いてみれば分ってくると思うよ。


えみ

そうですかねぇ……。


北上

せっかく、マイクロマウスを通じて、組み込みシステムの勉強をするんだから、LEDやモータの動かし方を覚えるだけじゃなくて、全体を“システム”として捉えて、プログラムを作りたいんだよ。


えみ

なるほどー。


北上

自分で書いたプログラムで、『Pi:Co Classic』が迷路を走ったら、すっごくウレシイと思うけどなぁ。


えみ

ハイ! そうですね!

ワタシ、頑張ってみます!!

……。

……。

すいませーん、豚玉1枚追加で!





 さていよいよ次回から、プログラム作成です。まずはデバッグ用のLEDを制御するプログラムを書いて、階層構造化に慣れていきましょう。お楽しみに! (次回に続く

コラム:あらためて、Pi:Co Classicはこう動く!

 どうやら、えみちゃんも北上くんの熱い思いを聞いて、オリジナルでプログラムを組む気持ちになったようです。

 ここで、あらためて本連載のゴールを確認しておきましょう。次回から紹介するプログラムをPi:Co Classicに搭載すると、「センサーを使って壁の有無を判断し曲がる」ことができるようになります。機体調整とプログラムの制御をガンバれば、以下の動画のように迷路内を自律走行できます。

動画 これから連載の中で紹介するプログラムにより、Pi:Co Classicが迷路内を走行。自律的に壁の有無を判断し、多少姿勢がズレても制御して走行を継続する

 なお、筆者らは、2012年9月23日に科学技術館(東京都千代田区)で開催される「第30回 マイクロマウス 東日本地区大会」に参加します。マイクロマウスの走りをリアルで見たい方は、ぜひ会場にいらしてください。「ミツキラビット」という名でエントリーしているので、気軽に声を掛けてください!


⇒連載バックナンバーはこちら

ロボット/ロボット開発 コーナー

ロボット/ロボット開発コーナー ,/mn/subtop/features/robot/
あらゆる技術の集大成といわれる「ロボット」をテーマに、産業、レスキュー、生活支援/介護分野などにおけるロボット開発の実情や、関連する要素技術、研究開発、ロボットコンテスト、ロボットビジネスの最新動向などをお届けする。

>>コーナーTOPはこちらから


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.