ここまでできたら、スイッチドライバにチャタリング防止機能を組み込むのはカンタンです。
「drv.h」内に変数「CHAT_WAIT」を宣言し(ソースコード8)、「drv.c」内にウェイト関数「drv_wait_ms」を作成します(ソースコード9)。
//ウェイト時間 #define CHAT_WAIT 10 //チャタリング回避用待ち時間(ms)
ソースコード8 「drv.h」にCHAT_WAITを追加 |
void drv_wait_ms(int i_ms) { //ms単位で待ち時間を生成する int startCount; // startCount = G_TimerCount; // while((G_TimerCount - startCount) < i_ms);
ソースコード9 「drv.c」に引数に与えた秒数間待機するウェイト関数を作成する |
そして、前回作った「char drv_sw_r」関数に、「drv_wait_ms」関数の呼び出しを追加するだけです(ソースコード10)。
unsigned char drv_sw_r(void) { //スイッチドライバ(赤) drv_wait_ms(CHAT_WAIT); //チャタリング防止のためWAIT //スイッチを読み込む return SW_RED; }
ソースコード10 スイッチドライバ関数に、チャタリング防止のためのウェイト関数を追加する。スイッチドライバ(黄)(青)でも同様に追加する |
これでスイッチにCMT割り込み処理を使った、チャタリング防止機能を追加できました。さぁ、プログラムをビルドして、Pi:Co Classicの動作を確認してみましょう!
>>ソースコード(Mouse201212.lzh)のダウンロードはこちら
やったぁ〜! 今度はちゃんと動いてますよ!!
うん。よく頑張ったね。
最初は「ラクショー!」って思ったのに、ハードウェアを正確に動かすのって、大変なんですねぇ。
そうだね。
最初のうちは、覚えることがたくさんあるから難しく感じるよね。
はい。
正直言うと、今回のCMTと割り込み処理もまだ完全に理解できていません(ガクっ)。
プログラムを書いた後に、書籍や参考記事を読むとさらに理解が深まるよ!
はい、そうしてみます!
……ところでぇ〜。センパイ、お腹が空きました! ご飯行きましょうよぉ〜。
よし、今日は寒いからラーメンでも食べに行こう!
わーい。ギョーザも食べたいなー。
実は、スイッチにはいろいろなタイプがあり、全てにおいて、今回紹介した対策が有効とは限りません。スイッチによっては、他の工夫が必要になる場合もあります。
最初は軽く考えていたスイッチの制御について、その奥深さを知ったえみちゃん。次回は、MTUを使ってブザーを制御します。お楽しみに! (次回へ続く)
筆者らは、2012年11月24、25日に芝浦工業大学で開催された「第33回 全日本マイクロマウス大会」に出場しました。最年少の中学生から大学生を中心に100人のエントリーがあったフレッシュマンクラスです。われらが「ミツキラビット」は、8×8区画迷路で行われた予選を8位で通過することができました!
そして、16×16区画迷路の決勝競技では、第1走行で探索に成功し無事にゴール! ただし、まだ全面探索ができていないため、走るたびに帰路では重ね探索を繰り返しました……。そのため、最短コースを走れたのは4、5回目のみ。4回目の30秒255が走行記録となりました(5回目は29秒台でしたが、途中でタイムアップとなり残念ながら参考記録に)。
今大会で優勝した「_H2_(製作:Eum Sang-Hoon&Lee Jae-Seong氏)の記録は7秒434!! 残念ながらミツキラビットは10位という結果に終わりましたが、シニアがマイクロマウスに“初チャレンジ”していることを評価いただき、特別賞を受賞しました。来年に向けての課題は、「効率の良い探索ロジックとスラローム走行」です!
Copyright © ITmedia, Inc. All Rights Reserved.