はじめての電子工作 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入門:基本キット」で足りますが、サーボモーターと電池は購入しました。
・ブレッドボード
・ジャンパワイヤ
・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行目)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#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を使えば、色々便利なものができそうです。
次の目標は無線通信を搭載して、スマホとかで操作できるようにしてみたいです!!
それでは!!
スポンサーリンク