“取りあえず”のただし書き付きですが、サーボモータの動作確認ができましたので、タイマーセット用のディスプレイを接続します。なお、ディスプレイを動かすスケッチは、連載第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.