マジカルボックスの動作についておさらいしよう
マジカルボックスは、以下の3つの仕事をします。
- 冒頭4回のスプーン音の間隔を計測する
- その後計測間隔ごとのスプーン音の有無によって、4打相当の命令コードを読み取る
- パソコンに送信する
これらの仕事を実現するために、以下の4つの機能を使います。
- スプーンの音を読み取る
- LEDを点灯させる
- 時間を計測する
- データを送信する
まずはプログラムの構造からみてみよう
OS上で動作するようなアプリケーションプログラムでは、基本的にはOSの世界のルールにしたがって動作手順を記述すればプログラムは完成します。しかし、マジカルボックスのような小規模でOSもなにもないような組み込みソフトウェアでは、この動作を実現するためのハードウェア要件(なにが必要か)も考える必要があります。まずアプリケーションを動作させる土台(世界)から作ってやる必要があるのです。
マジカルボックスでは、前記4つの機能に対応して4つのハードウェア資源を使用しています。
- 入力ポート
- 出力ポート
- タイマ
- シリアル通信
上記Aのスプーンの音を読み取る機能は、入力ポートを読むことで音があったかどうかがわかる回路(仕様)になっています。
上記BのLEDは、出力ポートにそれぞれ接続されています。
上記Cの時間の計測に使用しています。マジカルボックスでは、計測用に1つ、時間待ち用に1つ、合計2つのタイマを使っています。
上記Dのデータ送信の機能で使用しています。マジカルボックスではマイコンのシリアル通信を利用して、それを回路でUSBに変換してパソコンに送信しています。
マイコンのハードウェアを使うには、それぞれに専用の駆動プログラムを対応させます。この専用の駆動プログラムのことを一般にデバイスドライバと呼びます。デバイスドライバは、ハードウェアの世界と装置の動作を記述したプログラム(アプリケーション)との橋渡しをする役目を担っています。
ここまでの内容をまとめると、マジカルボックスに必要なプログラムは以下のようになります。
1. 動作を実現するプログラム(アプリケーション) | a. スプーン音の間隔を計測するプログラム |
b. 命令コードを読みとるプログラム | |
c. パソコンに命令を送信するプログラム | |
2. 必要なデバイスドライバと使用するハードウェア | d. スプーン音ドライバ ← 入力ポート |
e. LEDドライバ ← 出力ポート | |
f. ストップウォッチ(時間計測) ← タイマ | |
g. データ送信ドライバ ← シリアル通信 |
それぞれに対応したプログラムを作成して、ソフトウェアの部品を揃えます。部品を組み立てれば、目的の動作をするソフトウェアができあがります。図1にソフトウェア部品を構造にまとめたものを示します。
最下層はマジカルボックスで使用しているハードウェアです。スプーン音を拾うための超音波検出回路が入力ポートに、表示LEDが出力ポートに、パソコンのUSBに接続する回路がシリアル通信に接続されています。あとは時間を計測するためのタイマです。
これらマイコンのハードウェア資源には、それぞれ対応したプログラムを用意しています。それが中段に位置するデバイスドライバです。
最上段にあるアプリケーションの層には、マジカルボックスの動作を決定するプログラム群が位置しています。これらは動作を実現するために、たとえば音を待ったり、LEDを点灯したりする必要があります。しかしここから直接ハードウェアにアクセスしたりはせず、SOUND(音)であるとかLEDであるとかのデバイスドライバを呼び出すようにしています。
たとえば一番左のLEDを点灯したいときは、「LED」というデバイスドライバに、「一番左のLEDを光らせよ」と命令を出します。このとき、"一番左のLED"が、どのポートに接続されているのか、1で光るのか0で光るのかなどはアプリケーションは一切知る必要がありません。それはデバイスドライバが解決してくれるのです。このような構造にすることで、ハードウェアの仕様変更などに強いプログラムにすることができます。デバイスドライバは、単にハードウェアを制御するだけでなく、ハードウェアを抽象化する目的も担っているのです。