ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

はじめての電子工作 Arduinoで金魚の自動餌やり機を自作してみた

こんにちは、koheiです。

最近、電子工作をやってみたくて、Arduino(アルドゥイーノ)というマイコンボードを買いました。
色々動かしているうちに、楽しくなって「金魚の自動餌やり機」を作ってみました。
年末年始は、長く家を空けることになるので、この自動餌やり機が活躍してくれるでしょう!!

ということで、今回は、Arduinoを使った金魚の自動餌やり機の作成を紹介します!

スポンサーリンク

Arduinoとは?

Arduinoとは、結構安く入手できるマイコンボードです。

Arduinoとは、2005年イタリアの大学教授Massimo Banzi氏らによって、電気・電子の学生らが簡単に手にとって学べる安価なマイコンボード教材として開発されたものです。

要は、Arduinoのマイコンボードに色んなセンサーを繋げて、LEDを光らせたり、モーターを駆動させたりできます。
※モーターやLEDを制御するためにプログラムを作る必要があります。

ボード本体だけだと大体3,000円ぐらいで購入できます。
僕は、以下の書籍と一緒に基本キッドという実験セットを買いました。

Arduino IDEのインストール

Arduinoを制御するには、Arduino IDEという開発環境をパソコンにインストールする必要があります。
Arduino IDEは無料でダウンロードできます。
以下のサイトへアクセスします。
Arduino IDE


自分の環境に合ったOSを選択しましょう。私はMacなので、Mac OS Xを選択。


次に、JUST DOWNLOADをクリックし、Arduinoのzipファイルをダウンロードします。


zipファイルを解凍するとArduinoのアイコンが出来ます。これをアプリケーションフォルダへ移動させましょう。


Arduinoを起動させてみましょう。上記のような画面がでれば、OKです。
この画面で色々コードを記載していきます。

金魚の自動餌やり機

さて、一通り書籍と実験キットを使ったので、早速金魚の自動餌やり機の作成してみました。

1.準備したもの

餌やり機を制作するために準備したものです。基本的に「みんなのArduino入門:基本キット」で足りますが、サーボモーターと電池は購入しました。

・Arduino本体ボード
・ブレッドボード
・ジャンパワイヤ
・LED×2
・タクトスイッチ
・サーボモーター(SG90)
・電池(9V)・・・Arduinoを電池駆動させるために使用。
・電池とArduinoをつなぐためのコネクタ(電子パーツ屋さんで購入)
・紙コップ
・画用紙
・箱

3.回路図

回路図は、以下です。ブレッドボードを使えば、半田付けする必要はないので、簡単に回路を組むことができます。

配線説明
・タクトスイッチ:Arduinoのデジタルピン(2)、ArduinoのGNDピンと繋がっています。
・LED(赤):LEDのアノード(長い足)がArduinoのデジタルピン(13)、LEDのカソード(短い足)がArduinoのGNDピンと繋がっています。
・LED(緑):LEDのアノード(長い足)がArduinoのデジタルピン(12)、LEDのカソード(短い足)がArduinoのGNDピンと繋がっています。
・サーボモーター:Arduinoの5VとGND、デジタルピン(9)と繋がっています。

2.自動餌やり機の仕様

今回の自動餌やり機は、2つのモードを持たせました。

・手動連続餌やりモード
タクトスイッチを短押しすると、LED(赤)が点灯し、プログラムで設定した角度でモーターが動きます。
もう一度、短押しすると、LED(赤)が消灯し、元の角度に戻ったら停止します。
※停止させるまで、連続で動作します。

・タイマー餌やりモード
タクトスイッチを長押しすると、LED(緑)が点灯し、プログラムで設定した時間が経過すると自動でモーターが動きます。
短押しすると、タイマー餌やりモードが解除されます。
※解除するまで、設定した時間経過で繰り返し動作します。

4.コード

今回作成した自動餌やり機のコードは以下となります。
そのまま利用してみたい方は、Arduino IDEにソースコードをコピペしてください。
※コード解説は、時間があるときに、別途更新しておきます。

補足
・MsTimer2というライブラリを使ってますので、ライブラリのインストールが必要です。

Arduino IDEのメニュー「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択します。

「MsTimer2」で検索し、インストールをクリックしましょう。

・motor_action()関数の動作させる角度については、私の環境で調整したものですので、ご自分の環境に合った数値を調整してください。(94行目〜)
・タイマー餌やりモードは、9時間経過で動作するようにしています。71行目のif文の数値を変えれば、変更できます。(71行目)

#include <MsTimer2.h>

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>


Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(2, INPUT_PULLUP); //タクトスイッチの設定
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  attachInterrupt(0, chgsw, CHANGE);
  Serial.begin(9600);
  myservo.write(180);              // tell servo to go to position in variable 'pos'

  MsTimer2::set(1000, timecnt);
  MsTimer2::start();
  
}

volatile boolean sw=false;
int ct=0;
int pt=0;

volatile boolean timer_mode=false;
volatile boolean tsw=false;
int long_key_t=0;


//タイマー関連
int sec_cnt=0;
int min_cnt=0;
int hour_cnt=0;

void timecnt() {
  if(!timer_mode){
    return;
  }
  //1000ms->1s毎に呼び出される
  sec_cnt++;
  Serial.print(hour_cnt);
  Serial.print("h");
  Serial.print(min_cnt);
  Serial.print("min");
  Serial.print(sec_cnt);
  Serial.println("sec");
  if(sec_cnt > 59)
  {
    //tsw=true;
    min_cnt++;
    sec_cnt=0;
  }
  if(min_cnt > 59)
  {
    hour_cnt++;
    min_cnt=0;
  }
  if( hour_cnt > 8 )
  {
    tsw=true;
    sec_cnt=0;
    min_cnt=0;
    hour_cnt=0;
  }
}


void loop() {
  //key switch action
  if( sw )
  {
    motor_action();
  }
  // timer action
  if( tsw ){
        motor_action();
        tsw=0;
  }
}

void motor_action() {
  for (pos = 180; pos >=80; pos -= 1) {
  //for (pos = 0; pos <= 120; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 15ms for the servo to reach the position
  }
//  for (pos = 120; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
  for (pos = 80; pos <= 180; pos += 1) {
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(100);                       // waits 15ms for the servo to reach the position
  }
}

void chgsw() {
  ct = millis();
  if((ct-pt)>300) //チャタリング対応
  {  
    //最初のプレス
    if(digitalRead(2)==LOW) {
        //長押しONタイマー保存
        long_key_t = ct;  
    }
    //リリース
    else{
     //長押しタイマー判定
     if( (ct-long_key_t) > 3000 ){
      timer_mode = true;
      sec_cnt=0;
      min_cnt=0;
      hour_cnt=0;
      Serial.println("TIMER MODE");
      digitalWrite(12,HIGH);
     }
     else{
      //タイマーモード中は、短押しでタイマーモード解除
      if(timer_mode){
        timer_mode=false;
        digitalWrite(12,LOW);
        return;
      }
       Serial.println("SHORTKEY");
       if(!sw) {
        sw = true;
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
       }
       else {
         sw = false;
        digitalWrite(13,LOW);
         Serial.println("LOW");
       }
     }
    }
  }
  pt = ct;
}

コードを作ったら、PCとArduinoをUSBで接続して、Arduino IDEの「マイコンボードに書き込む」ボタンを押してください。

5.動画

動作させた時撮影した動画です。

最後に

Arduinoを使えば、色々便利なものができそうです。
次の目標は無線通信を搭載して、スマホとかで操作できるようにしてみたいです!!
それでは!!

関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン