検索
連載

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

頭の中のアイデアを「Arduino(アルドゥイーノ)」で実現!! 筆者と一緒にモノづくりの喜びや難しさを体験・体感してみよう。連載第11回では、サーボモータを用いた「自動給餌器」を作る。これさえあれば、お留守番しているペットの食事を心配せずに思う存分残業できるぞ!!

Share
Tweet
LINE
Hatena
前のページへ |       

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

 “取りあえず”のただし書き付きですが、サーボモータの動作確認ができましたので、タイマーセット用のディスプレイを接続します。なお、ディスプレイを動かすスケッチは、連載第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」のような時計形式で指定したかったです……。しかし、そのためには“現在時刻の設定”をプログラムしなくてはならないので、今回はすっぱりと諦めました。

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

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

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

前のページへ |       

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る