GreenPiThumb:Raspberry Piで作るガーデニングボット
はじめに
これは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などがあり、そのほかにもいくつか存在します。
それでも自分たちで作ることにした理由は二つあります。自分の手で作るのは楽しいこと、そしてボットのソフトウェアを一級の関心事にしたかったからです。
大半の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インターフェースです。データベースの薄いラッパーで、すべてのデータをJSONに変換してウェブアプリケーションから扱いやすくしています。
GreenPiThumbウェブダッシュボード
ウェブダッシュボードではGreenPiThumbの現在の状態を確認でき、センサー計測値の推移をグラフで表示できます。
私たちのRaspberry Piではインターネットに公開するウェブサーバーとして動かすには力不足なので、ローカルのものと同一の静的なミラーを用意しました。
デプロイ
GreenPiThumbをRaspberry Piデバイスにデプロイするために、オープンソースのIT自動化ツールであるAnsibleを使っています。
GreenPiThumbが必要とするすべてのソフトウェアをデプロイするために、カスタムのGreenPiThumb用Ansible設定(Ansible用語では「role」)を作成しました。このAnsible roleはGreenPiThumbのバックエンドとフロントエンドのコードに加え、依存するサードパーティ製ソフトウェアもダウンロードしてインストールします。
数回のコマンドを実行するだけで、まっさらなRaspberry Piデバイス上でこのツールを使い、数分以内にGreenPiThumbのソフトウェア一式を稼働させることができます。
道のりのつまずき
GreenPiThumbの完成には1年以上かかりました。数週間にわたって作業が止まるような障害が相次ぎ、予想をはるかに超える期間となりました。以下では、特に印象的だった壁について紹介します。
水の行き渡らせ方
ほかのRaspberry Piガーデニングプロジェクトは、土にどう水を行き渡らせるかについて触れていません。残念なことに、私たちもいまだに正解を見つけられていません。
初めてプランターに水を送ったとき、チューブから出た細い水流は一点に集中し、その部分だけがびしょ濡れになる一方で残りの土は乾いたままでした。ゴムチューブをプランターの内壁に沿って巻き、穴を開ける方法も考えましたが、土の中央まで十分に水が届くか不安でした。シャワーヘッドも試しましたが、チューブに水漏れしないように固定しつつ水流の向きを制御する方法が見つかりませんでした。
最終的にたどり着いたのは「まいて祈る」方式でした。部屋の中を見回して、問題解決に使えそうなものを片っ端から掴んで生まれた解決策です。小さなキッチン用手袋の指を1本切り取り、水用チューブに二重にきつく巻いた輪ゴムで固定し、縫い針と爪切りで手袋にたくさんの穴を開けました。
ポンプを動かすと、切り取った手袋の指はチューブから勢いよく飛び出し、部屋の壁一面に水をまき散らしました。すべてを付け直したうえで、今度は輪ゴムが前にずれないよう、すぐ前に安全ピンを刺しました。


散水器に変身したキッチン手袋
最もエレガントな解決策とは言えませんが、概ねうまく機能しています。
難しいはずではなかった園芸
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は土壌水分を計測するものの、水やりは水分量に関係なく固定スケジュールで行います。Googleで検索すると、土壌水分のみに基づいて水やりを行うと謳う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 to 12 & 5V DC 4pin Molex 2A Power Adapter
- 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コミュニティ。
記事をランダムに読む