サーボモータを活用してオリジナル「自動給餌器」を作ろう!アイデア・ハック!! Arduinoで遊ぼう(11)(3/3 ページ)

» 2014年06月02日 10時00分 公開
[三月兎MONOist]
前のページへ 1|2|3       

あらためて「自動給餌器」を完成させよう!

 “取りあえず”のただし書き付きですが、サーボモータの動作確認ができましたので、タイマーセット用のディスプレイを接続します。なお、ディスプレイを動かすスケッチは、連載第9回で作成したものを流用します。

 以下、メインとなるloop()だけを掲載します(スケッチ2)。


void loop() {
    int sw_no;
    unsigned long current_time;
    // プログラムのモードによって処理を振り分ける
    switch(G_mode) {
        case MODE_SW_INPUT:
            // スイッチ入力モード
            sw_no = input_time();
            switch(sw_no) {
                case SW_UP:
                case SW_DOWN:
                    // スタートメッセージ領域をクリア
                    disp_start_message(" ");
                    // メッセージ領域をクリア
                    disp_message(" ");
                    break;
                case SW_START:
                    if(G_time < TIME_MIN) {
                        G_time = TIME_MIN;
                    }
                    G_start_time = millis();
                    G_blink_time = G_start_time;
                    // スタートメッセージを表示
                    disp_start_message("Start");
                    // メッセージを表示
                    disp_message("Hold on.");
                    // タイマーカウントモードにする
                    G_mode = MODE_TIMER_COUNT;
                    break;
            }
            G_blink_stat = BLINK_ON;
            break;
        case MODE_TIMER_COUNT:
            // タイマーカウントモード
            current_time = millis();
            if(current_time - G_start_time >= ONE_MINUITE) {
                // 1分経過
                G_time--;
                if(G_time <= 0) {
                    // 終了メッセージを表示
                    disp_start_message("End");
                    // メッセージを表示
                    disp_message("Come and get it!");
                    
                    // サーボモータを動かす
                    for(int pos = 0; pos <= 80; pos += 1) // 0〜80まで 1ずつ
                    {
                    // サーボ出力
                      myservo.write(pos);              // シャフトの角度を指示
                      delay(30);                       // 30ms待機
                    }
                    // ブリンクを停止
                    G_blink_stat = BLINK_OFF;
                    // スイッチ入力モードにする
                    G_mode = MODE_SW_INPUT;
                }
                G_start_time = current_time;
                G_blink_time = G_start_time;
                G_blink_stat = BLINK_ON;
            }
            // 実行中と分かるように時間をブリンクさせる
            if(G_blink_stat == BLINK_ON) {
                if(current_time - G_blink_time >= BLINK_ON_TIME) {
                    G_blink_stat = BLINK_OFF;
                    G_blink_time = current_time;
                }
            }
            else {
                if(current_time - G_blink_time >= BLINK_OFF_TIME) {
                    G_blink_stat = BLINK_ON;
                    G_blink_time = current_time;
                }
            }
            break;
    }
    // 時間を表示する(ブリンクあり)
    disp_time(G_time, G_blink_stat);
}
スケッチ2 「自動給餌器」のスケッチ。loopのみ抜粋

 連載第9回のスケッチから修正したのは、26行目43行目で表示しているメッセージの文字列。そして、45〜51行目に、サーボモータを動かすコードを追加しました。

 筆者が最初に書いたスケッチでは、サーボモータを動かす部分をmyservo.write(80);とし、いきなり規定値で動かしてみました。「載せてあるふたをスライドして開くだけだから、これで大丈夫だろう」と思ったのです。

 ところが、このやり方ではサーボをうまく固定することができませんでした。ふたが勢いよく動くので、慣性の法則が働くためです。ここは、for文を使って少しずつゆっくりと動かすことで解決しました。「リアルにモノを動かすのって、ちょっとしたコツがいるんだなぁ〜」と実感しました。

 自動給餌器を作ってみて、以前作った部品(ディスプレイ)のソースコードを流用できたのがうれしかったですね。小さなモノを作り、自分が使える部品を一つ一つ増やしていけば、いつかきっと本格的な電子工作もできるようになります(と信じてます)。そのときのためにも、「部品単位で動くスケッチを作りためておく」というのは大切だと思いました(今回は、最初にサーボモータだけが動くスケッチを作成しました)。

 また、複雑な電子工作にチャレンジすると、途中までちゃんと動いていたのに突然、動作が怪しくなるなんてことがよく起こります。トラブルの原因が「ソフトウェアにあるのか?」「ハードウェアにあるのか?」を切り分けるためにも、例えば、“ハードウェア(部品単位)の動作確認ができる小さなプログラム”があれば、原因究明の助けになります。自分用の部品ストックは、開発の資産です。

 今回作成した自動給餌器のスケッチは、以下からダウンロードできます。

>>スケッチ(mono11.zip)のダウンロードはこちら



 お気付きかと思いますが、本当はタイマーのセットを「3分後」ではなく、「18:30」のような時計形式で指定したかったです……。しかし、そのためには“現在時刻の設定”をプログラムしなくてはならないので、今回はすっぱりと諦めました。

 このように、実際に自分で挑戦してみると、わずかな機能でも難しかったり、開発にちゅうちょしてしまったりすることがあります。そう考えると、普段、当たり前のように使っている電化製品の機能(それも機能の大小にかかわらず)の一つ一つを実現しているエンジニアの皆さんは「ホントにすごいんだなぁ〜」とあらためて感心してしまいました。

 さて、次回は「拡張シールド」を使った電子工作に挑戦します。お楽しみに!! (次回に続く

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

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.