GreenPiThumb: Raspberry Piで作るガーデニングボット
原文は Michael Lynch により に公開されました。 このブログを購読する
はじめに
これはGreenPiThumbの物語です。観葉植物に自動で水をやるガーデニングボットですが、時には枯らしてしまうこともあります。
物語は約1年前に始まります。突然、観葉植物を育てたいという気持ちが湧いてきたのです。植物があれば部屋の見栄えが良くなるし、不足しがちな酸素も供給してくれるし、来客には生き物の世話ができる責任ある大人だという印象を与えられるだろうと考えました。
しかし私はプログラマーであって、庭師ではありません。植物を育てるとなれば、週に数回は水やりをし、健康状態をチェックしなければなりません。それなら、いっそ数百時間かけてその作業を代わりにやってくれるロボットを作った方がずっと楽だと思いました。植物が80歳まで生きてくれれば、かろうじて元が取れる計算です。
なぜGreenPiThumbなのか
私が手がける多くのソフトウェアプロジェクトと同様、GreenPiThumbの最大の動機は新しい技術を学ぶことでした。前作のアプリであるProsperBotは、GoやAnsible、Redisを独学するために作りました。GreenPiThumbはフロントエンド開発、特にJavaScriptとAngularJSを学ぶ機会だと考えました。
友人のJeetはちょうどプログラミングを学び始めたところだったので、GreenPiThumbで一緒にやらないかと声をかけました。コードレビューやユニットテスト、継続的インテグレーションといった健全なソフトウェアエンジニアリングの手法を学ぶ良い機会になると思ったのです。Jeetは乗り気になってくれたので、2〜3か月で終わるだろうと思いながらプロジェクトを始めました。
Raspberry Piで動く
Raspberry Piは、ホビイスト向けに作られた小型で安価なコンピューターです。人々はRaspberry Piを使って近未来的なスマートミラーを作ったり、昔のゲームを動かしたり、電動スケートボードを走らせたりしています。
私自身、この数年Raspberry Piで遊んできましたが、ソフトウェア畑の人間なので、安価なおもちゃのサーバーとして使う以上のことはしてきませんでした。愛好家コミュニティの大多数にとって、Raspberry Piの最大の魅力は家電や電子機器と簡単に連携できる点にあります。
豊富なセンサーや連携ガイドが揃っていることを考えると、Raspberry PiはGreenPiThumbにうってつけでした。Raspberry Piを使えばハードウェアの機能を学ぶ良い挑戦になるし、あの謎の「GPIOピン」が一体何なのか、ようやく理解できるだろうとも考えました。

Raspberry Piと謎のGPIOピン
なぜまた別のRaspberry Pi製ガーデニングボットを作るのか
もちろん、Raspberry Piで動くガーデニングボットを思いついたのは私たちが初めてではありません。私たちに先行するクールなプロジェクトとしてはPiPlanterやPlant Friendsがあり、他にもいくつか存在します。
私たちがあえて自分たちで作ることにした理由は2つあります。自分で作るのは楽しいということ、そしてボットのソフトウェアを最優先事項にしたかったということです。
多くのRaspberry Piプロジェクトは電子工作が得意だがプロのソフトウェア経験はない愛好家によって作られています。私たちはその逆を目指しました。ソフトウェアは素晴らしいけれど、ハードウェアはかろうじて動く程度で、時にはブレッドボードが溶けるほど熱くなってしまうようなものを。

初期のプロトタイプ。おそらく「発火しかねない」問題を抱えていました
GreenPiThumbのコードはオープンソースで、以下のような特徴を備えています。
- 充実したユニットテスト
- コードカバレッジのトラッキング
- 継続的インテグレーション
- デバッグログ
- 徹底したドキュメント ― READMEもコードコメントも
- スタイルガイドの徹底した遵守
- インストーラーツール
ハードウェアアーキテクチャ

GreenPiThumbの配線図(ダウンロード可能なファイル)
Raspberry Piはデジタル信号しか読み取れないため、アナログセンサーを直接読み取ることはできません。そこでMCP3008アナログ-デジタルコンバーターを使い、アナログの土壌水分センサーや光センサーからデジタルな読み取り値を生成しています。
DHT11センサーは気温と湿度を検知します。デジタル信号を出力するので、Raspberry Piに直接つなぐことができます。
最後に、12Vのウォーターポンプがありますが、Raspberry Piが出力できるのは5Vまでなので、12V電源アダプターをMOSFETと直列にポンプへつないでいます。Raspberry PiはMOSFETをデジタルスイッチとして使い、ポンプをオフやオンにしたいときに回路を遮断したり接続したりします。
ソフトウェアアーキテクチャ
GreenPiThumbのソフトウェアアーキテクチャ
GreenPiThumbバックエンド
バックエンドはGreenPiThumbの重労働を担います。Python製のアプリで、以下の処理を担当します。
- 物理センサー(土壌水分、温度など)の管理
- ウォーターポンプのオン/オフ切り替え
- イベントやセンサーの読み取り値をデータベースに記録
GreenPiThumbウェブAPI
ウェブAPIはGreenPiThumbの状態や履歴に関する情報を提供するHTTPインターフェースです。GreenPiThumbのデータベースに対する薄いラッパーで、すべてをJSONに変換するため、ウェブアプリケーションが理解しやすくなっています。
GreenPiThumbウェブダッシュボード
ウェブダッシュボードはGreenPiThumbの現在の状態を表示し、センサーの読み取り値の経時グラフを作成します。
私たちのRaspberry Piではインターネットに公開するウェブサーバーとして動かすには力不足なので、ローカルのものと同一のGreenPiThumbダッシュボードの静的ミラーを用意しました。
デプロイ
GreenPiThumbをRaspberry Piデバイスにデプロイするために、オープンソースのIT自動化ツールであるAnsibleを使っています。
GreenPiThumbが必要とするすべてのソフトウェアをデプロイするために、カスタムのGreenPiThumb用Ansible設定(Ansible用語でいう「ロール」)を作成しました。このAnsibleロールはGreenPiThumbのバックエンドやフロントエンドのコードに加え、GreenPiThumbが依存するサードパーティ製ソフトウェアコンポーネントもダウンロードしてインストールします。
わずかいくつかのコマンドで、まっさらなRaspberry Piデバイス上でこのツールを使い、数分以内にGreenPiThumbのソフトウェア一式を稼働させることができます。
道中のつまずき
GreenPiThumbの完成には1年以上かかりました。予想よりはるかに長くなったのは、数週間にわたって進行を止めるような壁に何度もぶつかったためです。以下では、特に興味深かった障害についていくつか紹介します。
水の分配
他のRaspberry Piガーデニングプロジェクトは土壌にどう水を行き渡らせるかについて語っていませんが、それは残念なことです。なぜなら私たち自身、いまだにうまく解決できていないからです。
最初にプランターに水を送ったとき、チューブから細い水流が一箇所に集中し、その部分だけがびしょ濡れになる一方で、他の土は乾いたままでした。ゴムチューブをプランターの内壁に沿って巻き、穴を開ける案も考えましたが、土の中央部まで十分に水が届くか確信が持てませんでした。シャワーヘッドを使ってみようともしましたが、チューブに水漏れしないように固定しつつ、水流の向きを制御する方法が分かりませんでした。
最終的に私たちがたどり着いたのは「スプレーして祈る」方式でした。アパートの中を見回して、問題を解決できそうなものを手当たり次第につかんだ末に生まれた解決策です。小さなキッチン用手袋の指を1本切り取り、きつく二重にした輪ゴムで給水チューブに固定し、縫い針と爪切りで手袋にたくさんの穴を開けました。
ポンプを動かすと、切り取った手袋の指はたちまちチューブから吹き飛び、アパートの壁一面に水をまき散らしました。再度取り付け直しましたが、今度は輪ゴムのすぐ前に安全ピンを刺して、前にずれないようにしました。


給水ディストリビューターと化したキッチン手袋
最もエレガントな解決策とは言えませんが、概ねうまく動いています。
園芸の部分は難しいはずではなかった
GreenPiThumbで一番の難関になるはずだったのは電子工作でした。園芸はそれほど難しくないと思っていました。特にインゲンは丈夫な植物で、育てるのに基本的な園芸スキルしか要らないとよく言われています。
ところが、私たちにはその基本的な園芸スキルすらなかったのです。GreenPiThumbは室内ガーデンの世話における人間の作業を自動化するためのものですが、何かを自動化するには、人間が「正しい状態」を分かっていなければなりません。自分たち自身どれくらい水をやればいいのか全く分からなかったので、GreenPiThumbが水をやりすぎなのか少なすぎなのかを判断するのも困難でした。そうして私たちは、期せずしてこの園芸ホラー映像を作ってしまったのです。
水分の測定はどれほど難しいというのか
私たちを最も悩ませた問題は、土でした。
GreenPiThumbを作り始めた当初、土壌水分は水やりの日に上がり、水をやらない日には下がるものだと考えていました。GreenPiThumbの仕事は、測定値がある閾値を下回ったら水を追加して、適切な水分レベルを保つだけの簡単なものだと思っていたのです。
以下では、高価で複雑なモデリングソフトウェアを使って、GreenPiThumbに期待していた土壌水分のパターンを可視化してみました。

想像上の土壌水分パターン
おかしな測定値
しかし土は私たちに協力してくれませんでした。初期の構成では、土壌水分の測定値は95%から100%の間で振動した後、ゆっくりと約99.5%に収束しました。土壌センサーを取り外し、空気、水、濡れたペーパータオル、手、完全に乾いた土など、さまざまな媒体でテストしてみました。これらではいずれも妥当な値が得られたのですが、少しでも湿り気のある土ではセンサーの値がほぼ100%まで跳ね上がってしまうのです。

土壌水分の測定値、初期の水分センサー
当初はDickson Chow氏のPlant Friends用土壌プローブを使っていましたが、SparkFunの土壌センサーに交換しました。新しいセンサーでは湿った土で82%を示し、水やり直後には85%まで跳ね上がりました。しかし数時間以内にまた82%まで下がり、そのまま何日もその値を保つのです。このセンサーは、3時間前に水をやった土と5日間水をやっていない土を区別できないようでした。

土壌水分の測定値、SparkFun水分センサー
土が壊れている気がする
もしかしたら土のせいなのかもしれません。私たちが使っていた培養土はMiracle-Groの既製ミックスで、「水やり簡単フォーミュラ」を謳っていました。ちょっと怪しくないでしょうか。明らかにこれは決して乾かない、邪悪な遺伝子組み換えの土に違いありません。だから哀れな土壌センサーが混乱するのも無理はないのです。
私たちを翻弄しない土が必要だったので、別の有機培養土を購入しました。テストとして、プラスチックカップにその有機培養土を入れ、水を加えて底に穴を開けて排水させ、GreenPiThumbのプランターと同じ土壌条件を再現するために3日間放置しました。3日後、両方の土でセンサーをテストしてみました。
結果はまったく同じでした。どちらも82%でした。つまり、土のせいにはできなかったのです……。
あきらめ
打つ手がなくなった私たちは、GreenPiThumbの着想元となったプロジェクトを再訪しました。彼らはこの問題をどう解決したのでしょうか。
Plant Friendsはそもそも水をポンプで送っていません。PiPlanterは土壌水分を測定はするものの、水やりは水分レベルに関係なく固定スケジュールで行います。ググってみると、土壌水分だけに基づいて水やりをしていると主張するRaspberry Piガーデニングプロジェクトがいくつか見つかりましたが、ソースコードを公開しているものも、結果のデータを共有しているものも一つもありませんでした。したがって、水分レベルに基づいて水やりをすることは不可能であり、GreenPiThumbは物理世界の避けがたい制約の中で最善を尽くしていると考えるのが妥当だと感じました。
最終的に、私たちはハイブリッド方式に切り替えることにしました。現在のGreenPiThumbは、土が乾きすぎた場合か、前回の水やりから7日が経過した場合に水をやるようにしています。
完成品
以下が、完成したGreenPiThumbの写真です。





タイムラプスはこのプロセスで最も楽しい部分でした。これは最初のインゲン(R.I.P.)のものです。植物があんなに早く真上からの至近アングルから外れて成長するとは思っていませんでした。最終的にはより大きな自在マウントに切り替え、植物の一生をより良いアングルで捉えられるようにしましたが、最初のセットアップでも成長初期の数日間の素晴らしいタイムラプスを捉えることができました。
2回目の栽培では、成長期間を通じてカメラをまったく同じ位置に固定しました。これが第2弾のこれまでの成長記録です。
学んだこと
物事は見かけほど単純ではありません
当初は2〜3か月で終わる単純なプロジェクトだと思っていましたが、完成まで1年以上かかりました。物事は見かけほど単純ではないからです。
これはずっと昔、名エッセイストであるJoel Spolskyから学んだ教訓であり、これからも多くのソフトウェアプロジェクトで何度でも学ぶことになるだろうと思っています。
電子工作:基礎から始める
GreenPiThumbを始めた当初、電子工作に関する私の知識は高校の物理の淡い記憶に基づくものだけでした。Arduinoスターターキットを買い、チュートリアルを一通りこなして電子工作の基礎を築きました。
これらのチュートリアルはとても楽しく、有用でした。簡単なところから始めて、徐々により高度なトピックへとステップアップしていく構成がよくできています。電子工作に興味のある初心者には、このキットをおすすめします。
ハードウェアは個別にテストする
私と一緒にソフトウェアプロジェクトに取り組んだことがある人の中には、コードを書く際の私を「神経質」だとか「過剰に形式的」だと評する人もいます。私は自分のコーディングスタイルを「厳密」だと考えたいと思っています。GreenPiThumbではまずソフトウェア部分を実装し、各コンポーネントを厳密にピアレビューし、一つひとつテストしました。
ところがハードウェアに関しては、まったく厳密ではありませんでした。敢えて言えば、少しぞんざいで、笑えるほどナイーブでした。当初のハードウェアテストの手順は、GreenPiThumbのソフトウェアの基本版を書き、すべてのセンサーをテストボードに配線して実行し、何が出力されるか見てみるというものでした。
何も出てきませんでした。まったく何もです。なぜなら、それはハードウェアをテストするにはひどい戦略だったからです。システム内のすべての電子部品は、部品自体が不良か、あるいは正しく取り付けられていないかという理由で故障する可能性があります。すべてを一度につないでしまったため、どの部分が壊れているのかを特定する術がなかったのです。
やがて、私たちはセンサーを個別にテストすることを学びました。ハードウェア部品ごとにスタンドアロンの診断スクリプトを作成したのです。現在ではハードウェアに手を加えるたび、まず診断スクリプトを実行して正常な値が得られているか確認することを最初に行います。新しいハードウェアが動かないときは、マルチメーターを使って体系的に根本原因を突き止めます。マルチメーターはもっと早く買っておくべきでした。たった13ドルでしたが、数え切れないほどのフラストレーションと頭を抱える時間を節約できたはずです。
ソースコード
パーツリスト
以下のリストはGreenPiThumbの製作に使った機材です。私たちのモデルを再現しやすいように正確なパーツを共有していますが、その多くは汎用的な部品なので機能的に同等のものに置き換えることができます。
GreenPiThumbの必須パーツ
- Raspberry Pi 3 Model B
- 12Vウォーターポンプ
- Raspberry Pi Camera V2 - 8 MP
- 100-240V AC - 12V&5V DC 4ピンMolex 2A電源アダプター
- MicroSDカード(32 GB)
- シリコンチューブ
- FQP30N06L NチャンネルMOSFET
- Raspberry Pi用電源
- DHT11温度・湿度センサー
- MCP3008アナログ-デジタルコンバーター
- はんだ付け用ブレッドボード(400タイポイント)
- 土壌水分センサー
- ゴム手袋
- Molex - SATA電源ケーブルアダプター
- 光依存性フォトレジスタ
- 1ガロン プラスチック製ウォータージャグ(貯水タンク用)
- 安全ピン
- 輪ゴム
汎用的な電子部品
以下のアイテムは多くのプロジェクトで使える汎用的な電子工作用の工具や部品です。私たちは電子工作の機材をまったく持っていなかったため購入したものですが、網羅性のために記載しています。
Netflix and chill用ワイヤーリード線- はんだごて
- 抵抗セット(各種)
- ワイヤーストリッパー
- はんだごてスタンド
- ジャンプワイヤ
- 熱収縮チューブ(はんだ付け部を覆う用)
- ニッパー
- はんだ付け不要ブレッドボード 830タイポイント(テスト用)
園芸用品
オプションの部品
- サードハンドはんだ付けツール
- 最初はこのベーシックなクランプスタンドを使っていましたが、位置決めや調整がぎこちなく感じました。自在アーム式のモデルは数倍高価でしたが、はんだ付け作業をより簡単で快適なものにしてくれました。
- 自在カメラマウント
- カメラの固定に最適です。長くて柔軟性があるため、良いアングルや距離を見つけるための選択肢がたくさんあります。
- PEXチューブカッター
- 給水チューブをきれいに切断できます。
- デジタルマルチメーター
- 基本的なマルチメーターの購入を強くおすすめします。この特定の製品に特別なところはありませんが、私たちには十分役立ってくれました。
- Piカメラマウント
- Raspberry Piカメラを上記の自在マウントのような標準的な1/4インチカメラマウントに取り付けることができます。
- Piカメラ延長ケーブル(1m)
- Raspberry PiカメラをRaspberry Pi本体から離れた場所に配置するのに必要です。
- 結束バンド
- チューブや配線を固定するためです。
謝辞
このプロジェクトを手伝ってくれた皆さんに心から感謝します。
- Devon Bray氏。そのプロジェクトであるPiPlanter 2はGreenPiThumbのハードウェア面に大きなインスピレーションを与えてくれました。
- Dickson Chow氏。そのプロジェクトであるPlant Friendsは有用なハードウェア参考資料となり、プロジェクト全体を通じて多くの励ましをいただきました。
- Nicole Michaelis氏。この記事の編集をボランティアで手伝ってくれました。
- /r/raspberry_piのRedditコミュニティ。配線の問題で行き詰まった際のサポートに感謝します。
記事をランダムに読む
コメント
ログインしてコメントする