アストロボーイへの道        astro1

12.  ソフトウェア

 各種パーツやソフトウェアを統合したアストロ1号のソフトウェアについて説明する。

(1)機能

 ・停止、後退、前進、右旋回、左旋回、右回避の6つの動作モードを持つ。
 ・右回避を除く5つのモードはIRリモコンから指示できる。コマンド受付をビープ音で知らせる。
 ・IRリモコンから右旋回または左旋回を指示した場合、0.2秒動作して前進モードになる。
 ・IRリモコンから後退を指示した場合、0.2秒動作して停止する。
 ・前方20cm以下にある障害物を超音波センサで検出してビープ音を発生して右回避する。
 ・停止時に7セグLEDにロゴマーク "AStro-1" を表示する。
 ・前進、右旋回、左旋回、後退の時の7セグLEDの表示は其々、"Fd"、"rt"、"Lt"、"bA"となる。
 ・障害物検出の際の7セグLEDの表示は全画素を点灯させた "8.8.8.8.8.8.8.8."となる。
 ・前進の場合、8個の単体LEDが0.2秒間隔で
前方向に移動点滅する。

 
(2)マクロフローチャート


                                  図1.マクロフローチャート



                                       図2.状態遷移図

(3)タイマー割込み

 Arduino UNOに搭載されているAVRマイコンATMega168は3個のタイマーを内蔵している。(表3を参照)
 このタイマーはIDEで用意されている関数の幾つかとPWM出力で使用され、ライブラリにあるタイマー割込を使用することもできる。
 しかし、同じタイマーを競合して使用した場合、誤動作を生ずるので注意が必要である。

         表1.タイマーと使用先

タイマー名称
ビット数
関数
PWMピン
タイマー割込
ライブラリ
Timer 0
8bit
delay(), millis(), micros()
5, 6

Timer 1
16bit

9, 10
TimeOne.h
Timer 2
8bit
tone()
3, 11
MsTimer2.h
タイマー未使用

pulseIn()




(4)タイマー割込を使った並列処理の検討

 表2で、主なCPU長時間占有の処理およびTimer使用の処理をリストアップして、競合の有無と問題点を検討した。

 No.2の障害物検出時のビープ音は500msとしているが、速度が300mm/sとすると20cm手前で障害物検出しても500ms空走す るため、回避動作は直前の5cm手前となり、余裕が無い。また、この時間内はIRリモコンを受付けないので、この時間は極力短くする必要があり、100 msまで短くすることにした。また、ビープ音発生のため使っているtone()関数はTimer2を使用しており、No.7のモータPWM駆動の analogWrite()関数と競合する。tone()関数は使用せざるを得ないため、モータのPWM駆動は行わなずに、disitalWrite() 関数を使って、モータ電流をON/OFFすることにする。
 同様に、No.5のビープ音も50 msに短縮する。
 
 No.3のIRリモコン リーダーコード検出については、IRリモコンを操作してコマンドを送信しない限り、この処理がループして他の処理が実行出来ない。対策としては、この処理 の中に時間監視を加えて、適当な経過時間があったら処理を抜け出すようにすれば良い。但し、この処理の中では、受信波形の変化点時刻の記録にmicros ()を使っており、同じTimer0を使ったmillis()は使えない。そこで、ライブラリの中からTimer1を使ったタイマー割込 TimeOne.hを使用することにした。

 TimerOne.hの使い方については、以下を参照した。

    Arduinoのタイマーライブラリ   TimeOne & TimerThree Libraries          Timer1


 No.8のモータ駆動時間については、これまでdelay()関数を使用していたが、CPUを占有するため、この処理の中ではIRリモコンか らのコマンドを受け付けない。そのため、delya()関数の代わりに、No.3のIRリモコン リーダーコード検出と置き換えることで、モータ駆動とリーダーコード検出処理を並列化し、モーター動作中でもIRリモコンからのコマンド受付可能とした。
 No.3で使用したTimerOne.hのタイマー割込時間をセットする関数 setPeriod()は、実験の結果、引数として変数は受け付けないことが分かった。そのため、タイマー割込時間はモーター動作に関係なく200 ms一定とすることにした。

 障害物がなく連続前進している時、IRリモコンからのコマンド発行有無判断はNo.3のIRリモコン リーダーコード検出処理(200 ms)の時間帯内でしか出来ない。コマンド発行有無判断ができない時間帯はNo.1の距離測定とその他の処理を合わせて最大20 ms程度なので、IRリモコンからの指示が失敗するのは10%程度の確率となる。

               表2.主なCPU占有/Timer使用の処理と対応方針
No.
名称
内容
関数
処理時間
CPU
Timer
対応方針
1
距離測定
超音波の障害物
反射波戻り時間測定
pulseIn()
0.15〜15 ms
(距離:2cm〜2m)
占有


2
ビープ音
(障害物検出)
障害物検出時ビープ音
tone()
障害物時のみ 500 ms
占有
Timer2
極力短く
100 ms
3
IRリモコン
リーダーコード検出
受信波形の変化点時刻を記録
micros()
13.5 ms 〜 ∞
占有
Timer0
Time1を使用したタイマー割込
TimeOne.hで時間制限(200 ms)
4
IRリモコン
データコード検出
同上
同上
リーダーコード検出時
36〜72 ms
占有
同上

5
ビープ音
(コマンド受付)
コマンド受付時ビープ音
tone()
コマンド受付時のみ
100 ms
占有
Timer2
極力短く
50 ms
6
7SEG LED表示
7SEG LEDへ
シリアルデータ送信
shiftOut()
約10 μs
(約200クロック)
占有


7
モータPWM駆動
モータ電流をアナログ制御
d-3, d-11ピン使用
analogWrite()
モータ駆動時
常時処理
占有
せず
常時
Timer2
PWMは使用せず、disitalWrite()
にしてON/OFFのみとする。
8
モータ駆動時間
モータ駆動時間
delay()
100〜1000 ms
占有
Timer0
リーダーコード検出処理200 msを
使用して、並列処理。(時間統一)


(5)プログラムリスト

 詳細プログラムリストを以下に示す。














                                            図3.プログラムリスト

< Topページへ戻る >