はじめての電子工作 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行目)
#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を使えば、色々便利なものができそうです。
次の目標は無線通信を搭載して、スマホとかで操作できるようにしてみたいです!!
それでは!!

