できること

第47回 植物育成デバイスをArduino Createでつくってみる 〜Arduino+センサの開発が劇的に楽になる!ローム・センサ評価キットを試してみた

45

数回にわたり続けてきたローム・センサ評価キットのお試しシリーズ、今回は前回の照度センサ・近接センサや他のセンサなどを組み合わせて植物育成デバイスのパワーアップ化を図ります!

そして、デバプラ編集部からもニュース記事が配信されましたが、Arduino界ではかなり大きな出来事になるであろう「Arduino Create」が2016年8月18日に正式にリリースされました!このArduino Create、雑に言ってしまえば「Arduinoもmbedみたいにオンライン上でソースを書いて書き込みまでできちゃう」というようなものなのですが、Arduinoでもそれができるのは本当に嬉しいニュースです。

Arduino Createは次回以降に詳しい内容を取り上げたいと思いますが、今回はセンサ評価キットの実装で早速Arduino Createを使ってデバイスの実装をしてみたいと思います。

今回の電子工作レシピ

完成までの時間目安:120分
必要なパーツ

※ロームセンサ評価キットは下記サイトから購入できます!
チップワンストップ
ザイコストア

目次

  1. 植物育成デバイスのパワーアップ仕様を考える
  2. Arduino Create×ローム・センサ評価キットで開発!
  3. いざ、工作!実装!
  4. まとめ

1.植物育成デバイスのパワーアップ仕様を考える

今回、植物育成デバイスのパワーアップを目指すということで、これまでのセンサをどう使えば植物にとって素敵なデバイスになるでしょうか。各種センサの詳しい役割や使い方はこれまでの記事を見ていただくことにして、ざっとこれまで扱ったセンサの役割と植物育成デバイスで使えそうか考えてみましょう…

図1 センサ評価キットのセンサ一覧

図1 センサ評価キットのセンサ一覧

  • 加速度センサ:傾きや動き、振動などを検出 → 今回は出番がなさそうかな…
  • 気圧センサ:気圧を検出 → 気圧と天気の関係から、植物にちょっと関係がありそう。
  • 地磁気センサ:方位を検出 → 太陽の方角に合わせて植物の向きを変えるとかできるかな。
  • 近接照度センサ:近づいた物体を検出、明るさを検出 → 暗いときにはデバイスは動かさないなどのような使い方ができるかな。
  • カラーセンサ:色を検出 → 葉っぱが枯れてきたら、なども頑張ればできそう…。
  • ホールセンサ:磁気で物体を検出 → 今回は出番がなさそうかな…
  • 温度センサ:温度を検出 → 温度が高すぎる、低すぎるときに水やりの制御とかできそう…
  • 紫外線センサ:紫外線を検出 → 太陽光が強すぎる・弱すぎるなどの状態を通知したい…

 

一通りのセンサの役割をおさらいすると、植物育成デバイスに関係ありそうな、かつ機能として実装できそうなセンサがたくさんありますね。どんなセンサをどう組み合わせてデバイスを作るか、今度は育成される植物の気持ちになって考えて見ましょう…

 

図2 一般的な観葉植物の育て方

図2 一般的な観葉植物の育て方

 

植物の気持ちになると、どういうことが嬉しくて、どういうことが駄目なのか、センサをどう使ったらよいか参考になりますね。
余談ですが、私が育てていた観葉植物もたまには元気に日光いっぱいの外で気分転換させてやろう!と思って夏場の快晴の中に置いてたらその後数日で枯れてしまいました…(涙)

これらの情報をもとに今回植物育成デバイスの仕様を考えてみると…

  • 日当たり条件 → 紫外線センサと温度センサを使って、温度が高く・紫外線が強い場合は太陽光を弱める仕組みにする
  • 水やりルール → 土の乾きを検出して、鉢のサイズに応じた水を与える
  • 温度について → 対象の植物の特性を調べて温度が高すぎる・低すぎる場合はアラートで教えてくれる
  • 風通しについて → 屋内で風があまりない場所の場合は、風を送る

という機能を目標にしてデバイスを作ってみましょう!

 

海外にはこんなデバイスも…

植物育成デバイス、といえば、世界をみるとこんな大掛かりな植物育成デバイスを作っている方もいました。このサイズだと巨大なレーザーカッターや3Dプリンターみたいですね。動画をみるとPC制御でどこにどの植物を植えるのかなどの作付け管理もできるみたいですね。外でデバイスを動かすのは長期で雨風土などの厳しい条件の中で動かすのでなかなかスムーズに実現するのは大変そうですが、夢がありますね!(目的は植物を育てるということなのに、なぜか毎回デバイスのメンテナンスばかりしている…なんていうのはよくある話のわけで…)

FARMBOT GENESIS – https://farmbot.io/

 

Arduino Create×ローム・センサ評価キットで開発!

プログラム・回路の製作を行っていくのですが、今回はリリースされたばかりのArduino Createをさっそく使ってみます。オンライン上でコードがかけて、かつSNS機能などもついて共有なんかもできちゃう、まだ少ししか触っていないですがこれはまた今後が面白くなりそうな予感がしますね。

 

写真2 オンラインでArduinoが使える「Arduino Create」

写真2 オンラインでArduinoが使える「Arduino Create」

Arduino Createウェブサイト

Arduino Createのはじめかた

Arduino Createで開発を進めるにあたり、簡単な手順を紹介します。まず、既存のArduinoと違うのは、ソースコードをウェブブラウザで書くことができるようになった、ということです。これまではArduinoのソフトウェアをダウンロードして、PCにインストールして、ソフトウェアを起動してArduino本体に書き込む、という流れでしたが、Arduino Createの場合は、

  1. ブラウザを開いて、Arduino Createのウェブサイトを開く
  2. Arduino Createにユーザー登録(最初のみ)
  3. 登録情報を入力~承認メールのURLをクリックして登録完了(最初のみ)
  4. ブラウザとArduino本体をつなぐ「ArduinoCreateAgent」をインストール(最初のみ)
  5. ウェブエディタ上でArduino開発スタート。

となります。PC版のソフトウェアとの大きな違いは、

  • インターネットがつながっていればどこでもすぐにこれまで書いたソースコードを参照できる
  • ライブラリもオンライン上に登録されるのでPCが変わっても同じライブラリを再度インストールしなくてもよい

などなど便利なことだらけになっています!(これだけでは全然ないのですが、次回以降の記事で)
あえて、一つデメリットをあげるのであれば、インターネットにつながっていないと使えない!ということでしょうか。その場合は、おとなしくこれまでどおり既存のソフトウェア版を使いましょう。

 

Arduino Createの主な画面とセンサ評価キットライブラリを動かしてみる

ユーザー登録が完了したら、何はともあれウェブエディタを開いてみます。

図3 Arduino Createウェブエディタ

図3 Arduino Createウェブエディタ

ブラウザということもあり、これまでの縦長の画面から横長でメニューなどもすっきり見やすくなった印象がありますね。ソフトウェアの場合、ウィンドウが多くなりすぎてソースを開きすぎると目的のソースがどこにいったかわからなくなっていたのですが、その問題も解消されそうです。

左のメニューに、これまで上にあったメニューが一通り揃っていますね。

 

図4 Arduino Createウェブエディタ-基本機能

図4 Arduino Createウェブエディタ-基本機能

よく使う機能を確認してみます。左メニューの「Examples」からまずはLチカこと「Blink」ソースコードを開いてみます。そして、画面中央上にある、Arduino種類・ポートの選択から、つなげているArduinoのポート番号と種類を選択して、「コンパイル」→「書き込み」を 試してみると、ソフトウェア版と同じようにArduinoに書き込みされてLチカができました!

 

センサ評価キットライブラリの追加

無事動いたので、次にセンサ評価キットのライブラリを追加して動作を確認します。ライブラリの追加は左メニューの「Libraries」から選択して、上にある「ADD ZIP LIBRARY」をクリックすると、zipファイルをアップロードできるので、追加したいライブラリのzipファイルを選択することで追加が完了します。センサ評価キットのライブラリ(zipファイル)はこちらから各センサのものをダウンロードできます。

 

図5 Arduino Createウェブエディタ-ライブラリの追加

図5 Arduino Createウェブエディタ-ライブラリの追加

 

やった、センサ評価キットも簡単にうごきました!

センサ評価キットも動くことが確認できたので、プログラムと回路の作成をしていきます。

今回デバイスの仕様を下記のようにしたいのでそれに合わせてパーツやセンサを組み合わせていきます。

  • 日当たり条件 → 紫外線センサと温度センサを使って、温度が高く・紫外線が強い場合は太陽光を弱める仕組みにする
    →サーボモーターで日陰をつくる!
  • 水やりルール → 土の乾きを検出して、鉢のサイズに応じた水を与える
    →土壌センサとポンプで水やりを可能に!
  • 温度について → 対象の植物の特性を調べて温度が高すぎる・低すぎる場合はアラートで教えてくれる
    →LEDを光らせて教えてくれる!(将来的にはネットワーク越しで通知したい!)
  • 風通しについて → 屋内で風があまりない場所の場合は、扇子であおいで風を送る
    →夏らしく、サーボモーターで扇子をあおぐ

ということを踏まえて、下記のような回路にしました。

図6 回路図(Arduinoの上にはセンサ評価キットが載っている想定です)

図6 回路図(Arduinoの上にはセンサ評価キットが載っている想定です)

 

プログラムのポイントとしては、loopの前半で各センサの値を取得した後、そのセンサの値に応じてサーボやLEDを動かして目的の動作を実現するような流れになっています。各センサの反応する閾値が鉢のサイズや植物によって違うので、それは各自育てたい植物を調べて数値を調整してみてください。

 

プログラム – 植物育成デバイス

#include <Wire.h>
#include <Servo.h>
#include <RPR-0521RS.h>
#include <BD1020.h>
#include <ML8511A.h>
#include <BM1383GLV.h>

//***********************************************
//閾値の設定
//***********************************************
int moi_threshold   = 500;  //水の乾き具合を設定できます。(湿っている←0~1023→乾いている)
int upper_temp_threshold  = 30;   //高温検出-高いと赤いLEDが光る
int under_temp_threshold  = 10;   //低温検出-低いと青いLEDが光る
int uv_threshold  = 4;   //紫外線の強さ設定-超えると日陰にする
int send_wind_sec  = 30; //風を送る大体の間隔(秒数) 
//***********************************************

Servo uvServo;              
Servo windServo;              
Servo waterServo;              

int redLedPin   = 13;       
int blueLedPin   = 12;
int moisture_pin = A0;
int tempout_pin = A2;
int uvout_pin = A0;

int counter = 0;
bool uvFlg = false;

BD1020 bd1020;
RPR0521RS rpr0521rs;
ML8511A ml8511a;
BM1383GLV bm1383;

//***********************************************************
void setup() {
  Serial.begin(9600);
  while (!Serial);
  Wire.begin();

  byte rc;  
  rc = rpr0521rs.init();
  rc = bm1383.init();

  pinMode(redLedPin,OUTPUT);
  pinMode(blueLedPin,OUTPUT);
  uvServo.attach(9);
  windServo.attach(10);
  waterServo.attach(11);
  bd1020.init(tempout_pin);
  ml8511a.init(uvout_pin);
}

//***********************************************************
void loop() {
    //*********************************
    //土壌センサ
    int moi = analogRead(moisture_pin);
    Serial.write("MOISTURE = ");
    Serial.println(moi);
    Serial.println();
   
    //*********************************
    //温度センサ
    float temp;
    bd1020.get_val(&temp);
    Serial.print("BD1020HFV Temp=");
    Serial.print(temp);
    Serial.print("  [degrees Celsius], ADC=");
    Serial.println(bd1020.temp_adc);

    //*********************************
    //紫外線センサ
    float uv;
    ml8511a.get_val(&uv);    
    Serial.write("ML8511A UV = ");
    Serial.print(uv);
    Serial.println(" [mW/cm2]");
    Serial.println();    

    //*********************************
    //気圧センサ
    byte cp;
    float press;
    
    cp = bm1383.get_val(&press);
    if (cp == 0) {
      Serial.write("BM1383GLV (PRESS) = ");
      Serial.print(press);
      Serial.println(" [hPa]");
      Serial.println();
    }
    
    //*********************************
    //照度・近接センサ
    byte rc;
    unsigned short ps_val;
    float als_val;
    byte near_far;
    
    rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
    if (rc == 0) {
      Serial.print(F("RPR-0521RS (Proximity)     = "));
      Serial.print(ps_val);
      Serial.print(F(" [count]"));
      near_far = rpr0521rs.check_near_far(ps_val);
      if (near_far == RPR0521RS_NEAR_VAL) {
        Serial.println(F(" Near"));
      } else {
        Serial.println(F(" Far"));
      }
      
      if (als_val != RPR0521RS_ERROR) {
        Serial.print(F("RPR-0521RS (Ambient Light) = "));
        Serial.print(als_val);
        Serial.println(F(" [lx]"));
        Serial.println();
      }
    }

    //***********************************
    //センサの値に応じて各処理

    //土が乾いたら水をあげる
    if(moi > moi_threshold){
      Serial.println("Water Servo start.");
      for(int m=0;m < 10;m++){ waterServo.write(0); //サーボモーターを0度に動かす
            delay(1500); //1.5秒待つ 
            waterServo.write(90); //サーボモーターを90度に動かす 
      } 
    } //温度による動作 
    if(upper_temp_threshold > temp){
      digitalWrite(redLedPin, HIGH);  //LEDを光らせる
      delay(moi);                     //渇きの具合をLEDの光る時間にする
      digitalWrite(redLedPin, LOW);   //LEDを消す
    }
    if(under_temp_threshold < temp){
      digitalWrite(blueLedPin, HIGH);  //LEDを光らせる
      delay(moi);                     //渇きの具合をLEDの光る時間にする
      digitalWrite(blueLedPin, LOW);   //LEDを消す
    }

    //日差しが強いときに日陰にする
    if(uv < uv_threshold && !uvFlg){ 
        waterServo.write(90); 
        uvFlg = true;
    }
    else if(uv >= uv_threshold && uvFlg){
        waterServo.write(0);    
        uvFlg = false;
    }

    //一定時間で風を送る
    if(counter > send_wind_sec){
      Serial.println("Wind Servo start.");
      for(int n=0;n < 10;n++){
        waterServo.write(0);
        delay(1000);        
        waterServo.write(90);
      }
      counter = 0;
    }

    counter++;
    delay(1000);
}

 

いざ、工作!実装!

プログラムと回路ができたので、組み合わせてハードウェアを完成させていきます!

写真3 今回対象となる観葉植物

写真3 今回対象となる観葉植物

まず今回はこの植物を。

 

写真4 日陰の構造

写真4 日陰部分の構造

紫外線が強くなったらサーボモータに取り付けたパネルを90度回転させて、窓からの日光をさえぎるようにします。

 

2016-08-22 07.43.24

水をあげる部分は今回スプレーをサーボモータで引っ張って実現しました。

 

送風の様子。夏っぽく扇子で。

 

写真5 植物育成デバイス全体像

写真5 植物育成デバイス全体像

ひとまず組み立ててこんな感じになりました。サーボでアナログな感じにしちゃいましたが、もっとハイテクにするのであれば、水やりを小型ポンプ、送風部分を小型扇風機やPCファンなどにするなども良いかもしれません。また、室内で窓がない場合などは、植物用LEDと照度センサを組み合わせて、室内が暗くなったら植物用LEDもオフにするなんてアイデアもありかもしれませんね。

 

まとめ

今回、センサ評価キットを組み合わせて植物育成デバイスをパワーアップすることができました。記事内で紹介したようなすごいデバイスもあるので、これで完成ではなくもっと良い・面白いアイデアをもとにどんどん改良していくことで、楽しみながら開発することができると思います。

次回は、Arduino Createをもう少し詳しく使いながら、センサ評価キットの最後となった、加速度センサを体験してみます!

アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

NHK学生ロボコン2016 出場ロボット解剖計画