“取りあえず”のただし書き付きですが、サーボモータの動作確認ができましたので、タイマーセット用のディスプレイを接続します。なお、ディスプレイを動かすスケッチは、連載第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); }
連載第9回のスケッチから修正したのは、26行目と43行目で表示しているメッセージの文字列。そして、45〜51行目に、サーボモータを動かすコードを追加しました。
筆者が最初に書いたスケッチでは、サーボモータを動かす部分をmyservo.write(80);とし、いきなり規定値で動かしてみました。「載せてあるふたをスライドして開くだけだから、これで大丈夫だろう」と思ったのです。
ところが、このやり方ではサーボをうまく固定することができませんでした。ふたが勢いよく動くので、慣性の法則が働くためです。ここは、for文を使って少しずつゆっくりと動かすことで解決しました。「リアルにモノを動かすのって、ちょっとしたコツがいるんだなぁ〜」と実感しました。
自動給餌器を作ってみて、以前作った部品(ディスプレイ)のソースコードを流用できたのがうれしかったですね。小さなモノを作り、自分が使える部品を一つ一つ増やしていけば、いつかきっと本格的な電子工作もできるようになります(と信じてます)。そのときのためにも、「部品単位で動くスケッチを作りためておく」というのは大切だと思いました(今回は、最初にサーボモータだけが動くスケッチを作成しました)。
また、複雑な電子工作にチャレンジすると、途中までちゃんと動いていたのに突然、動作が怪しくなるなんてことがよく起こります。トラブルの原因が「ソフトウェアにあるのか?」「ハードウェアにあるのか?」を切り分けるためにも、例えば、“ハードウェア(部品単位)の動作確認ができる小さなプログラム”があれば、原因究明の助けになります。自分用の部品ストックは、開発の資産です。
今回作成した自動給餌器のスケッチは、以下からダウンロードできます。
お気付きかと思いますが、本当はタイマーのセットを「3分後」ではなく、「18:30」のような時計形式で指定したかったです……。しかし、そのためには“現在時刻の設定”をプログラムしなくてはならないので、今回はすっぱりと諦めました。
このように、実際に自分で挑戦してみると、わずかな機能でも難しかったり、開発にちゅうちょしてしまったりすることがあります。そう考えると、普段、当たり前のように使っている電化製品の機能(それも機能の大小にかかわらず)の一つ一つを実現しているエンジニアの皆さんは「ホントにすごいんだなぁ〜」とあらためて感心してしまいました。
さて、次回は「拡張シールド」を使った電子工作に挑戦します。お楽しみに!! (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.