LEDフラッシャと招き猫ロボットの動作は何が違うのか? 制御プログラムの構造をあらためて眺めてみよう!
――何事も勝利を収めるには、攻めも守りも必要である。LEDフラッシャの制御を“守り”とするなら、本シリーズで扱っているモータの回転制御は、若干“攻め”に近い。今回は“攻め(モータの回転)”の制御に必要な要素について考えてみよう。
休載期間の長かった本連載「マイコン制御基礎の次」が、今回(第7回)から再開する。長い間連載をストップしてしまったことを心からおわびしたい。
(あらためて)本連載のゴールは、
「モータで腕を上下させるだけのロボットを題材とし、腕の上下動を制御して招き猫に化けさせて福を招く」
である(注)。
このロボットの腕の付け根には、「マイクロスイッチ」が仕込んである。このスイッチのON/OFFで、何回“招き”動作を行ったかを感知する。マイコンに書き込んだ制御プログラムは、指定した回数だけの“招き”が行われたら停止する設定となっている。今回は3回の“招き”動作を行うこととしている。
マイコン回路の最初の一歩のお約束に用いられることが多いLEDフラッシャは、基本的に
だけで動作させられる。
人間の目でLEDの点滅が見えるように「High」「Low」を切り替えるには、「High」「Low」の表示時間を長くすればよい。何か意味のある点滅を行わせたかったら、設定した点滅パターンに対して、「High」「Low」の切り替えを行えるようにすればよい。
本連載第1シリーズでは、モールス信号の「I」を繰り返すLEDフラッシャを紹介した。このプログラムの構造は、次の図のようになっている。
この図で番号が順不同になっているのは、アセンブラのプログラムではメインルーチンを最後に書く場合が多く、その慣習に従ったからだ。この場合、プログラムを読んだときの流れと処理の流れが一致しないのだが、図の各ブロックに記載した番号は処理の順序(かつ解説の順序)である。
今回の「招き猫」の制御プログラムも、基本的には同じ構造になっている(「同じ人が書いたプログラムだから」「LEDフラッシャの延長として『招き猫』を作ったから」という理由もあるけれども)。
「招き猫」の制御プログラムの構造を図示すると、この図のようになる(図2)。
LEDフラッシャプログラムとの違いは、メインルーチンの中がやや複雑であることと、スイッチによるセンシング、スイッチの状態確認のために設けたLED・モータの動作制御に関するサブルーチン群が存在することだけである。
回路にはモータの状態を確認するためのLEDを配置し、モータは「負論理」、LEDは「正論理」で動作させているので、それぞれに対する考慮が必要になり、なおかつソースコードの行数が長くなっている。しかし、基本的にはそれほど理解が難しい話ではない。
次に、プログラムの流れと、各ブロックで行っている処理について見てみよう。
インクルードファイルの読み込み、グローバル定数(アセンブラの世界ではそう呼ばないが)定義、レジスタへの別名定義が行われている。
リセット時にプログラムメモリの0番地から実行することを記述し、「RESET:」ラベルへ飛ぶ。
リセット処理の後、処理はサブルーチンを飛び越してここに移る。サブルーチンや割り込み処理を、順次実行されるプログラム本体の流れと関係ないこのような場所に置いておくことで、可読性を高め、予想していない誤動作を避けることができる。
このプログラムではサブルーチンコールを用いる。サブルーチンへの分岐の際には、どこに戻ってこればよいかを「スタック」と呼ばれるタイプの記憶領域に記述しておく。ここでは、RAMの最終番地からゼロ番地に向かってスタックとして用いるため、スタックポインタにRAMの最終番地をセットする。さらに、「PORT Bの8つのポートをすべて出力にする」「PORT Dの8つのポートをすべて入力にする」という処理を行う。
モータの回転を開始
↓
スイッチの状態をチェック
↓
指定回数だけモータを回転させる
↓
モータの回転を停止
という処理を行うために、これらの処理に必要なサブルーチンをコールしている。
スイッチの状態をチェックするためのルーチン。今回は、「スイッチの状態がON→OFFとなる」だけをチェックすれば十分なので、そのためのサブルーチンを設けた。
スイッチの状態をチェックするために、基板に設けたLEDのON/OFFを行うサブルーチン。
モータのON/OFFを行うサブルーチン。
Copyright © ITmedia, Inc. All Rights Reserved.