arduino

話題の電子工作「arduino」を使って、自動水やりロボットを作ったので、その手順を解説!

いま話題のプラモデルやラジコンの1つを上をいく知的な趣味「Arduino」
今回はそのArduinoで、自動水やりロボットを作ってみましたので、その手順をご紹介します。
ここだけの話、2時間程度で完成するモノですが、ここまで来るのに、2週間くらいかかってしまいました...

DSC00314

ところで、arduino(アルドゥイーノ)って何?

ひとことで言えば「電子基板」です。部品と組み合わせて、パソコンを使ってプログラムを転送すると無限大に動き出します。大きな特長は、オープンソースで、ネットに情報があふれているため、調べながら自分で色々で作れるというところです。

ラジコン、オリジナル電子楽器、目覚まし時計、監視カメラ、時計湿度計、Twitter読み上げロボットなどなど、アイディア次第で自らの手で便利製品が作れちゃうわけです。

部品1つ1つの値段が安いのも良い点です。

DSC00122

水やりロボットの動作

今回作った水やりロボットは、説明するまでも無いかもしれませんが、こんな形で動作します。

・24時間周期でポンプで水を観葉植物に提供
・水を供給する1秒前に、電子音が鳴る(ドレミドレミソミレドレミレ~)
・電源は、乾電池(9V)から供給
・水源は、ガラスの瓶(300ml)から供給

水源は、大きなものにももちろん変更可能です。一旦、適当な器にしています。

なぜ、作ろうと思ったのか?

スバリ、これまでに数本近くの観葉植物を枯らしてきたからです。

部屋の空気清浄と雰囲気的な癒しから観葉植物をよく買うのですが、ほとんど2か月程度で枯らしてしています。はじめは、まめにあげているのですが、仕事とか、興味が他のことにいってしまうと、なかなかこまめに水あげができない性格のようです。

そこで友人の勧めもあり、素人ながら、arduinoで作ってみました。
ラジコンやプラモデルと違って、無限大の可能性を秘めた工作なので、人によってはハマること間違いないです。百聞は一見にしかず、まずは、やってみることをお勧めします。

用意したもの

arduino UNO初心者セット (4,300円ほど)
元となる製品です、今後いろいろと使えるので、ぜひ、買って試してみてください。周辺機器は自分でそろえる手間を考えればコスパ高いです。

Arduinoエントリーキット
Arduinoエントリーキット

posted with amazlet at 15.02.11
TechShare(テックシェア)
売り上げランキング: 1,306

水中用ポンプ(初心者セット付属なし、中国製の廉価品、700円ほど)
とりあえず、これが安くて動作OKでしたので、このポンプを使っています。

ポンプ用のチューブ(水槽用のやつ、150円)
なかなか丁度良いのが見つからなかったのですが、金魚コーナーでたまたま見つけました。

エアーチューブ 2m
エアーチューブ 2m

posted with amazlet at 15.02.11
スド−
売り上げランキング: 20,572

トランジスタ(初心者セット付属なし、200円ほど)
電源のON/OFFを切り替えるのは、このトランジスタ君の役割です。初心者セットには付いていません。

シリコントランジスター 2SC1815-GR 10個

9V用バッテリーとアダプター(初心者セット付属なし、200円ほど)
電池スナップDCプラグアダプタ

ガラスの瓶
容器は適当なもので代用してください。インテリアとしてもイケテルモノがよいかと思います。

手順(苦労した話を交えつつ)

0.初心者セットで遊ぶ

できれば、初めての方は、初心者セットでいろいろと実験をしてみることをお勧めします。
書籍があれば、理解が早いのでなおよしです。LEDを光らせるくらいは最低できるようにならないときついです。ちなみに、私が読んだやつを記事下に載せておきます。

1.回路を組む

回路図通りに作ってしまえば、速攻で完成ですが、いろいろ実験しながらやってみると理解も深まるし、興味も高まると思います。

写真でわかりずらいかもですが、こんな形に配線しています。

※回路図も追加しました。モーターはポンプです。
screenshot.849
DSC00315
DSC00316

私が苦戦したところをいくつか
・回路は配線が上手く差し込めてないと接触不良で通電しませんのでご注意
・ポンプの配線は、配線次第で通電が上手くできない時があるので適宜、切ったりして調節してください
・水中モーターは水にしずめないとうまく水をすいません(気が付くのに時間がかかました…)
・水中モーターが空回りすることがたまにあるので、その時は水を取り除いて再スタートします
・ポンプ、LEDは向きがあるでご注意(基本ですが)
・圧電スピーカーも上手く配線できてないと、通電しないのでご注意を

2.水中ポンプとチューブをつなぐ

3.水中ポンプを水にしずめる、チューブの先を観葉植物へ

DSC00319

4.パソコンとarduinoをUSBケーブルで接続する

5.プログラムを組んで転送する

arduino用開発ツールを使って、以下のプログラムを組んで転送します。
開発ツールは公式サイトよりダウンロードしてください。

Arduino - Software
arduino.cc/en/Main/Software

#define BEAT 300   // 音の長さを指定
#define PINNO 12   // 圧電スピーカを接続したピン番号

/** モーターのスイッチプログラム **/
void setup() {
  pinMode(11, OUTPUT);
}
void loop() {
     tone(PINNO,262,BEAT) ;  // ド
     delay(BEAT) ;
     tone(PINNO,294,BEAT) ;  // レ
     delay(BEAT) ;
     tone(PINNO,330,BEAT) ;  // ミ
     delay(BEAT) ;
     tone(PINNO,262,BEAT) ;  // ド
     delay(BEAT) ;
     tone(PINNO,294,BEAT) ;  // レ
     delay(BEAT) ;
     tone(PINNO,330,BEAT) ;  // ミ
     delay(BEAT) ;
     tone(PINNO,392,BEAT) ;  // ソ
     delay(BEAT) ;    
     tone(PINNO,330,BEAT) ;  // ミ
     delay(BEAT) ;
     tone(PINNO,294,BEAT) ;  // レ
     delay(BEAT) ;
     tone(PINNO,262,BEAT) ;  // ド
     delay(BEAT) ;
     tone(PINNO,294,BEAT) ;  // レ
     delay(BEAT) ;
     tone(PINNO,330,BEAT) ;  // ミ
     delay(BEAT) ;
     tone(PINNO,294,BEAT) ;  // レ
     delay(BEAT) ;
     delay(1000) ;           // 1秒待つ
  
     digitalWrite(11,HIGH); //11番ピンの出力をHIGH = 5Vにする
     delay(5000); //1000ミリ秒 = 1秒待つ
     digitalWrite(11,LOW); //11番ピンの出力をLOW = 0Vにする
     delay(1000*60*60*24UL); //1000ミリ秒 = 1秒待つ、30秒以上は「UL」を付ける 
}

arduino1

上記プログラムを転送すると、うまくいけば行きなり、水中ポンプが動作するのでご注意ください。

省電力プログラムにアップデート

(2015/2/14更新)
省電力プログラムにアップデートしました。通常の設計ですとバッテリーが24時間くらいしかもたいないという衝撃の事実が判明しましたので^^;
省電力設計にあたり、ラジオペンチ様の記事&プログラムを参考にさせていただきました。電力が0.1%になる設計です。

下のプログラムへの更新とあわせて、Arduinoの13ピンに接続している配線は、11ピンに移動してください。

ラジオペンチ 消費電流が激減! delayWDT関数を作ってみた
radiopench.blog96.fc2.com/blog-entry-486.html

/** 自動水やりプログラム **/

#include <avr/sleep.h>
#include <avr/wdt.h>
#define BEAT 300   // 音の長さを指定
#define PINNO 12   // 圧電スピーカを接続したピン番号

int led = 13;                           // LEDピン

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  tone(PINNO,262,BEAT) ;  // ド
  delay(BEAT) ;
  tone(PINNO,294,BEAT) ;  // レ
  delay(BEAT) ;
  tone(PINNO,330,BEAT) ;  // ミ
  delay(BEAT) ;
  tone(PINNO,262,BEAT) ;  // ド
  delay(BEAT) ;
  tone(PINNO,294,BEAT) ;  // レ
  delay(BEAT) ;
  tone(PINNO,330,BEAT) ;  // ミ
  delay(BEAT) ;
  tone(PINNO,392,BEAT) ;  // ソ
  delay(BEAT) ;    
  tone(PINNO,330,BEAT) ;  // ミ
  delay(BEAT) ;
  tone(PINNO,294,BEAT) ;  // レ
  delay(BEAT) ;
  tone(PINNO,262,BEAT) ;  // ド
  delay(BEAT) ;
  tone(PINNO,294,BEAT) ;  // レ
  delay(BEAT) ;
  tone(PINNO,330,BEAT) ;  // ミ
  delay(BEAT) ;
  tone(PINNO,294,BEAT) ;  // レ
  delay(BEAT) ;
  delay(1000) ;           // 1秒待つ

  digitalWrite(led,HIGH); //11番ピンの出力をHIGH = 5Vにする
  delay(5000); //ポンプ動作時間=水やり時間
  digitalWrite(led,LOW); //11番ピンの出力をLOW = 0Vにする

  //24時間待機ウォッチドックタイマを使ったシャットダウンプログラム
  
  
  int var = 0;
  while(var < 10800){
    delayWDT(9);     // 8秒間のシャットダウン                  
    var++;           // 10800回繰り返し=24時間                  
  } 
}

void delayWDT(unsigned long t) {        // パワーダウンモードでdelayを実行
  delayWDT_setup(t);                    // ウォッチドッグタイマー割り込み条件設定
  ADCSRA &= ~(1 << ADEN);               // ADENビットをクリアしてADCを停止(120μA節約)
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // パワーダウンモード
  sleep_enable();

  sleep_mode();                         // ここでスリープに入る

  sleep_disable();                      // WDTがタイムアップでここから動作再開 
  ADCSRA |= (1 << ADEN);                // ADCの電源をON (|=が!=になっていたバグを修正2014/11/17)

}

void delayWDT_setup(unsigned int ii) {  // ウォッチドッグタイマーをセット。
  // 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記
  // 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms
  // 6=1sec, 7=2sec, 8=4sec, 9=8sec
  byte bb;
  if (ii > 9 ){                         // 変な値を排除
    ii = 9;
  }
  bb =ii & 7;                           // 下位3ビットをbbに
  if (ii > 7){                          // 7以上(7.8,9)なら
    bb |= (1 << 5);                     // bbの5ビット目(WDP3)を1にする
  }
  bb |= ( 1 << WDCE );

  MCUSR &= ~(1 << WDRF);                // MCU Status Reg. Watchdog Reset Flag ->0
  // start timed sequence
  WDTCSR |= (1 << WDCE) | (1<<WDE);     // ウォッチドッグ変更許可(WDCEは4サイクルで自動リセット)
  // set new watchdog timeout value
  WDTCSR = bb;                          // 制御レジスタを設定
  WDTCSR |= _BV(WDIE);
} 

ISR(WDT_vect) {                         // WDTがタイムアップした時に実行される処理
  //  wdt_cycle++;                        // 必要ならコメントアウトを外す
}

以上です。

さいごに

ちなみに水やりロボットは、まだ完成したばかりなので、その調子をみてまたお伝えできればと思います。

可能性は無限大のArduino

今回は、本当に簡単な水やりロボットを作ったわけですが、1つ作ってみると、いろいろと願望がでてきます。例えば…

  • 1つではなく複数の観葉植物に同時に水をやりたい
  • 特定の時刻に水をやるようにしたい
  • 水の量は、レバーでコントロールしたい
  • 時間ではなく土の湿度が下がったら、水を供給したい
  • 土の湿度を液晶画面で確認したい
  • スマホから遠隔操作で水やりしたい
  • 水の供給履歴をスマホで確認したい

という色々な願望がわいてくるわけですが、これらは、どれもarduinoで実行可能なことです。

Arduinoの良いところは、願望がわいてきたら、それをかなえるために、部品を変えたり、増やしたりして、それにあわせてプログラムを書き換えれば、実現できる点です。わからないことがあれば、オープンソースのため、ネットに情報が豊富にあります。

秋月電子。ここを語らずしてArduinoは語れない。

また、トランジスタとアダプターといった細かい部品は、秋葉原の秋月電子というお店にいくと安く手に入れることができます。ほとんどの部品が50円~300円程度です。東京近辺にお住まいであればぜひ行ってみることオススメします。送料分も浮かせることができます。
01996b59cedadc1b449c6354840382170a83ddf7b4

ということでArduinoはもう、プラモデルやラジコンとは一線を画す、知的な趣味なのです。ぜひ、トライしてみください。

ちなみに、私が読んだ本を記事下に載せておきます。アイディアを実現するにはいろいろと知識が必要です。

Arduinoをはじめよう 第2版 (Make:PROJECTS)
Massimo Banzi
オライリージャパン
売り上げランキング: 870
これ1冊でできる! Arduinoではじめる電子工作 超入門
福田和宏
ソーテック社
売り上げランキング: 121,083

-arduino
-, ,