それでは、スイッチの押下に応じて、LEDを点灯させるアプリケーションを作成していきましょう。
まず「ctrl.c」内に、LEDを2進数表示する関数を作成します。この「ctrl_led_num」関数は、引数に1〜15の数字を与えると、4つのLEDを制御するそれぞれの関数に「0」または「1」の値を送り、現在のモードをLEDに2進数で表示します(ソースコード6)。
void ctrl_led_num(int i_number) { //LEDで2進数を表示する drv_led_r(i_number & 0x0001); //1BIT……右 drv_led_fr((i_number & 0x0002) >> 1); //2BIT……前右 drv_led_fl((i_number & 0x0004) >> 2); //3BIT……前左 drv_led_l((i_number & 0x0008) >>3); //4BIT……左 }
ソースコード6 「ctrl_led_num」関数。論理積(AND)演算で、4つのLEDにON/OFFの指示を送りLEDを2進数表示する |
この「ctrl_led_num」関数を呼び出すアプリケーションが「app_dispMode」関数です(ソースコード7)。
void app_dispMode(int i_mode) { //モード表示 ctrl_led_num(i_mode); //LEDにモードを表示 }
ソースコード7 「ctrl_led_num」関数を呼び出すためのアプリケーション |
「app_dispMode」は、スイッチが押下されるごとに呼び出されるモード設定処理関数「app_getMode」から呼び出されます(ソースコード8)。青スイッチは、modeに1〜15をインクリメントしながら代入、赤スイッチは逆に15〜1をデクリメントしながら代入していきます。このmodeを引数にして、「app_dispMode」関数を呼び出せば、LEDが2進数で点灯します。
int app_getMode(int i_currentMode) { // int mode; unsigned char sw_b; //青スイッチの状態 unsigned char sw_y; //黄スイッチの状態 unsigned char sw_r; //赤スイッチの状態 // mode = i_currentMode; //モード初期化 // while(1) { //全てのスイッチの値を取得する ctrl_sw_all(&sw_b, &sw_y, &sw_r); //スイッチの値をチェック if(sw_b == SW_ON) { //青スイッチ押下 mode++; //モードをカウントアップ if(mode > 15) { mode = 1; } app_dispMode(mode); //モード表示 } else if(sw_r == SW_ON) { //赤スイッチ押下 mode--; //モードをカウントダウン if(mode < 1) { mode = 15; } app_dispMode(mode); //モード表示 } else if(sw_y == SW_ON) { //黄スイッチ押下 break; } } // return mode; }
ソースコード8 「ctrl_led_num」関数を呼び出すためのアプリケーション。黄ボタンをクリックしたら無限ループから抜ける |
「app_getMode」関数を「app_main」関数に記述(ソースコード9)すれば、スイッチの押下に応じて、Pi:Co Classicの4つのLEDが2進数表示されるアプリケーションの完成です。
void app_main(void) { int mode; //処理モード // mode = 1; //モード初期化 app_dispMode(mode); //モード表示 // while(1) { mode = app_getMode(mode); //モード設定 } }
ソースコード9 「app_main」関数内で、スイッチの押下に応じてLEDを2進数表示で点灯させるアプリケーションを呼び出す |
>>ソースコード(Mouse201211.lzh)のダウンロードはこちら
さぁ、プログラムをビルドして、Pi:Co Classicの動作を確認してみましょう。
青で1ずつ増えていって、赤で減る……っと。やったー! ちゃんと動いてますねぇー。
ホントにそうかなぁ〜(ニヤリ)。
えみちゃん。もう一度、よーく見ながらスイッチを押してみてごらん。
はーい。
……あっ、あれ? あれぇ〜。
今、変な動きしませんでしたか? 数字が飛んだように見えましたよ。
うん。実は、それがスイッチを制御するときの課題なんだ。
「チャタリング」って言ってだねぇ……(クワッ!!)。
(ヤバっ! センパイの“スイッチ”が入った!! これは、長くなるなぁ〜)。
あ、あの〜。センパイ!
なになに?
その話は、お茶休憩でもしながら伺わせてもらえませんか?
ワタシ、何だか疲れちゃってぇ〜。
OK!! じゃあ、そこのコンビニでジュースと何か甘いものでも買って来ようか?
頑張ったからおごるよ! あそこのコンビニのプリンはすごくうまいんだよ〜。
ワ、ワーイ(棒読み)!!
階層構造にも(何となく)慣れ、「スイッチ制御は楽勝!」と考えていたえみちゃん。マイコン制御初心者の誰もが最初に引っ掛かるチャタリングに、見事ハマってしまいました(その様子を北上くんも「ニヤリ」としながら見守っていましたね)。
さて、次回はスイッチを制御する際に、忘れてはならないチャタリング防止処理を組み込んでいきます。お楽しみに!(次回に続く)
前回のコラムで告知した通り、筆者らは2012年10月28日に開催された「第31回 マイクロマウス 中部地区大会」に出場してきました。
探索走行でゴールした後、重ね探索をしながらスタート地点へ向かったものの途中で壁にぶつかってしまい、最短経路を見つけることができませんでした。それでも第2走行では、現状のデータから経路を選択し、35秒565でゴールできました(ちなみに、最短走行は10月4日に行われた北陸大会で初達成済みです)。
次は、11月4日に行われる「第22回 マイクロマウス 九州地区大会」に参加。この大会で最終調整して、いよいよ、11月24〜25日に芝浦工業大学 豊洲キャンパス テクノプラザにて開催される「第33回 全日本マイクロマウス大会」に挑みます。「ミツキラビット」は24日のフレッシュマンクラスに出場します。応援してください!
関連リンク: | |
---|---|
⇒ | マイクロマウス九州支部 |
⇒ | マイクロマウス2012 |
Copyright © ITmedia, Inc. All Rights Reserved.