the invention of t88

工作、資格取得、データ分析のことなど

水耕栽培でビートオールレッドを育てる

水耕栽培器にラズパイ+センサ・カメラを取り付け、野菜を栽培しています。

過去記事:
IoT水耕栽培 - the invention of t88


今回はビートオールレッドを育てました。
あまり耳馴染みがないですが、ベビーリーフの1種のようです。
赤い色が特徴的で、ポリフェノールを多く含むようです。

f:id:take213uv:20190818235636g:plain
2019.6.27 - 2019.7.28

f:id:take213uv:20190819000619j:plain
収穫

気の利いた調理方法が見つからなかったので、安直にサラダにしました。
適度に苦味があってなかなかに美味しい。

f:id:take213uv:20190819000252j:plain

若干、芽が残っていたので収穫後、放置。

f:id:take213uv:20190819000648g:plain
2019.7.28 - 2019.8.9

次回は実がなる植物を育てます。


【使用している水耕栽培器】

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

室内でもガンガン野菜が育ちます。
種子や肥料は公式のオンラインショップで入手可能。水耕栽培が手軽に楽しめます。オススメです。

水耕栽培でルッコラを育てる

水耕栽培ですが、ジャーマンカモミールの不発により、代打としてルッコラを育てていました。

www.t88.work

今度はちゃんと発芽してくれました。ひょろ長い芽が。

f:id:take213uv:20190624220507j:plain
数日経過

ジャーマンカモミールは種まんまでしたが、これまで無事育ったジェンティリナグリーン、水菜、そして今回のルッコラは全部緑色の糖衣みたいなもので包まれています。結構、この緑色のコーティングが重要なんでしょうか?

f:id:take213uv:20190523061255j:plain

それはそれとして、今回も成長の様子をGIFで。

f:id:take213uv:20190624221131g:plain

ぐんぐん育ちました。室温が上がってきたので、スポンジにアオコが出来るようになりましたが。
f:id:take213uv:20190624221538j:plain

パスタにして食す。美味い。 f:id:take213uv:20190624221709j:plain

生でも齧ってみましたが、味が濃く美味しかったです。正攻法でサラダにするのも良いかも。


次回:
ビートオールレッドを育てます。


【使用している水耕栽培器】

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

室内でもガンガン野菜が育ちます。
種子や肥料は公式のオンラインショップで入手可能。水耕栽培が手軽に楽しめます。オススメです。


【IoT水耕栽培器シリーズ】
色々と水耕栽培で育てています。

www.t88.work

OUT:ジャーマンカモミール IN:ルッコラ

www.t88.work

前回、水耕栽培で水菜を育て終わった後、次はジャーマンカモミールを育てると宣言しました。

4/30に宣言通り、仕込みました。

f:id:take213uv:20190523060800j:plain
とても種が小さいので楊枝を使う

ところが、昨日(5/22)まで待っても全く発芽せず。
f:id:take213uv:20190523060825j:plain


流石にコレは待っていてもしょうがないということで、ジャーマンカモミールについては諦めて、ルッコラを栽培することにしました。

f:id:take213uv:20190523060842j:plain
一転して大きい
f:id:take213uv:20190523060833j:plain
今度こそ

ジャーマンカモミールは残念でしたが、まずはルッコラの成長を見守りたいと思います。でもジャーマンカモミールもそのうちリベンジしたい。

IoT水耕栽培器で水菜栽培

水耕栽培器にラズパイ+センサ・カメラを取り付け、野菜を栽培しています。

過去記事:
水耕栽培器IoT化 - the invention of t88



前回(1月〜)は、ジェンティリナグリーンを育てました。

www.t88.work



今回は、水菜です。
今回も定点カメラの映像を元に成長の様子をGIFにしてみました。

f:id:take213uv:20190429114902g:plain
もりもり育っています。

大体、1ヶ月くらいで収穫。
f:id:take213uv:20190429053456j:plain:w512

鍋の具材に。
f:id:take213uv:20190429115315j:plain:w512 1歳の娘もバクバク食べていたので育てた甲斐がありました。



f:id:take213uv:20190429053459j:plain

これ、ほっといたらもう一回生えてこないかな、という事で2nd iteration開始。

f:id:take213uv:20190429120118g:plain

あかんかったか。。。
2回目はうまいこと成長しませんでした。肥料を足さなかった事も関係しているのでしょうか。最後、萎びてるのは水切れですね。

次回

ジャーマンカモミールを育てます。



【使用している水耕栽培器】

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

室内でもガンガン野菜が育ちます。
種子や肥料は公式のオンラインショップで入手可能。水耕栽培が手軽に楽しめます。オススメです。

ジェンティリナグリーン収穫+GIF作成

水耕栽培器のジェンティリナグリーンは順調に育ち、先日遂に収穫を迎えました。

f:id:take213uv:20190210154945j:plain

f:id:take213uv:20190210155001j:plain

さて、IoT水耕栽培器ということで、30分ごとにラズパイカメラで写真を撮り、google driveに蓄積していました。今回は、これを繋ぎ合わせて成長の様子を表すGIFを作成したいと思います。

python + pillowでjpgをgif化する

gif作成にはpythonのpillowを使います。

基本的には、これでgifが作成されます。

from PIL import Image
import pathlib

p = pathlib.Path('201901_ジェンティリナグリーン')
files = sorted(list(p.glob('*jpg')))
images = list(map(lambda file: Image.open(file), files))
images[0].save('201901.gif',save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0)

pathlibでjpgのパスを掴んでpillowでgifにして保存。
 

ただ、何も考えずに30分おきに取得した画像をgif化すると中々の容量になります。今回のケースだとおよそ500MB。容量削減が必要。

 

gifの容量削減

まず解像度を1024×768から512×384に下げます。

次に、jpgファイルを間引きます。22時から6時は水耕栽培器が消灯しているので、画像も真っ黒。この期間は使わなくて良い。さらに時間間隔も粗くします。色々試しましたが、1日数枚程度でも割と育ってる感は出るみたい。

pythonスクリプトを修正。

from PIL import Image
import pathlib

p = pathlib.Path('201901_ジェンティリナグリーン')
files = sorted(list(p.glob('20190???0700*.jpg')) + 
               list(p.glob('20190???1[3,9]00*.jpg')))
images = list(map(lambda file: Image.open(file).resize((512,384)), files))
images[0].save('201901_圧縮版.gif',save_all=True, append_images=images[1:], optimize=False, duration=20, loop=0)

jpgファイル名がタイムスタンプなのでpathlib globのパターンマッチング条件で対象のファイルを絞り込んでいる。   これで容量は20MB程度まで減少。

 

さらに

ezgif.com

を使って圧縮。

変化のない部分を透明化したり、色数を削減して圧縮を行う。

これで8MB程度まで容量削減。

なんとかはてなブログにあげられる程度まで容量が削減できました。

完成したGIF

f:id:take213uv:20190213010235g:plain

若干怖い...。でもなんだか面白い。

今後の予定

中々面白いので引き続き、色んな植物を育ててみます。
次は水菜。

温度、湿度、CO2のデータは今のところ特に使い道がない...。

参考資料

Python PillowでPNGからGIFを作る - Qiita
GIFアニメを90%圧縮 – てまりのUXブログ

IoT水耕栽培器で野菜を育てる

水耕栽培器IoT化(第9回)

長い道のりでした。

計画を立ててから約半年。
水耕栽培器のIoT化 1stSTEPが完了しました。

いよいよ野菜を育て始めます。

振り返り(システム構成)

水耕栽培器

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイングのGreen Farm(UH-A01E1)
本体です。

ラズパイ

Raspberry Pi Model B
センサ・カメラを取付け、データ転送を行う。

温湿度センサ

DHT22

CO2濃度センサ

MH-Z19

カメラ

ja.aliexpress.com

視野角130度の広角カメラ。

データ保存

センサ測定値:Ambient
写真:Google Drive

可視化

Ambient

水耕栽培を始める

初回キットを使います。
種はジェンティリナグリーン*1
あとは液体肥料、栽培スポンジが入ってます。
f:id:take213uv:20180910231852j:plain

ケースに養液を貯める

水を貯めます。4Lほど。結構なみなみ*2
その後、液体肥料を30ml投入します。 f:id:take213uv:20190103011525j:plain

スポンジを準備する

スポンジに水を染み込ませます。
f:id:take213uv:20190103012141j:plain

スポンジを取り付ける

苗床パネルの穴にスポンジを取り付けます。
スポンジを取り付けない穴には蓋をします。

種投入

スポンジの窪みに一つずつ種を投入します。 f:id:take213uv:20190103013138j:plain

完成

ケースをセット。センサ・カメラの配線を整理。 f:id:take213uv:20190103010631j:plain

おわりに

ついに水耕栽培をスタートしました。
今後は基本的に放置。生長を見守ります。

無事収穫が出来たら、また記事にしたいと思います。

常時、Ambientで最新状況を公開しているので、興味がある方はご覧ください。


前の記事:ラズパイのカメラ画像をGoogle Driveに上げる

水耕栽培器IoT化 目次

*1:よくわかりませんがレタス系のようです。

*2:本棚の上に設置+内部には電子機器、ということで中々神経を使う作業です。

ラズパイのカメラ画像をGoogle Driveに上げる

水耕栽培器IoT化(第8回)

前回までの取り組みで、Ambientというサービスを使って、センサデータをクラウドに保存&可視化できるようになりました。

www.t88.work

今回は、カメラで取得した画像をクラウドに保存できるようにします。保存先としては、APIなどが整っていて扱いやすそうなGoogle Driveを用います。

また、少し工夫をしてAmbient上に最新の写真を表示できるようにします。これによって、Ambientだけで簡易的なダッシュボードが構築できます。

Google Driveの下準備

下記記事を参考に、pythonでGoogle Driveを扱うために必要なパッケージのインストールや、OAuth認証絡みの設定を行います。

qiita.com

基本的に、この通り進めていけば問題ないのですが、私の環境ではpythonスクリプトでエラーが出ました。

pythonスクリプト(エラー部)

  from pydrive.auth import GoogleAuth

エラー内容

Traceback (most recent call last):
  File "picture_test.py", line 4, in <module>
    from pydrive.auth import GoogleAuth
ImportError: No module named pydrive.auth

pydriveのインポートに失敗している模様。

下記コードでパッケージの探索先を明示的に加えてみたところ、エラーは解消。

import sys
sys.path.append('/home/pi/.local/lib/python2.7/site-packages/pydrive')


これでローカルのファイルをGoogle Driveにアップロードすることが出来るようになりました。

カメラで撮影&アップロード

①カメラで写真を撮影、②撮影した写真をGoogle Driveにアップロード、③ローカルに残ったファイルを削除する、pythonスクリプトを作成します。

# coding: UTF-8
import sys
sys.path.append('/home/pi/.local/lib/python2.7/site-packages/pydrive')

import os
from datetime import datetime
from picamera import PiCamera
import time
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

# 写真撮影
with PiCamera() as cam:
    cam.resolution = (1024,768)
    cam.rotation = 90 #カメラを横向きに設置したので90度回転させる
    
    # 現在時刻を取得
    tstp = datetime.now().strftime("%Y%m%d%H%M%S")
    file_name = tstp + '.jpg'
    # 写真撮影。取得した現在時刻をファイル名に設定
    cam.capture(file_name)

# google drive
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)

folder_id = 'hoge'

# 写真をアップロード
f = drive.CreateFile({'title': file_name,
                      'mimeType': 'image/jpeg',
                      'parents':[{'kind':'drive#fileLink','id':folder_id}]})
f.SetContentFile(file_name)
f.Upload()

# ローカルに保存したファイルを削除
os.remove(file_name)


これでスクリプトが走る度に写真を撮影し、Google Driveの所定のフォルダに画像ファイルを格納することができます。

Ambientに最新画像を表示

Ambientには画像を表示する機能があります。Ambientのチャネル設定の中のEmbed codeの部分にGoogle Driveの共有リンクを貼り付ければ、そのファイルを読み込んで表示してくれます。

f:id:take213uv:20190102153634p:plain


このままでは特定の画像を静的に表示するだけですが、共有リンクしたファイルを最新画像に更新すれば、Ambientの表示も最新化することが出来ます。
但し、Google Drive上では同名のファイルを上げても、上書き保存されず別ファイルとして保存されてしまうので、ファイルIDを指定して更新を掛ける必要があります。


具体的な手順としては、下記の通り。
① 蓄積用の画像ファイル(日時.jpg)とは別に、最新データ(latest.jpg)をアップロードする

② Google Drive上でlatest.jpgのファイルIDを確認する。(共有リンクの"open?id="以降の文字列がファイルID)

③ 最新データ(latest.jpg)のアップロード時にファイルIDを指定するようにスクリプトを変更する

先ほどのスクリプトには下記コードを追記することになります。

# 最新版を更新
f1 = drive.CreateFile({'title': 'latest.jpg',
                      'mimeType': 'image/jpeg',
                      'parents':[{'kind':'drive#fileLink','id':folder_id}],
                      'id': 'hoge'})
f1.SetContentFile(file_name)
f1.Upload()

4行目の'id': 'hoge'が変化点。hogeの部分にファイルIDを入れる。


実際にスクリプトを実行。Google Driveを確認。

f:id:take213uv:20190102160953p:plain
日時.jpgとlatest.jpgがアップロードされています。

さらにもう一度実行し、Google Driveを確認。
f:id:take213uv:20190102161005p:plain
新たなタイムスタンプの日時.jpgが追加、latest.jpgの画像が更新されています。


Ambientでの状況も確認(初回スクリプト実行後)

f:id:take213uv:20190102161017p:plain
右下に画像が表示されている。

スクリプト2回目実行後。
f:id:take213uv:20190102161046p:plain
画像が更新されている。

cronで定期実行

前回同様、cronで定期実行させます。

*/30 * * * * sudo python get_picture.py

とりあえず30分毎に設定しました。

おわりに

Google Driveへのファイルアップロードは思ったより手軽に出来ました。Ambientで最新画像表示もできたので、現在の状況を可視化するダッシュボードとして一応は成立したかな、という印象です。これで、いつでもどこでも野菜の生育状況が確認できる。

8月からボチボチ進めてきて、だいぶ時間が掛かりましたが、これで一通りの準備が完了しました。次回はいよいよ野菜を育て始めようと思います。


前の記事:ラズパイで取得したデータをAmbientに上げる
次の記事:IoT水耕栽培器で野菜を育てる
水耕栽培器IoT化 目次

ラズパイで取得したデータをAmbientに上げる

水耕栽培器IoT化(第7回)

前回までで立ち上げた、温湿度センサとCO2センサで取得したデータをネットに上げます。 データを保存します。あまつさえ可視化します。Ambientを使って。

https://ambidata.io/

AmbientはIoTデーターの可視化サービスです。
マイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)します。

Ambient初期登録

Ambientを使ってみる – Ambient に沿って。

ユーザ登録する

メールアドレス、パスワードを登録するだけ。

チャネルを作る

チャネル、というのが一つのグループ単位のようです。

1つ作成し、設定でチャネル名を変更してみた。 f:id:take213uv:20181228062139p:plain

pythonスクリプトを改良する

これまで作成したセンサ読み取り用スクリプトを一つのスクリプトにまとめます。 併せて、Ambientへのデータ送信機能を付け足します。

import Adafruit_DHT as DHT
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

import serial
import time
import subprocess
import slider_utils as slider
import getrpimodel

import ambient

'''
温湿度センサ
'''
# センサー種類
SENSOR_TYPE = DHT.DHT22
# GPIOポート
DHT_GPIO = 22

# 測定
h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)

# 四捨五入
h = Decimal(h).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
t = Decimal(t).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)



'''
CO2濃度センサ
'''
# setting
if getrpimodel.model() == "3 Model B":
  serial_dev = '/dev/ttyS0'
  stop_getty = 'sudo systemctl stop serial-getty@ttyS0.service'
  start_getty = 'sudo systemctl start serial-getty@ttyS0.service'
else:
  serial_dev = '/dev/ttyAMA0'
  stop_getty = 'sudo systemctl stop serial-getty@ttyAMA0.service'
  start_getty = 'sudo systemctl start serial-getty@ttyAMA0.service'

def mh_z19():
  try:
    ser = serial.Serial(serial_dev,
                        baudrate=9600,
                        bytesize=serial.EIGHTBITS,
                        parity=serial.PARITY_NONE,
                        stopbits=serial.STOPBITS_ONE,
                        timeout=1.0)
    while 1:
      result=ser.write("\xff\x01\x86\x00\x00\x00\x00\x00\x79")
      s=ser.read(9)
      if len(s) >= 4 and s[0] == "\xff" and s[1] == "\x86":
        return {'co2': ord(s[2])*256 + ord(s[3])}
      break
  except IOError:
    slider.io_error_report()
  except:
    slider.unknown_error_report()

def read():
  p = subprocess.call(stop_getty, stdout=subprocess.PIPE, shell=True)
  result = mh_z19()
  p = subprocess.call(start_getty, stdout=subprocess.PIPE, shell=True)
  if result is not None:
    return {'CO2': result["co2"]}

value = read()
c = value["CO2"]


'''
Ambient
'''
ambi = ambient.Ambient(8637, "ライトキー")
r = ambi.send({"d1":t,"d2":h,"d3":c})

インスタンス作って、.sendで送るだけ。めちゃくちゃ簡単ですね。

スクリプトを実行すると、こんな感じでデータがあがっています。

f:id:take213uv:20190101021850p:plain

cronを使って定期送信させる

定期的にデータを取得したいので、cronを使います。
crontab -e でcrontabファイルを開いて、その中に

*/5 * * * * sudo python data_logging.py  

と書き込み。これで5分ごとスクリプトが走ります。

仕上げ

設定でグラフタイトルを変更。

f:id:take213uv:20190101022931p:plain

公開設定に変更。
https://ambidata.io/ch/channel.html?id=8637

おわりに

Ambientを使うことですごく簡単にセンサデータのロギングや可視化が出来ました。 あとはカメラのデータについて対応すれば、いよいよ水耕栽培器立ち上げです。


前の記事:ラズパイ×MH-Z19でCO2濃度測定
次の記事:ラズパイのカメラ画像をGoogle Driveに上げる
水耕栽培器IoT化 目次

ラズパイ×MH-Z19でCO2濃度測定

水耕栽培器IoT化(第6回)

またまた間が空いてしまった、水耕栽培器IoT化を進めていきたいと思います。

目標としては今年中に稼動させたい。
大分寒くなってきてるので、室内とは言え植物が正常に育つか不安ですが...。


今回は、CO2濃度センサを立ち上げたいと思います。

下記記事を参考にさせて頂きました。

qiita.com

CO2濃度センサ MH-Z19

CO2濃度センサにはMH-Z19を使います。
結構ネットで関連する記事も見つかり、よく使われている模様。
amazonとかでも売ってますが高いので、Aliexpressで購入しました。

ja.aliexpress.com

結線

結線用にピンヘッダーを半田付け。
f:id:take213uv:20181224075447j:plain


ラズパイと結線。
PWMかUARTかで結線が異なる。
今回はUARTを使うので、下記の様に結線。

ラズパイ MH-Z19
5V Vin
GND GND
GPIO14(UART_TXD) Rx
GPIO15(UART_RXD Tx

※RXDとTXDは互い違いで結線する

f:id:take213uv:20181224134806j:plain

ラズパイ設定、pythonスクリプト

こちらの記事に沿って、

  • UARTを有効化
  • ラズパイ再起動
  • python関連モジュールをpip install
  • git cloneで制御プログラムを取得
    を行う。

CO2濃度取得

制御プログラムを実行。
f:id:take213uv:20181224150231p:plain CO2濃度1899ppm。大分高い。


30分ほど換気後、再測定。
f:id:take213uv:20181224150350p:plain 815ppm。外気が約400ppmらしいのでこの数値はおかしい。

キャリブレーション

ゼロ点補正のコマンドをセンサに送ってキャリブレーションを行う*1
このコードもこちらの記事を参考に。

キャリブレーション後、再測定。 f:id:take213uv:20181224150935p:plain
399ppm。ちゃんとキャリブレーション出来たみたい。

オートキャリブレーションの無効化

デフォルトではオートキャリブレーションが有効になっている。
これは、1日のmin値を400ppmに合わせる仕組みなので、 一日中部屋を閉め切っているような場合は、ゼロ点がずれてしまう。
コマンドを送って無効化する。

先ほどのキャリブレーション用スクリプトを手直し。
センサのマニュアルからオートキャリブレーション入切のコードを確認。
f:id:take213uv:20181224152010p:plain

これに沿って、制御プログラムの
ser.write()内の文字列を
"\xff\x01\x79\x00\x00\x00\x00\x00\x06"
に変更。

戻り値がなく、よく分からないが、多分これでokなはず。

おわりに

大分時間が掛かりましたが、カメラ、温湿度センサ、CO2濃度センサの立ち上げが完了しました。 これで用意したセンサ類の準備は全て完了。

次回は、これらのセンサのデータを定期的にネットワークに上げ、 保存する仕組みを構築したいと思います。


前の記事:ラズパイで温湿度測定
次の記事:ラズパイで取得したデータをAmbientに上げる
水耕栽培器IoT化 目次

*1:zeroといっても0ppmではなく、外気の400ppmに合わせるようにオフセットが掛かる模様。

ラズパイで温湿度測定

だいぶ間が空いてしまいましたが、
少しずつ水耕栽培器の立ち上げを進めて行きたいと思います。

今日は、温湿度センサの立ち上げを行います。

室内環境の植物への影響を検討する際に使用予定です。
いつかは、温湿度をトリガとして空調を操作するなどの
応用も行ってみたいと思っています。

温湿度センサ DHT22

DHT11という廉価版もあるようですが、
こちらのほうが精度が高いようなので、こちらにしました。
どちらにせよ、大した額ではないです。

あと、本体のみで4端子のものと、
プルアップ抵抗などが載った基板に実装されている3端子のものが、
巷に出回っているようです。

今回は後者を購入。
前者の場合、端子間に抵抗を噛ませる必要あり。

ラズパイに接続

f:id:take213uv:20180930015007j:plain
無駄にブレッドボードを使う。ジャンパー線の色が適当...

3.3V電源とGPIOポートにつなぎます。

センサ端子(左) ー ラズパイ端子1(3.3V)
センサ端子(中) ー ラズパイ端子15(GPIO22)
センサ端子(右) ー ラズパイ端子6(GND)

ラズパイでデータ取得

DHT制御用のライブラリを入手します。

$ sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git  
$ cd Adafruit_Python_DHT  
$ sudo python setup.py install  


データ取得用のpythonコードを作成。

# coding: UTF-8
import Adafruit_DHT as DHT
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

# センサー種類
SENSOR_TYPE = DHT.DHT22

# GPIOポート
DHT_GPIO = 22

# 測定
h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)

# 四捨五入
h = Decimal(h).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)
t = Decimal(t).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)

## 結果表示
print ('温度:' + str(t) + '℃')
print ('湿度:' + str(h) + '%')

結果

f:id:take213uv:20180930022432p:plain

f:id:take213uv:20180930015011j:plain

まあ、妥当なところでしょうか。

今後

残ったCO2センサで一旦、センサ取り付けは終了。
そのあとは、データ蓄積の仕組み構築に移りたいです。

参考

コードなど、ほぼそのまま使わせていただきました。 qiita.com


前の記事:植物観察用のカメラモジュール
次の記事:ラズパイ×MH-Z19でCO2濃度測定

水耕栽培器IoT化 目次

植物観察用のカメラモジュール

水耕栽培器IoT化(第4回)

前回までで、水耕栽培器本体とラズパイの立ち上げが完了しました。 今回は、植物観察用のカメラモジュールの取り付け、選定を行います。

取り付ける場所

側面から撮るのが一番分かりやすいとは思いますが、 スペースの関係もあるので、水耕栽培器の天井にカメラを貼り付けて 俯瞰で映す形をまずは検討します。

購入したカメラモジュール

①サインスマート カメラモジュール

amazonで安価に買えるので、まずはこちらを購入。
ただ、視野角が狭いのでは、という懸念があります。

ということで広角のカメラモジュールを用意しておきたい。 ただ、日本のwebショップであまりいい感じのが見つからなかったので 今回はAliExpressで探しました。

(参考)AliExpress
 中国アリババの通販サイト。すごく安い。
 日本で手に入らないものも売っている。
 送料がタダ。
 着荷までには2週間程度掛かる。
 そして外れを引くこともある。*1

AliExpressではラズパイカメラや各種センサ類も豊富に用意されています。 そしてどれも日本と比べるとだいぶ安い。楽しくなってきます。 この安さも後押しして、念のため視野角の異なる2つのカメラモジュールを購入することにしました。

②視野角130度

ja.aliexpress.com

③視野角150度  ja.aliexpress.com

どうみても同じものに見えますが、スペック上 は視野角が違うと仰っている。

配線

ラズパイのカメラ用端子に、カメラモジュールのフラットケーブルを接続します。 黒い爪を引き上げて差し込む形。ケーブルには表裏があるので注意。端子がむき出しになっているほうをHDMI端子側にする。 最後に爪を戻して固定。 f:id:take213uv:20180912000315j:plain

ただこのケーブル、デフォルトでカメラに付いているものは非常に短い。 これでは取り回しが効かないので、別途ケーブルを購入しました。

新しいケーブルに付け替え。カメラ側も同じ端子。
f:id:take213uv:20180912003123j:plain

ラズパイでの写真撮影

ラズパイでの写真撮影は拍子抜けするほど簡単です。
まずはraspi-configで、カメラモジュールをenableにします。
raspi-config: [5 Interfacing Option] - [P1 Camera]
と進んでいき、カメラを有効化します。

そしてコマンドで
raspistill -o ファイル名
とするだけ。非常に簡単ですね。

ところが、サインスマートのモジュールを試したところ、こんなエラーが。 f:id:take213uv:20180914054838p:plain

調べてみると、基板とカメラの接続部(オレンジ色の部分)が外れていたようです。この部分、結構外れやすいので要注意です。
f:id:take213uv:20180912000234j:plain

検証

視野角の異なるカメラを3種類用意したので、 それぞれの見え方を確認し、最適なカメラを選定します。

しかしここで問題発生。aliexpressで購入した二つのカメラモジュール、どっちがどっちだかわからない...。まあ写真を撮ってみれば分かるので問題ないのですが。
f:id:take213uv:20180914055240j:plain

検証方法としては、下の写真のようにダミーを置いて、各カメラでどの辺りまで映るのか確認します。

f:id:take213uv:20180912000214j:plain
植物の代わりに、白州、響、山崎を配置

サインスマート

真ん中に置いた響しか映っていない。やはり視野角が狭すぎますね。
f:id:take213uv:20180914112947j:plain

広角カメラ その1

f:id:take213uv:20180914113012j:plain

広角カメラ その2

f:id:take213uv:20180914113102j:plain

あれ?やっぱり同じような視野角のような? どちらにせよ、両端に置いた白州と山崎までは映らないようですが、 いい感じで全体像が撮れています。

この辺まで近づけると映る。
f:id:take213uv:20180914113635j:plain f:id:take213uv:20180914113224j:plain

とりあえず広角カメラその1を用いることにします。ただ、まだ全体を映しきれてないので、 もう少し広角のカメラも引き続き探索して、どこかのタイミングで付け替えるかもしれません。

あともう一つ課題として、今は水耕栽培器の天井に100均で買った両面テープで貼り付けていますが、LEDの熱と光で割と過酷な環境。 だんだん粘着力が落ちている気配を感じます。後ほど、ちゃんとしたメーカーの耐熱性の両面テープに貼り替える予定です。

まとめ

ひとまず、カメラが使えるようになりました。 次回は温湿度センサーの取り付けを行いたいと思います。


前の記事:水耕栽培器Green Farm(UH-A01E1)を購入した
次の記事:ラズパイで温湿度測定
水耕栽培器IoT化 目次

*1:300円のワイヤレスイヤホンを買ったら酷いものが届きました。

水耕栽培器Green Farm(UH-A01E1)を購入した

水耕栽培器IoT化の重要アイテムということで、 前回、ラズパイを準備しましたが、 これこそが本当のマストアイテム。水耕栽培器を購入しました。

購入したのはユーイングのGreen Farm(UH-A01E1)。 お値段2万円弱ということで中々大きな買い物...。

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

ただ作りはしっかりしていそうだし、機能も一通り揃ってる。 半密閉構造はセンサを付け足していくのに便利。 あとエアポンプも付いている点もポイント高し。
最終的にはレビューの評価が高い事が決め手となりました。

開封

一部、保護材を噛ませている部分などありますが、 基本的に箱の中に箱、みたいな感じで製品がそのまま入ってます。

従って、セッティングは簡単。置くだけ。
f:id:take213uv:20180910202636j:plain

点灯!結構まぶしい。色は5000Kくらいかな。 f:id:take213uv:20180910202633j:plain

正面扉を開けます。この穴にスポンジ詰めて種を入れる形。

穴が開いた板の下に水を貯める。エアポンプ発見。

水位フロート。給水タイミングを知らせてくれる。

操作部。時間設定とモード切替。



さあ早速始めてみよう、と思っても実は、種とか肥料は付属されていません。
同梱されたハガキでお試しキットを申し込む必要があります。*1



申し込むと2週間ほどでキットが到着。

種と肥料とスポンジが入ってます。 f:id:take213uv:20180910231852j:plain


今度こそ始められる。始められますが、まだ始めません。
いくつかセンサ類を取り付けてから栽培を始める予定です。


次の記事:植物観察用のカメラモジュール 前の記事:はじめてのラズパイ

水耕栽培器IoT化 目次

*1:種の期限などあるのは理解できるけど、何とかならないものか...

はじめてのラズパイ

水耕栽培器のIoT化に当たり、まずはこれがなければ始まらない。
Raspberry Pi を用意します。

昔、Arduinoを買ってエルチカ位しかせずに速攻で飽きた経験がありますが、 ラズパイは今回が初めて。

購入


初めてだし、楽でいいよねって事で選択。全部そろってます。 OSが最初からインストールされているのは楽で良かった。 コード類は不要なものもあるので、次回は普通にバラで買おうかな。

立ち上げ

もろもろ配線接続し、OSインストール済みのSDカード挿して起動!

f:id:take213uv:20180909001031p:plain

映った!簡単!
こんなに安いのに普通にPCだ、と感心してしまった。

日本語化

初期状態では日本語の入出力が出来ない。
少し古い記事ですが、下記を元に設定。

dekirukana-dekirukana.hatenablog.com

できた。

f:id:take213uv:20180909001922p:plain
こんにちは

リモート接続

最終的に、ラズパイは水耕栽培器の中に設置することになるので キーボード、マウス、HDMIの引き回しは困難になる。 他PCからのリモート接続は必須。

こちらを参考に。xrdpというソフトをラズパイに入れる。 qiita.com

その後、リモート操作したい端末からリモートデスクトップ接続。
ラズパイに割り振られているipアドレスにアクセス。

f:id:take213uv:20180909072940p:plain

ラズパイのID/PWでログイン。
f:id:take213uv:20180909073234p:plain

映った!

ラズパイのIPアドレス固定

我が家はマンション備付のSUISUILite-plusというサービスでネット接続しています。 マンションで共用のルータが各宅につながっていて、こいつがローカルIPを割り当てるので ローカルIPは動的に変化する。

arp -aでラズパイのMACアドレス(b8:27:eb~)に紐付いているIPアドレスを毎回探しても良いのだけど、 割と面倒なのでIPアドレスを固定したい。ただし、当然共用ルータには設定できない。

ということで無線LAN APで使っているbuffalo / WSR-2533DHP-CBをルータモードに変更。 共用ルータから割り当てられたローカルIPを、自宅ルータで再度変換する2重NATの構成にする。

あとは自宅ルータのDHCPリース設定でラズパイのIP割当を固定。
これで毎回同じIPでリモート接続できる、はず。

今後の予定

カメラやらセンサやらをラズパイにつなげていく。


次の記事:水耕栽培器Green Farm(UH-A01E1)を購入した

前の記事:水耕栽培器IoT化計画

水耕栽培器IoT化 目次

オクラ収穫とか台風21号とか

仕事が始まってブログの存在をすっかり忘れていました。


リハビリを兼ねて最近の出来事をつらつらと。

オクラ収穫

今年から栽培を始めたオクラが遂に収穫の時期を迎えました。

f:id:take213uv:20180908021113j:plain

奥さん(敬称あり)の実家から芽が出て少し育った状態で分けてもらったんですが、 向こうはだいぶ前に収穫していたようなので、やっぱりベランダって発育悪い? 日光が足りてないんでしょうか?
まあとりあえず収穫できるまで育ったから良し。

収穫したオクラはめっちゃ臭い! これ食えるんか?、と不安になったんですが、どうも新鮮なオクラは臭う事があるらしいですね。 加熱したら臭いも消えました。しかも美味い。

トマトより味の違いが出て、満足感高いかも。 虫も付かないし、葉が枯れることもないし、なかなかいいですね。オクラ。

台風21号

北海道の地震ですっかり話題にならなくなりましたが、台風21号凄かったですね。

自宅は大阪市内ですが猛烈でした。 淀川が氾濫するかも、みたいな話もありました。何とか堪えてくれてよかった。

自宅自体の被害はあまりなく、精々ベランダ菜園が崩壊したくらいでしょうか。

f:id:take213uv:20180908021253j:plain

その日中に復旧。

f:id:take213uv:20180908021316j:plain

これからは台風のときは
室内に入れられるようにしておかなければ、
飛んでいったら周りに危険が及ぶし、 と反省した一件でした。


今後の計画

最近、仕事が若干落ち着いているので、今の内に色々やっておきたい。

水耕栽培器IoT化計画

水耕栽培器IoT化について、ざっくりとした計画を立てます。

構成

水耕栽培器

ユーイング製の水耕栽培器を使用。*1

ユーイング 水耕栽培機GreenFarm UH-A01E1

ユーイング 水耕栽培機GreenFarm UH-A01E1

ラズパイ

IoT化に当たっての必需品。*2

センサ類

  • 温湿度センサ
  • CO2濃度センサ
  • カメラ
  • 照度計
  • phメータ

※センサ類は段階的に導入*3

データ蓄積

とりあえずラズパイに溜め込んでおく。
若しくはクラウドに上げる。

データ活用

  • 定点カメラの画像で植物の成長をgifにする
  • 植物の発育不良などの原因分析・予兆検知
  • カメラ画像を用いた食べ頃予測
  • 照明等の外部構成のカスタマイズの効果確認

※gif画像作成以外は要データ蓄積。
 とりあえず色んな植物を育てて成長の様子を記録する。

応用

  • ダッシュボード作成
  • iOSアプリ化
  • スマートスピーカ連携


次の記事:はじめてのラズパイ

前の記事:ベランダ菜園の話

水耕栽培器IoT化 目次

*1:特に拘りはないが、よく目にするので

*2:恥ずかしながら使った事がないので、ラズパイの勉強も主な目的の一つ

*3:金銭的な制約