![]()
31.自動ミニトマト栽培機(準備編) (2021.5.23-2021.6.7)
構想編で育てているミニトマトは、そのまま手作業で栽培を続けています。植えて1ヶ月ほど経過したので、少しずつ実が付いてきました。このところ雨の日が多くて、水やりの手間が少なくて助かります。最近はずらりと房でつながったミニトマトが多いようで、今回育てているものもそうです。茎に近い方から花が咲いて、花が受粉すると先に向かって順に育っていくのがわかります。実が育つとだんだん重くなってくるので、何かで支えてやる必要が出てきます。棒やガイドにヒモで軽く支えるように縛れば良いのですが、いちいちヒモで縛る作業は面倒です。今は暫定的に縛っていますが、自動と銘打っている以上は何らかの良い方法を考えねばなりません。ただ今検討中なので、良いアイデアが浮かべば追って紹介したいと思います。
準備編ではミニトマトの栽培に使用するハード・ソフトについて考えてみます。その下準備として実験も必要になります。とりあえずデータを取るのに必要なものとして、次のものを用意することにしました。
1.Raspberry Pi本体・・・これが無ければ始まりません。
2.大気中の温度・湿度を測定するセンサー・・・周囲の環境測定用です。
3.地中の温度・水分量(湿度)を測定するセンサー・・・直接生育に関わるデータ測定用です。
4.日照を測定する照度センサー・・・周囲の環境測定用です。生育にも大きく関係すると思われます。
Raspberry Piは手元で実験に使っているものをそのまま流用します。ただし、センサー類を接続するためのI/O部分は別途基板で用意します。
DHT11モジュール
DHT11を使って一定時間間隔で画面に温度と湿度を表示するサンプル
拡張子が.txtになっていますが、プログラムで使う最は.pyに変更します。サンプルを実行すると、下図のように日時、温度、湿度の順となるデータ一式が一定時間おきに繰り返し表示されます。家にある温度・湿度計と比較しましたが、思ったより近い値が出ていて性能は悪く無さそうです。暫定的ですが、とりあえずこの状態で使えると判断しました。精度を求めるなら正確な計測器での校正が必要で、いずれ補正についても考える必要があると思います。

<補足>
しばらく測定データを経過観察したところ、時々値を正常に取得できないことがありました。センサーのせいかとも思ったのですが、他の個体に変えても同様の現象が現れたので、RasPi側のハードまたはDHT11モジュールの処理に何か問題(タイミング等?)があるように思います。既製のプログラムのため少し調査する必要がありそうです。
その後、個別のセンサーテストに使用したRasPiの処理能力が低いことが主な原因と判明しました。最終的にバージョン3のModel-Bを採用することでかなりエラーは減少しています。ただし、まだ完全とは言えません。更に調査が必要です。


水分センサーは静電容量式と抵抗式の2種類があります。後者はサビ易くて耐久性に問題があるとのことなので前者を使います。出力はアナログなので、RasPiに接続する前にAD変換が必要です。前に購入していたOSOYOOのセットの中にMCP3204と言う12bit・4chのADコンバーターが入っていたので、これを利用することにします。
前述した温度・湿度センサーやLCDもそうですし、これらは入手時にRasPiのオマケのように付いていたセット(未使用でもジャンク扱い)でしたが、予想以上に使い道があって重宝しています。サンプルプログラム等も公開されているし、とても良心的でお勧めできるセットだと思います。ホームページの日本語が未熟なのは少々気になりますが・・・。たぶん今回の用途を考えれば、あまり高精度なものは必要無くて、10bit(2ch)内蔵のMCP3002辺りでも十分と考えています。他によく使われているのが、12bit・8chのMCP3208のようです。
参考までにテスト回路は次のようなものです。接続したGPIOコネクタのピン番号は、図の下に追記したものになります。左がMCP3204のピンの名称で右がGPIOコネクタのピン番号(括弧内はGPIO番号)です。
VDD・VREF → 17ピン(3.3V)
AGND → 9ピン(GND)
DGND → 9ピン(GND)
CLK → 12ピン(GPIO18)
DOUT → 16ピン(GPIO23)
DIN → 18ピン(GPIO24)
CS → 22ピン(GPIO25)
テスト回路ではCH0に簡易的にアナログ電圧を入力します。その方法は、3.3Vの電源電圧をボリュームで抵抗分圧し、0~3.3Vの任意の電圧をCH0に印加するものです。VREFが3.3Vとしてボリュームが0オーム時はGNDレベル(Vmin=0V)、最大の10Kオーム時は電源電圧(Vmax=VREF=3.3V)になり、この間を12bitの数値でデジタル化します。VREFは厳密には電圧変動があってAD変換値には誤差が含まれますが、単なる動作テストなので変化が見られれば良しとします。テストプログラム(使用する場合は拡張子を.pyにする)ではDHT11と同様に、定期的にアナログ入力電圧をデジタル化して表示します。画面表示を見ながらボリュームを回すと、0~4095(12bit)の範囲の値を表示するはずです。ですが、回路では最小値が1より下がりませんでした。恐らくワイヤーの内部・接触抵抗値の影響やノイズで完全に0Vにはならないのでしょう。それでも使用した電源の安定度が高いのか、バラツキはプラスマイナス5程度でなかなか優秀な結果でした。
![]()
栽培装置では水分センサーを2個使い、給水部直近とミニトマトをはさんで反対側の位置に設置する予定です。とりあえず2個のセンサーの値を取り込み(プログラム上は4個)、タイムスタンプと共にセンサー値を画面表示し、同時にファイルにも保存するプログラムを作りました。
実用化時にはボリュームの代わりに水分センサーの出力(アナログ)を接続することになります。また、出力はアナログなので、ADコンバーターまでの距離が長くなるのは好ましくありません。従って、ADコンバーターはなるべくセンサーの近くに設置することにします。センサーは実際に湿度換算した補正が必要なため、センサーが完全に水没した時に最大値(湿度100%)になるようにし、空中の湿度と校正用の湿度計の値と比較して、適切な変化量を求めます。湿度0%の時のアナログ出力値が不明なので、正確に校正することはできません。冬場になれば低湿度でのデータが得られるのですが、今はなるべく乾燥した状態を作り出して値を求めたいと思います。補正処理は実際に測定を行う時に考えるとしましょう。
参考までに水分センサー値を確認したところでは、
湿度センサー:61% → 水分センサー(空気中):3520
水没(湿度):100% → 水分センサー(水中):2420
このようなデーター測定を続ければ、大体の補正値が得られると思います。利用範囲で値が比例すれば簡単ですが、果たして結果はどうなるでしょうか。
<補足>
水分センサーはいわゆる湿度計とは違うようで、しばらく観察していても空中放置時はほとんど値が変わりません。水との接触面積が関係するのか、いずれにせよ湿度計とは別物と考えた方が良さそうです。
プローブタイプの防水温度センサーは、水分センサーと同じ位置に設置します。地中の2地点で同時に水分量と温度を測るわけです。恐らく地中の温度は1日を通してさほど変化はしないと思いますが、水分量は天候によってはかなり変化が現れると思われます。両方をモニタリングすることで、ミニトマトの生育環境が大筋で把握できることを期待しています。購入した防水温度センサーは、心臓部にDS18B20が使われています。データシートによれば出力は3芯(電源・データ・GND)で、12bitのAD変換機能内蔵です。1-Wireと呼ばれる通信方式を採用しており、わずか3線で複数のセンサーを同時に接続できます。RasPiには1-Wireのためのドライバが用意されていて、機能を有効にすれば使えるようになります。設定→Raspberry Piの設定→インターフェースの中の1-Wireを有効にして、再起動をすると準備完了です。

更に管理者権限でテキストエディタのnano(他にvim等、インストールしてあるもので良い)を立ち上げconfig.txtを修正します。
sudo nano /boot/config.txt
最下行がdtoverlay=w1-gpioとなっているので、これを赤で記したように変更します。センサーはGPIO4(GPIOコネクタの7番ピン)を使うことを想定しています。別のピンの場合は適宜変更します。なお、OSのカーネルが3.18.1+以上の場合は1-Wireを有効にする設定が変更になったと言うことで、私の場合はカーネルが4.19.105(uname -aで確認)なので変更後の方法で記述しました。参考までに変更前の記述も記しておきます。
dtoverlay=w1-gpio-pullup,gpiopin=4
(変更前の古いカーネルの場合)
dtoverlay=w1-gpio,pullup=on,gpiopin=4
続いてmodulesを編集します。これによりブート時に読み込むカーネルモジュールを追加します。編集方法は上記と同様です。
sudo nano /etc/modules
下記の内容を追記します。
w1-gpio
w1-therm
再起動後に1-Wireは動作するようになります。
/sys/bus/w1/devices/" 配下に "28-"
で始まるディレクトリができていれば正常に動作しています。
Pythonでサンプルプログラムを走らせるには、w1themsensorモジュールを使うと便利なようです。その前に、一度Raspberry Pi OS(旧Raspbian)を最新状態にしてから続けることにしました。ターミナルから以下を実行します。
sudo apt-get update
sudo apt-get upgrade
ところがアップデートした途端、ファイルマネージャーが誤動作して一瞬フォルダを開いてすぐ閉じる現象が発生。慌てて対策を調べたところ、次の方法で回避できることがわかりました。
sudo apt-get autoremove
sudo apt-get dist-upgrade
これでもだめな場合、コメント欄にあった次の方法を試す必要があります。
sudo apt-get dist-upgrade --fix-missing
普通に使おうとしても色々と問題が発生するものです。Windowsに慣れた身としては、あらためてLinux系の大変さを痛感します。
不具合が解消したところで、w1thermsensorモジュールをインストールするために、ターミナルから以下を実行します。
git clone
https://github.com/timofurrer/w1thermsensor.git
cd w1thermsensor/
sudo python3 setup.py install
センサーは複数を並列に接続するだけで使えます。個別にIDのようなものが与えられていて、RasPi側できちんと区別してデータを取得してくれるようです。今回は2個のセンサーを使用し、前述の水分センサーと組にして、2組の地中センサーセットとして利用したいと思います。作例通りにGPIO4に温度センサー出力を接続してテストします。テスト回路は下図になります。ただし、図ではセンサーが1個ですが、テストも含めて2個を並列に接続して使います。なお、データ線は4.7kの抵抗でプルアップしています。
VDD → 1ピン(3.3V)
GND → 9ピン(GND)
OUT → 7ピン(GPIO4/GPIO_GCLK)
この回路でデータを取得するサンプルプログラムです。w1themsensorモジュールのおかげで、ずいぶんシンプルに記述できます。

これを実行すると次のような出力結果になります。センサー出力値は少数以下3桁の仕様ですが、他に合わせて1桁に丸めています。同じ条件で測定しているのに、結果に0.5度ものバラツキが見られるのは少々誤算でした。今回の装置ではそれほど精度を要求しませんが、せめて誤差は0.1度程度に収まって欲しいものです。精度については保留と言うことで、改めて検討したいと思います。
![]()
<補足>
大気温度センサーと並べて置いてしばらく経過観察しましたが、どうやら防水温度センサーは少し測定温度にズレが出るようです。原因は金属でシールドされているためだと思われます。金属への放熱・蓄熱のためか、外気温よりもやや遅れて温度変化が追従します。
残るセンサーは太陽光を測定するための照度センサーです。色々な種類があって迷うのですが、今回はRohm社のBH1750を搭載したボード、BH1750FVIを使用することにします。16bitのADコンバーターを内蔵し、IIC通信でRasPiと通信します。amazonで3個セット800円程なので、1個当たり270円程度で購入できます。照度計も様々な応用が利くので、余った分はいずれ何かに利用したいと思います。
VCC → 1ピン(3.3V)
SCL → 5ピン(GPIO3)
SDA → 3ピン(GPIO2)
ADD → NC = L:アドレスは23H。(VCCへ接続/H:アドレスは5cH)
GND → 39ピン(GND)
IIC通信は「20.IICインターフェース」でLCDの実験をした時に準備ができているので、それ以外で必要なセットアップをします。インストールには例によってターミナル(LXTerminal)を使います。
gitインストール(私の場合は既に以前に実行して最新)
sudo apt-get install git-core
アップデート(上記インストールした場合は実行)
sudo apt-get update
sudo apt-get upgrade
前述の水分センサーで行ったように、modulesを編集して赤字の記述を追加します。
sudo nano /etc/modules
下記の内容を追記します。
i2c-bcm2708
i2c-dev
(私の場合は前にi2c-devは追加済)
再起動した後、照度センサーが認識しているか確認します。ADDRがLなので下図のようにアドレスは23Hになっています。

WiringPiを使用するため、WiringPi本体とIICのライブラリをインストールします。いずれも既にインストールされていれば不要です。まずはIICのライブラリです。
sudo apt-get install libi2c-dev
WiringPi本体は上記のようにインストールできないため、ダウンロードしてビルドします。その前にインストール済みかチェックしてみましょう。
git --version
私の場合は既に下記のバージョンがインストール済みだったので
git version 2.20.1
と表示されました。
未インストールなら次のようにします。
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
仕様によると、この照度センサーを連続測定に使う場合は次の2つのモードがあります。今回は下の11H(高密度)で使います。
10H
Continuously H-Resolution Mode
Start measurement at 1lx resolution.
Measurement Time is typically 120ms.
11H
Continuously H-Resolution Mode2
Start measurement at 0.5lx resolution.
Measurement Time is typically 120ms.
テストプログラムで部屋の照度を測定したところ、
夜間、部屋が真っ暗 → 0ルクス
天井の蛍光灯を点灯(やや暗目) → 1700ルクス
センサーの角度を変えて上記の光を遮る → 580ルクス
比較する照度計が無いため正確性は不明ですが、動作自体は確認できました。
ここまで個別のセンサーで回路と動作の確認をしてきました。サンプルプログラムはとりあえず動作させるのが目的だったため、今はまだバラックのような状態です。得られたデータも一貫性の無いもので、今後統一化を図らねばなりません。次はこれらをまとめて、「33.環境測定装置」で実用化のためのデータ取得プログラムを構築したいと思います。
![]()