IoT プロトタイピング ~植物育成システム~ 作ってみてわかった意外なこと

2019/07/18

皆さんこんにちは。 ソフトウェアエンジニアの ogu です。

ここ最近自宅の仕事机にさまざまな IoT ガジェットが積み上げられていき、妻からの冷たい視線が気になりはじめました。 以前はこういうものたちはオフィスに置いておいたのですが、最近は自宅で仕事をすることが多く、仕事で使うガジェットと趣味のものとが混在しているためより多く見えてしまうのかもしれません。 リモートワークが可能なソラコムならではの悩みかもしれませんね。

さて、先日開催しました SORACOM Discovery 2019 の「IoT プロトタイピング」コーナーで、私は「植物育成システム」の展示をさせていただきました。

展示の様子 展示の様子 展示の様子2 展示の様子2

今日はそのシステムについて、当日説明しきれなかったようなよもやま話を交えつつ、簡単に解説させていただきたいと思います。 また、今回の展示を通してたくさんの学びを得ましたので、その点についても読者の皆様に共有させていただければと思います。

今回の展示の概要 今回の展示の概要

きっかけは・・・観葉植物を二度枯らしたこと

今回、植物育成システムをプロトタイピングして展示しようと思ったきっかけの一つは、恥ずかしながら仕事部屋の観葉植物を2回も枯らしてしまったことです。

一度めは自宅の庭に生えていた苔を取ってきて、それを育てて苔玉でも作ろうと思ったのですが敢えなく失敗しました。 苔はジメジメしたところを好みそうなイメージがありましたが、意外と日当たりを必要とする植物だったのです。 最初は仕事机の脇に置いておいたのですがあまりに日が当たらないため、鮮やかな緑色がだんだん褪せて茶色くなってきてしまい、慌てて日当たりの良い窓際に移したのですが、今度は日が当たりすぎて干からびてしまいました。 水やりは基本的に毎日行っていたのですが、数日留守にした間に完全にカサカサになってしまっていました。水をかけたら一応復活はしたようだったのですが、鮮やかな緑色は戻らず、容器にカビも生えてきたりしたため断念して苔には元の場所に戻ってもらいました。

二度目は、ホームセンターで購入してきたポトスを枯らしてしまったことです。ポトスは日当たりがなくても育つ、というかよほどのことがない限り枯れたりしない丈夫な観葉植物というイメージだったのですが、これも枯れてしまったのです。

その時点で仕事部屋で観葉植物を育てることを一度は諦めたのですが、やはり緑がほしいなという気持ちはずっとありました。

Seeed 社から格安な CO2 センサー発売

そんなある日、Seeed 社が Grove に対応した格安な CO2 センサー を発売しました。

この CO2 センサーを使うとしたらなんだろうな~と漠然と思いを巡らせてみたのですが、やはり植物の育成システムのようなものが一つの候補として考えられます。 植物の光合成には CO2 が必要ですから、CO2 の濃度と育成状況の関連などが調べられそうです。(そのような研究はすでにやり尽くされているとも思いますが)

ただ、従来の CO2 センサーは 私の個人ブログの記事 にも書いたように価格が高く、個人で購入して値を測定して楽しむという目的ではちょっと手が出しづらいものでした。 それが今回かなりの低価格で Grove に対応した CO2 センサーが発売されたと聞いてがぜん興味が湧いたのです。

なお、格安なのには理由があり、CO2 そのものを測定するのではなく、eCO2(もしくは CO2 equivalent)という数値を計測するセンサーになっています。CO2 を直接測定するのは難しい(センサーが高価になってしまう)ようなので、代わりに VOC(Volatile Organic Compounds: 揮発性有機化合物)と H2(水素)の濃度を測定し、そこから CO2 濃度を算出(推定)する方式のようです。 詳しくは 論文 も出ているようなのでそちらを参照していただくとして、室内で人がいる環境では比較的良好に CO2 濃度を推定できる方式のようでしたのでこちらのセンサーを使ってみたいと思いました。

三度目の正直

そして今年(2019年)のゴールデンウイークの直前。 我が家の庭には新緑が芽生え始め、休日に雑草取りなどをしていたら、庭の一角の砂利を敷き詰めた部分に砂利の間から小さなヘデラ(アイビー)が芽を出していたのを見つけました。その小さな小さな葉っぱを見て、ただ抜いて捨ててしまうのはかわいそうで、これを育ててみようと思いました。 今度は IoT の力でもう少しまともに育ててみせるという決意とともに。

準備 - お買い物

さっそく Seeed Studio のページで必要そうなものを買い揃えました。

まず、日照の問題を解決するために、植物工場のように LED 照明を使ってみようと思いました。 Grove システムで Wio に接続可能な LED はスタンダードな単体のものからストリップタイプやマトリックスタイプなどいろいろありましたが、リングタイプの LED を選びました。

こちらの LED は 20 灯でフルカラー(RGB 各 256 階調)に調節でき、明るさや色味などを自在に調節できそうだったので選択しました。 ストレートな 10 灯のタイプもありましたが、必要な光量がどのくらいかわからなかったので、大は小を兼ねるということで 20 灯のリングタイプを選択しました。

植物工場の写真などを見ると、ピンク色の光を植物に当てているイメージがあると思います。植物の育成には赤と青の特定の波長の光がキーになるらしいことから、それらの波長の光だけを効率的に照射するとそのようなピンク色の光になるようです。 そのような、光の色の違いによる育成状況の違いなどもゆくゆくは見てみたいと思いましたので、フルカラーの色調節ができるこちらのタイプの LED を選択しました。

次に、こちらの LED がちゃんと照射できているかを確認するために、明かりセンサー をつけることにしました。 これはのちにわかりましたが、真っ暗な状態だと 0、LED が照射されている状態だと 600 程度の値が得られるのですが、LED を照射していると LED の明るさにはあまり左右されず、常にその 600 程度の値で飽和状態になってしまうため、LED が照射できているかどうかということを確認するという当初の目的は果たすことができましたが、十分な光量があたっているかどうかを確認したりすることはできなさそうだったので、値段は多少高くなりますが 輝度センサー など別のセンサーにすればよかったかもしれません。 そのあたりは後々の課題としたいと思います。

土の水分量の測定を行うために、土中水分量センサー も購入しました。 こちらは静電容量で土の中の水分量を測定する方式のもので、金属端子が露出していないためサビが発生しづらくなっているタイプのものです。

それから、もちろん先程の CO2 センサーも購入しました。植物の育成には CO2 が欠かせないはずなので、何かしらのデータが取れるのではないかと目論んでいます。

これらに加えて、もともと持っていた Grove 対応の気温・湿度センサーも使うことにしました。

ホームセンターでハイドロカルチャー用の木炭(土の代わりになるもの)と入れ物を買ってきました。

Seeed Studio で購入したものは深センから航空便で 3 日程度で届きました。

なお、今回はもともと持っていた Wio3G (plan01s LDV) を使うことにしました。 データ通信量がそれほど多くないと見込んで、LDV が最もコスト効率が良さそうと感じたからです。

これで準備完了です。

実装 - センサー類の接続

この植物育成システムを作るのはゴールデンウイーク中の宿題と自分で自分に課して、一気に作り上げる予定でした。

Seeed の Grove システムは非常に簡単にセンサーと Wio3G 本体を接続できますので、ハードウェア的な面ではあっという間にセットアップが完了しました。

アナログセンサーはアナログ端子に接続する、I2C センサーは I2C 端子に接続する、というような点だけ気をつければ、あっという間にセンサー類の接続は完了です。 Wio3G は eSIM なので SIM を挿す必要すらありません。 電源の USB ケーブルで PC に接続し、アンテナをアンテナ端子に接続して、各センサーや LED などを仮の位置に固定したらハードウェア面では全て準備完了です。

なお、私は LED やセンサーを植物を植えている入れ物に仮止めするのに「クイックリリースホビークランプ」とか「ハンディークランプ」「スプリングクランプ」といったようなものを使いました。いずれも先端に樹脂製のカバーがついていて基板やセンサーを傷つけにくく、挟むだけで簡単に仮止めできて試行錯誤もしやすくて便利です。 冒頭の写真で使われている、オレンジ色と黒の洗濯ばさみのようなものです。

実装 - LED を光らせる

ハードウェアのセットアップが完了して、さっそくソフトを書いて LED を光らせてみようと思っていきなりつまづきました。

今回採用した LED を光らせたりするためのライブラリは Seeed から GitHub 上で提供されているのですが、どうもこのライブラリは ESP32 という CPU でしか使えないようでした。 Wio3G は STM32 という CPU を使っています。

そこで、LED のデータシート を解読して STM32 でもこの LED を使えるようにしました。(ソースコードは GitHub で公開しています ので、ぜひ参考になさってください)

これに少し時間を取られてしまい、ゴールデンウイーク中は家族や友人たちと過ごす時間も大事にしたかったため、あっという間にゴールデンウイークが終わってしまいました。

なお、「植物の育成には赤(660nm)と青(450nm) の2つの波長が鍵となる」という説を信じた私は、当初 RGB の三原色のうち赤 ® と青 (B) の LED のみ光らせていました。 するとピンク色っぽい光(マゼンタ)になるのですが、これは妻から「いかがわしい」と不評でした。 また植物の緑色も黒っぽく見えてしまうので、観葉植物としての用をなしていないということで RGB すべて点灯させて白い光としました。

実装 - SORACOM Funk による LED のコントロール

LED 照明を光らせることはできたのですが、適切なタイミングで On/Off にするには現在時刻を知る必要があります。 最初は現在時刻の取得がうまくいかなくて、朝になったら Wio3G を電源につないで稼働を開始し、夜になったら電源からケーブルを外すという方法で手動でコントロールしていましたが、これではせっかくの IoT が台無しです。私の帰宅が遅くなった日などは植物に延々と光が当たり続けてしまいます。

Wio3G には RTC (Real Time Clock) はあるにはあるのですが、電源 OFF されると時計がリセットされてしまうため、起動するごとに時刻をいったんどこかから取得して RTC に設定しなければなりません。 3G のネットワークから時刻を得る方法や NTP で時計合わせをする方法もあるにはあるので、それで時計合わせができたとしても実はまだ問題があります。

たとえば LED を照射する時間を最初は午前6時から午後6時の12時間に設定したがあとからその設定を変更したいといったような場合に、その On/Off の時刻設定をデバイス側に持ってしまうとしたら、変更する際の手間がかかります。

そこで、Wio3G 側には時刻設定は一切持たずに、サーバーにデータをアップロードした際にサーバー側で時刻などを元に LED On/Off の判断を行い、判断結果のみ Wio3G 側にレスポンスとして返却することにして、Wio3G はその結果に従って LED を On/Off するだけという方式にすることにしました。

そのために、AWS Lambda の Function を用意し、まずは単純に朝6時以降は点灯、夜8時以降は消灯とするような簡単なプログラムを書きました。 今後この制御部分は、たとえば実際の日の出・日の入りの時刻に点灯・消灯時刻を連動させるとか、LED の明るさも常に 100% で On にするのではなく徐々に明るくしていくといったような制御もできるようになるでしょう。

AWS Lambda 関数を呼び出すには、先日の Discovery 2019 で発表された新サービス、SORACOM Funk を使うことができます。 しかしながら、このプロトタイプを行ったときは Funk は絶賛開発中で、私はまだ使うことができなかったので、一旦 SORACOM Beam を使って AWS API Gateway 経由で Lambda を呼び出すようにしておき、展示直前に Funk 経由に変更しました。

その際に、デバイス側から直接 Beam や Funk を呼び出すのではなく、Unified Endpoint を経由させるようにしました。 そうしておくことで、デバイス側には変更が不要で呼び出し先を Beam から Funk に切り替えたりすることが簡単にできるようになります。 また、後述しますが Lagoon による可視化やアラート通知も行いたかったので、Unified Endpoint を用いて、当初は Beam + Harvest にデータを送信、Funk が使えるようになったら Beam + Funk + Harvest でテスト、最後に Funk + Harvest の構成に変更、といった作業が非常にスムーズに行えました。

こういった柔軟な変更が簡単にできてしまうのも Unified Endpoint の大きなメリットですね。

なお、Beam から AWS API Gateway を経由させて Lambda を呼ぶ方法と、Funk を使って直接 Lambda を呼ぶ方法とでは、後者の Funk のほうがもちろん断然簡単なのですが、呼び出される側の Lambda で受け取れるパラメータの形式や、Lambda から返却したレスポンスがデバイスに届く際の形式が少し異なっていたので、実はすんなりスイッチするというわけにはいかなかったというのが実情です。 それでもそれほど大きな変更は必要なくスイッチすることができましたので、その点は大きな問題にはならないのではないでしょうか。

実装 - CO2 センサーの読み取り

続いて、CO2 センサーからの値を読み出すことにしました。 こちらも GitHub にサンプルコードがあるのですが、少し制御が複雑です。 このセンサーはキャリブレーション作業が必要で、しかもその期間が1週間以上、と書いてあるように読めます。

センサーから Baseline という値が取得できるようになったら、その値を EEPROM かどこかに保持しておいて、デバイス起動時にはセンサーにセットしてあげる必要があるのですが、その部分の処理がだいぶ複雑でした。

EEPROM(もしくは Flash)に値を保存しておいてもいいのですが、今回は SIM のタグに値を保存してみることにしました。

そこで、Baseline の値が取得できた場合はその値も合わせて Funk 経由で Lambda に送信し、Lambda 側で SORACOM API を呼んでメタデータに保存することにしました。

そしてデバイスは起動時にメタデータ経由で Baseline を取得してその値をセンサーにセットします。

と、構想だけはできたのですが、実際にはデバイス起動直後に HTTP 通信でメタデータを取得する処理が高い確率で失敗してしまい、目論見が外れてしまっている状態です。 (現時点ではソースコードからも削除してあります)

失敗の理由は接続時にエラーが発生してしまうというものなので、タイミング的な問題などが考えられそうですが、やはり EEPROM などでローカルに持っておくべきなのかもしれません。

このあたりは今後の課題です。

実装 - バイナリパーサーの活用

CO2 以外のセンサー、すなわち明るさセンサー、土中水分量センサー、気温・湿度センサーに関しては、何の問題もなくサクッとデータを取得できました。

これらのデータをバイナリにシリアライズして、全部で 18 バイトのデータとして UDP で送信します。

それを受信する SORACOM 側では、バイナリパーサーの設定を行っておきます。 すると、デバイスからはバイナリ形式でデータを送信することができてデータ通信量を削減することができる一方、Funk の先の Lambda では JSON 形式でデータを受け取ることができ大変便利です。

一方で Lambda からのレスポンスは JSON 形式にしてしまったので、Wio3G 側で JSON をパースする必要がありました。 ArduinoJson という便利なライブラリがあったのでそれを使えば決して難しい処理ではありませんでしたが、このあたりはバイナリパーサーの逆をやってくれる(JSON → バイナリ形式に変換してデバイス側へ送信してくれる)機能が SORACOM プラットフォームに備わっていると便利かもしれないと思った点です。

実装 - SORACOM Harvest と SORACOM Lagoon で可視化

Harvest と Lagoon はとても簡単に使えて高機能なので、慣れてしまえばものの数分で設定などが完了して見栄えのする監視画面が得られます。 また、アラートの設定もできますので、今回は土中水分量センサーの値がある一定のしきい値を超えたら(土が乾燥してきたら)メールで通知を送るように設定しました。

Lagoonの画面 Lagoonの画面

展示当日

展示当日は朝からずっと IoT プロトタイピングコーナーで自分の作ったこのシステムの説明をしていましたが、思っていた以上にたくさんの方々にご覧いただき、そして大変さまざまなご意見やアドバイスをいただきました。

全ては書ききれないのですが、ここにその一部を書き記してみます。

  • 水やりの管理まで自動化したほうがよい。水やりの自動化の方法は、本格的なシステムなら水道のバルブの開閉を制御するが、このような小さなシステムであればポンプ式にしてポンプに電源を供給する/しないをコントロールすることで少ない量の水でも適切に制御できるようになるはずである。
  • 植物の育成には赤と青の光が必要だが、実は緑の光も葉を透過したり地面からの照り返しで葉の裏に当たることで意味がある。なので LED は RGB すべて点灯させたほうが良い(私が当初赤と青だけ照射していた話をうけて)
  • 土中の栄養素量を測定するためのセンサーが高いので、ソラコムさんがもっと安いものを開発して発売してもいいのではないか
  • 水分アラートをただのメールではなく Alexa に喋らせたら植物と意思疎通できたような気持ちになるのではないか
  • カメラで監視してタイムラプス映像を撮りつつ画像診断で病気の予兆を見つけたり栄養状態の判断をしてアドバイスをくれる AI をつけたらいいのではないか
  • 屋外でも使えるように防水すればベランダ菜園とかが自動化できて究極の地産地消になるからトレーサビリティを頑張るよりよほど安心だし老夫婦や子育て中などでなかなか外出できない人も毎日新鮮な野菜が手に入るようにできるのではないか
  • 土中水分量センサーを取り付ける位置はもっと植物の根の近くにしたほうがよいのではないか。また、気温よりも土中温度のほうが大事なので測定したほうがよい。お米の味は田植えをして最初の2週間の土の温度で決まるらしい。

などなど。他にも本当に様々なポジティブかつ具体的なフィードバックをいただきました。

総じてお客様のみなさんが「このシステムをもっと良くするにはどんなふうにしたらいいか」「自分ならこうする(したい)」という感じの未来を見た視点でいろんな想像力が掻き立てられて、ついつい何か言いたくなってしまったのかな、という感じがしました。

展示したのが小さな葉っぱだったのが良かったのかもしれません。赤ちゃんを見てるような気持ちになり、みなさんが未来を肯定的に考えられるようになったのかもしれません。

いずれにせよ、PoC という形で動くものをすばやく作ってとりあえず皆さんに見てもらったことによって、議論の土台というか出発点ができて、いろんな人の意見や考えを引き出せるんだなと感じました。

完璧ではなくてもまずはコンセプトを提示する、とりあえず動くモノがみんなの目の前にある状態を作るということの大事さを再認識しました。

まとめ

「仕事部屋の観葉植物を今度こそちゃんと育てたい」という思いから始まった今回のプロトタイプ。

最初は小指の爪よりも小さな葉っぱが2枚だけの状態から始めました。実際に2ヶ月以上運用している間にそれらの葉っぱが何倍もの大きさに成長し、さらに新しい葉も出てきて最初の2枚よりも大きくなりました。

ちゃんと植物が育ってくれたという嬉しさもさることながら、みなさんに見ていただいたことで想像を遥かに上回るフィードバックをいただくことができ、とても貴重な経験となりました。

というわけで、みなさんももし身近な課題があってそれが IoT で解決できそうなら、”Just do it” の精神で、まずはやってみるというのが良いのではないかと思います。

ogu


Posted by ogu at 2019/07/18