マイクロマウス製作五十四日目


こんにちは!
最近、本を読みたい欲がとても強いです。
実はしばらくあまり本を読んでいなかったのですが、最近になって燃えてきました。
昨日は、2時間あまりかけて書店2店舗を見て回りましたが、読みたいと思う本に出会えず残念でした。
面白い本があったら教えていただきたいです。

さて、関西地区大会から凱旋し、マイクロマウスへの情熱をさらに燃やした松崎。
さらなる目標として、「速さ」か「確実性」か…。
悩ましいところです。

私としては、やはりスラロームとやらをぜひとも我が物にしてジェニちゃんを速く鍛えてあげたいところでもあるのですが、
その前に、確実に完走することもマイクロマウスにとっては非常に重要です。

ですから、関西地区大会で同じくPi:Co Classicを使用して出場した久住さん、兎さんにその存在を教えていただいた「壁切れ補正」の実装を目標にしたいと思います。
壁切れ補正とは、壁の切れ目をセンサで感知して、マウスが区画を正しく認識できているかどうか都度補正するものです。
今のジェニちゃんはトレッドの調整が甘いと、コーナーがあればあっただけ誤差が生じてしまいますが、
壁切れ補正を実装すると、コーナーの度に補正がかかりより確実な走行が可能になります。

と、いうことで、早速のり先生にプログラムを教えてもらいます。

まず初歩の初歩として、Pi:Co Classicがどのようにして得たアナログのデータ(電圧としてCPUに入る)をデジタルに変換してプログラムを走らせているのかを教わりました。

R0011935

壁切れ補正は、割り込みを使うため、割り込みについて書いてあるinterrupt.cを上から順に解説と共に見ていきました。

Pi:Co Classicの割り込み用タイマー「CMT」は、電圧の監視も担当しています。
上から見ていくと、このプログラムがまず書いてあります。

Pi:Co Classicは、電圧を監視した結果をLEDの色で教えてくれます。
2色のLEDの色の変化で電圧の寡多がわかるようになっているのです。
(写真だとちょっとわかりづらいですね…)
写真 2013-07-18 11 50 49

いつも調整などなどでGenieちゃんを長時間酷使してしまう私は、このLEDによく助けられましたw

その電圧監視結果をLEDの点灯として反映させるプログラムはinterrupt.cの以下の部分に書かれています。


bled_cnt++;
 if(bled_cnt > 10){
 bled_cnt= 0;
 }

 if( (10.0 * (voltage - BATT_MIN) / (BATT_MAX - BATT_MIN)) > bled_cnt ){
 BLED0 = 1;
 BLED1 = 0;
 }else{
 BLED0 = 0;
 BLED1 = 1;
 }

このプログラムによって、電圧監視用LEDは色を変えて私たちに電池交換のタイミングを教えてくれます。

でも…ど、どうやって…!?
もしかしてお詳しい方は上記を見ただけで理屈がわかるのかもしれないですが、
松崎にはどうもわからないので、具体的な数値を入れて計算してみます。
試してみないとわからないのです…。

※前提
static_parameter.hを見ると、BATT_MAX(電池いっぱい)時のAD変換値は645。BATT_MIN(電池ないよ~)時のAD変換値は538となっています。
BLED0が1になると赤色、BLED1が1になると青色に光ります。

それを
if( (10.0 * (voltage – BATT_MIN) / (BATT_MAX – BATT_MIN)) > bled_cnt )
の式に入れ、あらゆる場合のAD変換値(電池残量)を「voltage」に代入してみます。

お腹ぺこぺこ(電池が全くない)数値=538を代入
10×(538-538)/(645-538)=0となり、bled_cntがどんな数字になろうと式が成り立たず、BLED0が1になり、赤色に光ります。
この処理を「++」の指示通り10になるまで繰り返しても、BLED1は0のまま。青に光ることはないです。
つまり、電圧監視用LEDは真っ赤に煌々と光り続ける→ヤバイ!電池交換しないと!

お腹いっぱい(電池ばりばり!)数値=645を代入
10×(645-538)/(645-538)=10となり、bled_cntが10まで数える間、10以外の数字のときは式が成り立つので、BLED1が1になり、青色に光ります。ただ、11回に1回だけbled_cntが10になったとき、「10>10」という式になってしまい、BLED0が1になり赤色が光るのですが、1秒に1000回という非常に短い時間しか光らないので、人間の目には青色に光り続けているように見えるというわけです。

お腹まあまあ(電池普通)数値=590を代入
10×(590-538)/(645-538)=だいたい5くらいとなり、bled_cntが10まで数えるうちのだいたい半分ずつ青色、赤色に点灯→紫に光る

のです!!!!!!!!!!
のり先生に教えてもらって理解した瞬間ものすごい感動に包まれました…!!

※プログラムの2行目、
if(bled_cnt > 10)」は、「if(bled_cnt => 10)」の間違いだそうです。
佐倉さんにブログを見てもらったところ発覚しました…!

ということで、
今日は壁切れ補正への初段階として、こんな感じにアナログデジタル変換について解説してもらいました。
(松崎はいたるところで質問をするので結構話が飛んじゃいます…)

まだまだ壁切れ補正への扉をノックもしてないような段階ですが、
早速ワクワクしてきたぞ~~!!


Posted in Pi:Co Classic製作記