35.汎用自動植物栽培機(SAIBAI-TEC) (2021.8.29-2021.10.8)

ミニトマトの自動栽培機として始まった計画ですが、これまでの構想や実験等を元に、汎用自動植物栽培機の完成形を製作します。なお、本装置の名称は親しみ易いように「SAIBAI-TEC」と改名しました。

ハードウェアの構成は下図が基本になります。モーターと電磁弁のON/OFFにはリレーモジュールを使用。今回は採用しませんでしたが、パワーMOS-FETを使った電子式スイッチングモジュールも安価に入手できるので、次の機会には置き換えようと思います。実験では地中温度・水分量センサーは2系統用意しましたが、思ったより地中への水の浸透は均一に広がるようで、設置場所に配慮すれば1系統で大丈夫との結論に達しました。また、ミニトマトのような大型の鉢に対応するよう、L字型のより大きな散水装置を製作します。小さな鉢の場合はこれまでのものを利用します。

新たな散水装置はL字型の散水管の中央の水受けに、給水ポンプ(モーター)と追肥電磁弁から導水します。追肥のタイミングは給水時に同時に実施します。水と適当に混じることで、土に浸透しやすくなると考えています。追肥は最大10回まで行えるようにしました。給水と追肥は操作パネルの該当ボタンを押せば、任意のタイミングで手動でも可能です。

Raspberry Piと周辺回路を収めた制御装置も、より実用的なものとして新造しました。実験では紆余曲折に備えてケーブル類は主にブレッドボード用のもので配線しましたが、今回は中継用の基板に必要な回路を収納し、更に電源もバラックでは無くきちんとした形で組み込みます。新たな制御装置の全貌はご覧の通りです。2号機で変更した内容を基にして、1号機を同じような形に改造したものです。2台あれば1台にトラブルが起きても対処できるので、来年は安心して運用ができそうです。

SAIBAI-TECの回路図は下記を参照して下さい。部品の関係で基板レイアウト等は1号機と2号機で若干異なりますが、基本回路は同じものです。部品は主にユニット化された完成品を採用しているため、回路自体は非常にシンプルです。
SAIBAI-TEC回路図

電源部分は手持ちのACアダプタ活用を考慮していますが、新たに設計する場合は3系統の電源を1つにまとめあげれば良いと思います。ADコンバーターがオーバースペックだったことから、10bitの分解能で2チャンネル内蔵のMCP3002に変更しました。ADコンバーターの値読み込みをSPI通信に変更したため、GPIOの配線も初期(準備編)と異なります。詳細は「19.SPIインターフェース」をご覧下さい。ピンアサインも同じにしています。以前のローレベル・データ通信と違い、処理がかなり簡略化されてシンプルになりました。2号機に搭載した12Vファンの騒音がやや大きかったため(静音と銘打っても結構うるさいファンが多い)、DC-DCコンバーター(出力を12Vに設定)のプラス出力に直列に22オーム、1/2Wの抵抗を2個追加しています。ダイオードを直列に複数個つないで、ファンへの印加電圧を下げる方法もあります。一般的に8~9V程度まで下げると、風量は多少下がるものの騒音は許容範囲になると思います。

なお、採用した土壌水分センサーは一応の目安にはなるものの、校正する術が無くて正確な値が把握できません。個体差も結構大きいようで、個別に出力の最大・最小値を求めてカスタマイズする必要がありそうです。2~3個のセンサーを使って平均値を求める等、まだまだ工夫の余地があります。そもそもセンサー出力がリニアに変化する保証も無く、得られた水分量はあくまでも目安であることを念頭に置かねばなりません。土壌との接触の状態が最も値に大きく影響すると思われるので、ある程度状態を把握できるまでは、目視と手触りで土の湿り具合を確認し続ける必要があると考えています。

ソフトウェアについては地道に改良を続けてきた結果、概ね予定した機能を搭載することができました。コンピューター制御の要は何と言ってもソフトウェアで、今後も改良の余地は多々あると考えています。ソフトウェア自体は公開しませんが、こうした装置を考えている方には、各自で独自のアイデアを加えて、納得のいくものを作り上げて頂ければと思います。その際に、本テーマが少しでも参考になれば幸いです。

2号機を新たにセットアップするため、環境設定のおさらいも兼ねてOSの初期化を実施しました。作業手順は次の通りです。
1.OSの初期化 → 起動時にシフトキーを押してOSをクリーンインストールする。
3.起動したら初期設定を行う。(順にウイザードが表示される)
  ・Set CountryでJapanを選択(他は自動設定される) → Next
  ・Change Passwordでパスワードをセット(何もセットしないと初期設定のRaspberryとなる) → Next
  ・Set Up Screenでデスクトップ周囲に黒い枠があったら、This screen ・・・の前のチェックボックスにチェックを入れる。 → Next
  ・Select WiFi Networkで接続したいアクセスポイントを選択する。 → Next
  ・WiFiのパスワードを入力する。 → Next
  ・WiFiに接続するとアップデートを求められるのでNextで進む。必要無ければSkipで進む。
  ・アップデートが終わるとSetup Completeダイアログが出るので、Restertをクリックして再起動する。
4.更にアップデートと日本語化(fcitx-mozcのインストール)を実施する。  
  sudo apt-get update
  sudo apt-get upgrade
  sudo apt-get install fcitx-mozc
5.メインメニューからRaspberry Piの設定 → インターフェースと進み、必要な機能の追加を行う。
   私の場合はシリアルポートとリモートGPIO以外は全て有効に設定。OKで設定を閉じたら再起動する。
6.Scheduleをインストールする。
  sudo pip3 install schedule
7.・・・  

他にもありますが記録をとっていませんでした。いずれにせよ、OSのバージョンアップに伴ってどんどん機能が取り込まれているため、追加のインストールや設定が不要になるケースが増えています。何も手を加える必要が無くなるのが理想なので、より扱い易いOSに進化することを望みます。

栽培の自動化についてはデータが不十分なため、今は部分的な条件による暫定的な形での運用となります。制御用の操作パネルは一応の完成形として下図のようになりました。大きな機能追加としては、本装置で得た環境データファイルを、操作パネルから一括して削除可能にした点です。環境ファイルは毎日2種類が作られるため、数ヶ月も運用するとかなりの数になります。フォルダを開いて消せば良いのですが、面倒なのでパネルから一気に消去します。もしも残しておきたいファイルがあれば、あらかじめ別のフォルダに移動しておきます。

最新の改良点として、メンテナンスしやすいように初期設定ファイルを導入し、給水時間や給水条件等を簡単に書き換えられるようにしました。汎用性が高まったため、ここを書き換えることで様々な植物の自動栽培に対応します。栽培の目安のためにシステムの累積稼動時間も表示することにしました。1日ごとにカウントアップするわけですが、この日数を元に追肥タイミングを決定しています。しかし、以前のものでは何らかの要因でシステムを終了してしまうと稼動日数はリセットされてしまいます。そこで初期設定ファイルに、システムの最初の起動日を記憶することにしました。日付をリセットして開始したい場合は、設定ファイルの開始日を「---」とすることで、起動時に当日の日付が設定されます。

初期設定ファイルを使うにはPythonのconfigparserモジュールを使います。初期設定ファイルはテキストファイルですが、分かりやすいように拡張子を.iniとしました。ファイルは初期設定項目を分類して記述することができます。本システムでは動作内容に応じて書き換えるパラメーターと、固定値をセットする2種類で構成しています。なお、configparserは一部の内容でも書き換える際に一度全体を作り直すようで、大文字は全て小文字に変換されてしまいました。ただし、読み出しの際は大文字・小文字の区別が無いらしく、小文字化による支障はありません。コメント等は全て削除されるとのことなので、必要なら別途対策が必要になります。

現段階で自動栽培に使用しているのは、各種センサーのうち地中温度センサーと地中水分量センサーのみです。これらは最重要の要素ですが、外気の温度、湿度、太陽光(照度)も生育に大きな影響を及ぼすはずです。センサーは用意してあるので、今後どのように自動栽培に活用するかが課題となります。例えば外気等の状況に応じて、給水量を更に補正するようにすべきでしょう。将来的なアイデアとしては、強過ぎる陽光に対しては遮光するとか、雨を検知すると自動的にカバーで覆う等が考えられます。別途追加する新たな装置が必要ですが、実現困難なものでも無いのでいずれ考えてみたいものです。更に現在の自身のスキルでは難しいテーマですが、カメラで生育を監視して追肥を制御したり、収穫時期を予測・案内する機能等も視野に入ります。

制御プログラムは発展途上ですが、今回難航した点について補足しておきます。SAIBAI-TECでは、ルートとなるベースの処理の他に3つのスレッドを立てて並列処理させています。ルート部分は制御パネルでTkinterを使うことによるループが必要で、他の処理が影響を受けないように独立して動作しなければなりません。スレッドの1つは栽培の全体処理を管理するメインループです。残る2つは環境データ取得のループ(5分ごとに取得)と、毎日の水やりと適宜発生する追肥のタイミングを管理するループ(基本は1日1回の水やり処理のタイミング)です。時刻補正については、環境データ取得ループの中での処理となります。

最後の2つのスレッドに対しては、前者は1つのスケジュール、後者は2つのスケジュールを実行します。スケジュールの実行のためには、schejule.run_pending()をループを使って持続させる必要があるのですが、これをどこに置くかが重要になります。最初は2つのスレッドでそれぞれの処理の最後にループを入れていましたが、これが原因で予期せぬ割り込み動作が発生してしまいました。例えば水やりが同じタイミングで複数回発生したり、更に無限ループとなってエラーで落ちるといった具合です。この原因がわからずかなり悩むことになりました。最終的な解決策は、一連の処理の最後に実行するスケジュールの後にループを置くことでした。どうやらスケジュールの実際の実行タイミングはこの1つで全てをまかなっているようで、複数に分散して入れてしまうと2重、3重に同じスケジュールが実行されてしまうようです。たぶんそういう仕様なのでしょうが、こういった情報は容易には得られず、自力で調査して解消する以外に方法がありません。どのプログラミング言語でもそうですが、予期せぬ動作に対処するのは骨の折れる作業です。

取得した環境データをグラフ化するプログラムも、SAIBAI-TECの進化に合わせてリニューアルしました(名称は「SAIBAI-GRAPH」)。下に示すのが最新バージョンで表示した直近の1日のデータです。室内での測定であり、当日は1日薄暗い状態で気温変化も乏しかったため、照度データ(黄色)が著しく低く全体の変化が乏しい結果となっています。

稼動状況は随時追記するとして、自動栽培のための指針を検討していこうと思います。現在水やりは次のような条件で仮運用しています。
●毎朝6:00に水やりを実施する。(毎夕19:00から変更)
●地中温度が5度未満では給水しない。→ほとんど水分量は減らないため休止。(地中水分量よりも優先)
●地中温度が30度を超えたら給水しない。→高温水となって根が痛むのを避ける。(地中水分量よりも優先)
●地中水分量が60%を超えたら給水しない。→水分過多で根腐れの恐れがあるため。
●地中水分量が40%未満になったら水不足と判断して給水量を2倍にする。
●地中水分量が20%未満になったら過度の乾燥と判断して給水量を3倍にする。

水やりは地中が常に一定の水分量を保つよりも、適度のサイクルをもって増減した方が良いとされているようです。どうやら人間と同じで、常に快適な環境では甘えて(?)健全な発育ができないのでしょう。そのため、現在の指針は上記のように水分量の判定にかなりの幅を持たせています。ただし、この状態で運用すると、例えば季節による地中水分の蒸発具合に、植物の種類や成長具合によっても地中の水分減少量が変わり、給水量が不適切となる可能性があるわけです。つまり、環境条件によっては給水量が不十分なままとなったり、逆に多過ぎたままになることも起こります。ですから、ある程度の地中水分量の目標値を定め、給水量を適宜増減する制御を行う必要があると思われます。幸いSAIBAI-TECでは、照度や大気中の温度・湿度等も測定できるので、これらの変化を捉えて給水量の目安を数値化することを目標にします。大きな変化は夏場でないと捉えられないので、来年は主目的であるミニトマトの栽培を通じて、貴重なデータを得ていきたいと考えています。

日々の操作状況を記録したファイルのサンプルが次のものです。システム稼働中は、何らかの操作が行われる度に記録します。プログラムを修正しながら何度も終了と開始を繰り返したため、その状況も記録されています。
操作ファイル