今回はEdisonを使って秋のミニトマトの水耕栽培の様子をモニタリングできるようにしたいと思います。
水位センサー、照度センサー、温度センサー、湿度センサーなどを使い水耕栽培をモニタリングします。表示器にはLCDシールドを使います。
夏植えのトマトは初めてです。暑いのでうまく育つか心配です。
Edisonが届いたのでまずはセットアップをしていきたいと思います。
Edison LabのGetting Startedを見ながらセットアップしていきます。
ドライバー,IDE,ファームウェアのインストールはちょっと前から統合インストーラーでの一括インストールになったようです。Intel® Edison Board Software Downloadsからインストーラーをダウンロードしてインストールします。
ウィザードに沿ってクリックしていくだけで10分ほどでインストールが完了します。いろいろダウンロードしなくてもすぐにEdisonをいじることができるようになります。嬉しい変更です。
Edison LabのGetting Startedに記載されているセッティング方法は以前のセッティング方法のままなので統合インストーラーでのインストール方法にアップデートして欲しいところです。
インストールが完了したのでLチカでもやっておこうかと思ったのですがここで問題が発生しました。Arduino IDEのポートが灰色になっていてポートが選べません。
仕方ないので以前ダウンロードして使っていたArduino IDEを使うことにします。
無事にLチカはできているようです。
それでは制作に入りたいと思います。
今回は「Edison LabのExamplesに掲載されているサンプルスケッチを活用して試作機を制作する」
というお題があるのでサンプルスケッチを使いシンプルに制作したいと思います。なかなか厳しい縛りです。
なるべく工作を簡単にするために今回はGroveシステムのセンサーやLCDを使います。
Groveシステムはベースシールドに4ピンのコネクタを刺すだけで各種センサーが使えるようになるお手軽電子工作システムです。
これがGroveベースシールドです。
インテル(R) Edison キット for Arduinoと合体させます。
まずサンプルスケッチの中から
Liquid Crystal Display (LCD)液晶画面
05.Hello World | ”Hello World!”を液晶画面に表示
を行ってみたいと思います。
本来はファイル>スケッチの例>LiquidCrystal>HelloWorldからスケッチを実行するのですが今回はGroveのLCDを使うのでそちらからHelloWorldを実行します。
まずLCDを繋げます。
ライブラリをダウンロードしてインストールします。
スケッチ>Include Library>add .zip Libraryからインストールします。
ファイル>スケッチの例>Grove_LCD_RGB_Backlight-master>HelloWorldを選びEdisonに転送します。
表示できました。
目に悪そうなのでスケッチを書き換えてバックライトを緑にしてみました。
普通のLCDシールドとの違いはバックライトの色を変えることが出来る所です。
LCDシールドのスケッチ(ファイル>スケッチの例>LiquidCrystal>HelloWorld)と比べてみると 黄色の所以外は同じことがわかります。黄色の所でライブラリの読み込みとバックライトの色の指定をしています。
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 0;
const int colorG = 255;
const int colorB = 0;
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
// Print a message to the LCD.
lcd.print("hello, world!");
delay(1000);
}
void loop()
{
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
delay(100);
}
次にサンプルスケッチのBasic基本
01.Analog Read Serial | アナログ入力の読み込み
でセンサーの入力値の読み込みをします。
サンプルスケッチではトリマポテンショメータ(半固定ボリューム)を回してそれをシリアルモニタに表示していますが代わりに水位によって抵抗が変わる水位センサをつかってアナログ入力の読み込みを行ってみたいと思います。
ペラペラです。
水位センサーはGroveシステムのセンサーにはないので普通にANALOG INに繋げていきます。
スケッチの例>0.1Basics>AnalogReadSerialからスケッチを読み込みEdisonに転送します。
転送したスケッチは以下の通りです。
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}
Arduino IDEのツール>シリアルモニタから値を見ることができます。
delay(1)なので測定値が猛烈に流れていきます。
delayの単位はミリ秒なので1ミリ秒です。
delay(1000)で1秒止まります。
抵抗の値ではなく水位が何センチなのか知りたいので水位センサの仕様書を見ながら計算式を作ってスケッチを書き換えます
int sensorValue0;
float Vout,R2,x;
const float R1=1500.0,Vcc=5.0,o=56.0;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue0=analogRead(0);
Vout=(Vcc/1024)*sensorValue0;
R2=R1*Vout/(Vcc-Vout);
x=(R1-R2)/o;
Serial.print("sensorValue0=");
Serial.print(sensorValue0);
Serial.print(" ");
Serial.print("Vout=");
Serial.println(Vout);
Serial.print("R2=");
Serial.print(R2);
Serial.print(" ");
Serial.print("x=");
Serial.println(x);
delay(1000);
}
圧力センサーなので曲げたり動かしたりするだけで値が変わります。本当に合っているのか不安になりますがとりあえずこれで良しとします。違っていたら直すだけですしね。
次に水位センサの値をLCDに表示できるようにします。これは二つのスケッチを合体させるだけです。
LCDに表示できる文字数は16×2ですが全部表示できました。最終的に欲しい値は水位のxだけですが
全部表示させてみました。
次にサンプルスケッチのWi-Fi無線ネットワーク
37.Web Server | アナログ入力値を表示するウェブサーバ
のスケッチを使いセンサーの入力値をブラウザで表示します。
まず
puttyやTera TarmなどのターミナルソフトでUSB Serial Portに115200のスピードで接続します。
root@edison:~# configure_edison --setupでwifiのセットアップを行います。
Please connect your laptop or PC to the same network as this device and go to http://192.168.0.23 or http://edison.local in your browser.
と表示されたので192.168.0.23でアクセスしてみます。
このような画面が表示されると思います。
Edisonは標準でサーバーが立ち上がっていることがわかります。
netstat -ant | grep LISTEN
lsof -i:80
で確認します。
root@edison:~# netstat -ant | grep LISTEN
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:58888 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp6 0 0 :::1883 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
root@edison:~# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 253 root 11u IPv4 19170 0t0 TCP *:http (LISTEN)
ファイル>スケッチの例>wifi>WiFiWebServerからスケッチを読み込みます。
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork"; // your network SSID (name)
char pass[] = "secretPassword"; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while(true);
}
String fv = WiFi.firmwareVersion();
if( fv != "1.1.0" )
Serial.println("Please upgrade the firmware");
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin();
// you're connected now, so print out the status:
printWifiStatus();
}
void loop() {
// listen for incoming clients
WiFiClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after comp
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
ssidとpassを書き換えればいいようです。WiFiServer server(80)の所は8080に書き換えます。
char ssid[] = "yourNetwork"; // your network SSID (name)
char pass[] = "secretPassword"; // your network password
WiFiServer server(80);
192.168.0.23:8080にアクセスしてみます。
データは取れているようです。このスケッチを書き換え水位を表示できるようにします。
これで水位計としては完成です。
これからGroveシステムの温度計、照度計などのセンサーを組み込んでいきます。
表側?
裏側?
どっちが表なのでしょう。センサーのついている方が表でしょうか?
コネクタで接続できるのは簡単で良いですね。
温湿度計のサンプルスケッチを動かしてシリアルモニタで見てみました。
きちんと値が取れているようです。精度がどれくらいなのか気になるところです。
光センサーの方はANALOG INに入ってくる値をそのまま読んでみました。
校正するのが大変みたいなので値をそのまま見て明るさの判断をしようと思います。
更に水の温度を測るためにサーミスタ(103AT-11)を投入します。
サーミスタは温度によって抵抗値が変化するセンサーです。
前回のレビューでも使ったセンサーです。
ブレッドボードを使って接続します。
これで予定するすべてのセンサーを接続できました。
スケッチを書き換えブラウザからセンサーで測定した値を見れるようにします。
水位、光センサーの値、気温、湿度、水温がブラウザで見れるようになりました。
後はリレーやサーボなどを使って自動化に挑戦しても良いですし、SDカードにデータを保存したり、サーバーやクラウドにデータを飛ばしても良いかもしれません。データをグラフにして見やすくするのも良いですね。
今回は急いでいるので(苗が育ちきる前に組み込みたい)ここで試作機の制作を一度止めて
水耕栽培のモニターに移りたいと思います。
本体を室内に置いてセンサーだけ外に出す予定ですが水に近い所で使うのでパッケージングして少しだけ水に強くします。
百円ショップで買ってきた木の箱にEdisonを詰め、横からセンサーを出しています。水位センサーとサーミスタは長さが足りなそうだったのでLANケーブルを使ってケーブルを延長しています。
温度センサーと光センサーは雨にぬれるとまずそうなので粉チーズの空容器に入れることにしました。
これで汎用モニタリング装置の完成です。
水耕栽培の方は100円ショップのダストボックスとスチロールの板、アルミシートを利用して作りました。スチロールの板は接着していないので隙間からセンサーを入れることができます。
一月後をめどにどれくらい育ったか写真をアップします。
液肥の濃度を見ることができる液肥コンディションモニター(EC計)が手に入ったので機会があればこれも組み込みたいと思います。
トマトの苗一つをここまでモニターするのはオーバーすぎるかなと思いましたが
モニタリングがうまくいったら大きな水槽を使った大がかりな水耕栽培にチャレンジしようかと思っています。
■データをクラウドに飛ばす
雨続きでトマトが大きくならなくて困っています。このままで本当に収穫まで行くのかと心配しています。天気には勝てないです。
くよくよしても仕方がないのでグラフでデータを見れるように改造したいと思います。クラウドにデータを送ってグラフにします。
前回はインテルさんのIoT Analyticsを使ったのですが同じものをレビューで使うのもなんなので今回はM2Xというサービスをつかう事にしました。
アメリカ最大手の電話会社AT&Tがこのサービスを提供しています。このサービスはIoT向けクラウドストレージと言われるもので、デバイスデータを管理するためのプラットフォームという感じのサービスです。
edisonの他にもArduino,mbed,Rasberry Pi,BeagleBone,ElectricImpなど色々なデバイスに対応していて、iPhoneやAndroidなども連携可能のようです。
AT&TはアメリカのNTTみたいなものですから信頼できます。こんなにいいサービスが無料でいいのでしょうか?
■使い方
大雑把に使い方を説明すると
1.M2Xのアカウントを取る
2.account Settings→Master Keysからマスターキーを取得
3.Create Deviceでデバイスを登録
4.登録したデバイスのDevice IDを取得
5.Add Streamでストリームを作成
6.githubからライブラリをダウンロードしてインストール
7.スケッチを作成してデータをサーバーにアップロード
という感じです。
グラフはこんな感じで取れます。
もっとかっこいいグラフがいいなぁというひとはAPIがあるので自分で加工しましょう。
いろいろなIoTデバイスを持っている人はM2X、edisonを主にいじる人はインテルのIoT Analyticsをそのまま使うのが良いと思います。大がかりになったらAmazonさんなどの出番です。
クラウドのサービスを使うと幸せになれますね。
■終わりに
トマトが全然育ってないのが痛いです。
まだいろいろやりたいことがありますが今回はここで終わりたいと思います。
edisonはBluetoothが付いているのでBluetoothのセンサーにするとごちゃごちゃした配線から解放されるかもしれません。EC計の組み込みもまだです。これは来年の水耕栽培装置の作成の時の課題にしたいと思います。LEDを使った通年の水耕栽培にもチャレンジしたいなと思っています。植物をレビューに使うのはちょっと大変ですね。今回は始動があとひと月早かったらいい感じだったと思います。好天候で予想外にたくさんの秋トマトができた場合は写真をアップしたいと思います。
今回の肝はガンガン変数を使ってもEdisonはびくともしないという所です。Edisonはメモリが1GBあります。Arduino unoなどはSRAMが2kBしかないですからいろいろやろうとすると動かなくなると思います。Edisonは一昔前のPCくらいのメモリを積んでいるのでゴリゴリ使えます。メモリが多いっていいですね。
Rasberry Piに対しての優位点は消費電力です。EdisonはRasberry Piの半分以下の消費電力です。多数のセンサーを使って長時間モニタリングをするという用途ではEdisonはRasberry Piより優れたデバイスだと思います。Rasberry Piは消費電力が多くてもいいからグラフィカルに使いたい場合に使うべきデバイスだと思います。
用途によっていろいろ使い分けていきたい所です。
vuronさん
2015/08/17
hideさん
2015/08/17
夏だと1日で1/3は吸っちゃうんで大変ですね
タカキさん
2015/08/18
コメントありがとうございます。
今回はサンプルスケッチをちょっといじっただけなので簡単です。
何か作りたい場合はEdisonを使うという事も選択肢に入ればよいなぁと思って
レビューを書いています。
タカキさん
2015/08/18
コメントありがとうございます。
育つとすごく水を吸うんですよね。どれくらい水がなくなるのかリモートで確認したくなって作りました。液肥と水の自動供給はお金がかかりそうなので今回はオミットしてモニタリングだけです。補助金が2万というのはちょっときついです。
ちばとどさん
2015/09/19
わたしの水耕栽培トマトは、残念な感じでした。培養液が合っていなかったか、この夏の高温のせいか。
一方、ゴーヤは元気でまだ収穫できてますよ。
いまは、冬に向けてそろそろ葉物の種を蒔いてます。
タカキさん
2015/09/19
暑いときは空芯菜が良いと聞いて水耕してみましたが割とたくさん取れました。バジルなんかも調子はいいです。
ゴーヤ良さそうですね。来年は作ってみようと思います。今回モニターしている秋のミニトマトは花が少しだけ咲いています。