「動き」のセンシングと制御マイコン制御基礎の次(7)(1/2 ページ)

LEDフラッシャと招き猫ロボットの動作は何が違うのか? 制御プログラムの構造をあらためて眺めてみよう!

» 2011年01月21日 00時00分 公開
[みわよしこ(執筆協力:山本 栄一、小椋 秀一、宇野 雄騎),@IT MONOist]

――何事も勝利を収めるには、攻めも守りも必要である。LEDフラッシャの制御を“守り”とするなら、本シリーズで扱っているモータの回転制御は、若干“攻め”に近い。今回は“攻め(モータの回転)”の制御に必要な要素について考えてみよう。

はじめに:連載再開に当たり

 休載期間の長かった本連載「マイコン制御基礎の次」が、今回(第7回)から再開する。長い間連載をストップしてしまったことを心からおわびしたい。

本連載のゴールを再確認!

 (あらためて)本連載のゴールは、

「モータで腕を上下させるだけのロボットを題材とし、腕の上下動を制御して招き猫に化けさせて福を招く」

である(注)。

第3シリーズのゴール「招き猫」画像1 第3シリーズのゴール「招き猫」

 このロボットの腕の付け根には、「マイクロスイッチ」が仕込んである。このスイッチのON/OFFで、何回“招き”動作を行ったかを感知する。マイコンに書き込んだ制御プログラムは、指定した回数だけの“招き”が行われたら停止する設定となっている。今回は3回の“招き”動作を行うこととしている。

※注:
本連載で扱ってきたマイコンは、Atmel AVRシリーズの「Atmega16」であるが、現在はアーキテクチャ・命令セット共通の省電力タイプ「ATmega16A」に置き換えられている。


LEDフラッシャと招き猫の動作は何が違うのか?
―「招き猫」の制御プログラムの構造―

 マイコン回路の最初の一歩のお約束に用いられることが多いLEDフラッシャは、基本的に

  1. LEDを接続したポートを出力に設定する
  2. 1.のポートの電位の「High」「Low」を切り替える

だけで動作させられる。

 人間の目でLEDの点滅が見えるように「High」「Low」を切り替えるには、「High」「Low」の表示時間を長くすればよい。何か意味のある点滅を行わせたかったら、設定した点滅パターンに対して、「High」「Low」の切り替えを行えるようにすればよい。

 本連載第1シリーズでは、モールス信号の「I」を繰り返すLEDフラッシャを紹介した。このプログラムの構造は、次の図のようになっている。

プログラムの構造と制御のフロー図 図1 プログラムの構造と制御のフロー図

 この図で番号が順不同になっているのは、アセンブラのプログラムではメインルーチンを最後に書く場合が多く、その慣習に従ったからだ。この場合、プログラムを読んだときの流れと処理の流れが一致しないのだが、図の各ブロックに記載した番号は処理の順序(かつ解説の順序)である。

 今回の「招き猫」の制御プログラムも、基本的には同じ構造になっている(「同じ人が書いたプログラムだから」「LEDフラッシャの延長として『招き猫』を作ったから」という理由もあるけれども)。

 「招き猫」の制御プログラムの構造を図示すると、この図のようになる(図2)。

「招き猫」の制御プログラムの構造 図2 「招き猫」の制御プログラムの構造

 LEDフラッシャプログラムとの違いは、メインルーチンの中がやや複雑であることと、スイッチによるセンシング、スイッチの状態確認のために設けたLED・モータの動作制御に関するサブルーチン群が存在することだけである。

 回路にはモータの状態を確認するためのLEDを配置し、モータは「負論理」、LEDは「正論理」で動作させているので、それぞれに対する考慮が必要になり、なおかつソースコードの行数が長くなっている。しかし、基本的にはそれほど理解が難しい話ではない。

 次に、プログラムの流れと、各ブロックで行っている処理について見てみよう。

(1)設定・定義

 インクルードファイルの読み込み、グローバル定数(アセンブラの世界ではそう呼ばないが)定義、レジスタへの別名定義が行われている。

(2)リセット処理

 リセット時にプログラムメモリの0番地から実行することを記述し、「RESET:」ラベルへ飛ぶ。

(3)RESET: ラベル

 リセット処理の後、処理はサブルーチンを飛び越してここに移る。サブルーチンや割り込み処理を、順次実行されるプログラム本体の流れと関係ないこのような場所に置いておくことで、可読性を高め、予想していない誤動作を避けることができる。

(4)初期化処理

 このプログラムではサブルーチンコールを用いる。サブルーチンへの分岐の際には、どこに戻ってこればよいかを「スタック」と呼ばれるタイプの記憶領域に記述しておく。ここでは、RAMの最終番地からゼロ番地に向かってスタックとして用いるため、スタックポインタにRAMの最終番地をセットする。さらに、「PORT Bの8つのポートをすべて出力にする」「PORT Dの8つのポートをすべて入力にする」という処理を行う。

(5)メインルーチン

 モータの回転を開始

 ↓

 スイッチの状態をチェック

 ↓

 指定回数だけモータを回転させる

 ↓

 モータの回転を停止

という処理を行うために、これらの処理に必要なサブルーチンをコールしている。

(6)スイッチ関連サブルーチン

 スイッチの状態をチェックするためのルーチン。今回は、「スイッチの状態がON→OFFとなる」だけをチェックすれば十分なので、そのためのサブルーチンを設けた。

(7)LED関連サブルーチン

 スイッチの状態をチェックするために、基板に設けたLEDのON/OFFを行うサブルーチン。

(8)モータ関連サブルーチン

 モータのON/OFFを行うサブルーチン。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.