スイッチの仕様を考え、プログラムに落とし込もう!マイクロマウスで始める組み込み開発入門(7)(3/3 ページ)

» 2012年11月02日 12時50分 公開
[三月兎MONOist]
前のページへ 1|2|3       

LEDを2進数表示するアプリケーション

 それでは、スイッチの押下に応じて、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の動作を確認してみましょう。

動画2 青と赤のスイッチ押下に合わせて、LEDが2進数で表示されている。……が、時々、なぜか数字が飛んでしまう!?

えみ

青で1ずつ増えていって、赤で減る……っと。やったー! ちゃんと動いてますねぇー。


北上

ホントにそうかなぁ〜(ニヤリ)。

えみちゃん。もう一度、よーく見ながらスイッチを押してみてごらん。


えみ

はーい。

……あっ、あれ? あれぇ〜。

今、変な動きしませんでしたか? 数字が飛んだように見えましたよ。


北上

うん。実は、それがスイッチを制御するときの課題なんだ。

チャタリング」って言ってだねぇ……(クワッ!!)。


えみ

(ヤバっ! センパイの“スイッチ”が入った!! これは、長くなるなぁ〜)。

あ、あの〜。センパイ!


北上

なになに?


えみ

その話は、お茶休憩でもしながら伺わせてもらえませんか?

ワタシ、何だか疲れちゃってぇ〜。


北上

OK!! じゃあ、そこのコンビニでジュースと何か甘いものでも買って来ようか?

頑張ったからおごるよ! あそこのコンビニのプリンはすごくうまいんだよ〜。


えみ

ワ、ワーイ(棒読み)!!





 階層構造にも(何となく)慣れ、「スイッチ制御は楽勝!」と考えていたえみちゃん。マイコン制御初心者の誰もが最初に引っ掛かるチャタリングに、見事ハマってしまいました(その様子を北上くんも「ニヤリ」としながら見守っていましたね)。

 さて、次回はスイッチを制御する際に、忘れてはならないチャタリング防止処理を組み込んでいきます。お楽しみに!(次回に続く

コラム:「ミツキラビット」第2走行に成功!

 前回のコラムで告知した通り、筆者らは2012年10月28日に開催された「第31回 マイクロマウス 中部地区大会」に出場してきました。

 探索走行でゴールした後、重ね探索をしながらスタート地点へ向かったものの途中で壁にぶつかってしまい、最短経路を見つけることができませんでした。それでも第2走行では、現状のデータから経路を選択し、35秒565でゴールできました(ちなみに、最短走行は10月4日に行われた北陸大会で初達成済みです)。

動画3 「第31回 マイクロマウス 中部地区大会」のミツキラビット。第2走行に成功し、記録は35秒565でした

 次は、11月4日に行われる「第22回 マイクロマウス 九州地区大会」に参加。この大会で最終調整して、いよいよ、11月24〜25日に芝浦工業大学 豊洲キャンパス テクノプラザにて開催される「第33回 全日本マイクロマウス大会」に挑みます。「ミツキラビット」は24日のフレッシュマンクラスに出場します。応援してください!


⇒連載バックナンバーはこちら

ロボット/ロボット開発 コーナー

ロボット/ロボット開発コーナー ,/mn/subtop/features/robot/
あらゆる技術の集大成といわれる「ロボット」をテーマに、産業、レスキュー、生活支援/介護分野などにおけるロボット開発の実情や、関連する要素技術、研究開発、ロボットコンテスト、ロボットビジネスの最新動向などをお届けする。

>>コーナーTOPはこちらから


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.