Cactify ~ 植物と話して笑顔になろう~

Owner & Collaborators
License
Summary
植物としゃべってみたい... 植物が元気か知りたい... そんなことを思ったことはありませんか?
"Cactify"はこれをIoTで実現!

LINEのボットと話しかけることで、植物とおしゃべりを楽しんだり、植物が元気かどうかを確認することができます。

Materials

    Tools

      Blueprints

        Making

        • このカテゴリのポイントは、
          身近でIoTとファブを絡めながら、利用者の笑顔を誘うというものである。
          • IoTの使い方
            • デバイスやセンサーの情報をインターネット経由で活用
            • インターフェースからインターネット経由でデバイスを操作

            ファブ(Fabrication: 製造、組み立てという意味)の使い方
            • センサーや操作できるインターフェースを搭載し、その情報を送る
            • デバイス自体に稼働部などを搭載し、それをIoTで動かす

            センサー ➡︎ 温度センサー、人感センサーなど
          • このカテゴリーのテーマは「笑顔を誘う
            笑顔にはどういうものがあるのか?
            • 滑稽で笑う。ウケる。
            • かわいらしい様子でほっこりする。癒される。

            FABで笑顔を誘うとなると高度なモデリングや笑いのセンスがないといけない...
            →IoTで笑顔を誘う!!

            例えばユーザにメッセージを送って喜ばせる的な...
          • そこで私が目をつけたのが観葉植物だ。

            • 普段は話しかけてきたりしない観葉植物が話しかけてきたら面白い!
            →観葉植物に直で話しかける人がいると聞いたこともある...
               その夢を叶えたい!

            • 利便性も重視
            →空気の温度や土壌の湿り気がわかると便利


            結論として、利便性と面白さを兼ね備えた観葉植物のLINE BOTを作ることに決めた。



          • 今回のプロジェクトで使うセンサーは、空気中の温湿度を測るセンサーと、土壌中の水分を測るセンサーだ。

            今回私が選定したセンサーは


            DHT11は空気中の温度と湿度を同時に計測できるセンサーモジュールであり、専用のドライバーをインストールすることでA/Dコンバータや校正が不要であるため、採用した。

            また、SKU:SEN0193は土壌湿度センサーであり、静電容量方式を採用しているために長時間稼働していてもセンサーが劣化しにくいため、採用した。

          • センサーと接続するデバイスは

            Raspberry Pi 3 Model B であれば容易にWi-Fiからインターネットに繋げられるほか、
            Node-RED というフローエディタがデフォルトで使えるためだ。

          • 前の項にあるように、開発プラットフォームは、
            デバイス側とクラウド側の両方でNode-REDを使用する。
            Node-RED とは、フローベースの開発ツールだ。2014年にIBMがクラウドの「Bluemix(現IBM Cloud)」をリリースする際に、標準搭載のOSS(オープンソースソフトウェア)として提供されるようになった。

            Node-REDではノードと呼ばれるプログラムモジュールのようなものを線でつなぎ、msgオブジェクトというノードからノードへと伝わる変数でプログラムを組む。
            また、ノードに直接JavaScriptでプログラムを書くこともできるので、汎用性に優れる
          • LINEで送られてきた内容の意味を判別するためには高度な言語処理が必要だ。
            そのため、言語処理APIとしてDialogflow を使用する。
            Dialogflow は自然言語対話プラットフォームであり、比較的容易にチャットボットを作成できる。
          • 利用者にLINEを送るために、必ず必要になるのがAPIであるLine Developers
            LINEのボットチャンネルの作成や、APIに対してPOSTすることで指定のユーザーにメッセージを送るのに使う。
          • 今回、3Dモデル作成のための3D CADソフトとして、Blenderを使用した。
            Blenderとはとはオープンソースの3D CGソフトウェアの一つで3Dモデルの作成からリグアニメーションまで汎用的にできるものだ。
            元々3Dプリント出力に特化しているわけではないため、STLオブジェクトの3Dプリントのための最適化はアドオンの3D Print Toolboxを使った。
          • 今回初めて3Dプリンターを購入することになったため、Wi-Fi使用可能で、インターフェースがわかりやすく、組み立てもいらないXYZプリンティングのダヴィンチ mini w+を使った。
            XZ方向の精度とY軸ピッチの解像度共に十分だと考えた。
        • まず、Raspberry Pi にセンサーをつなぎ、センサーから値をとれるかを検証した。検証には各センサーとA/Dコンバータのmcp3002をブレッドボード上において行った。
          また、DHT11から値を取得するために、Raspberry Pi にbcm2835 ライブラリNode-RED node-red-contrib-dht-sensorノードをインストールし、mcp3002 から値を取得するためにNode-RED node-red-node-pi-mcp3008ノード(mcp3002使用可能)をインストールした。




          • さて、センサーから値を取得したはいいものの、それをクラウドに上げなければ意味がない。そもそも、なぜクラウドにあげる必要があるかというと、各種APIに接続するときにWebhookやHTTPリクエスト(POST)を使える環境が必要なためだ。
            • IBM CloudでもNode-REDを使うため、IBM CloudでスターターキットのNode-RED Starterのアプリを作成した。アプリ起動後、https://[設定したアプリ名].mybluemix.net/red/で初期設定を済ませたのち自分のフローにアクセスできるようになる。
            • デバイス側とクラウド側のNode-REDが互いに送受信可能にする最後のステップだ。
              Node-RED Starter をダッシュボードから開き、「接続を作成」とかかれたボタンから前の項で作成したInternet of Things Starter を選択した。
              選択をすると、「接続」の欄に追加したアプリが表示される。

            • Node-RED間でのデータの送受信はNode-REDにデフォルトであるnode-red-contrib-scx-ibmiotappノードで行える。
              送信はInternet of Things Starterで設定したクレデンシャルをノードに設定し、ノード内に設定したデータを何かのmsgオブジェクトをトリガーとして送信するか、データを内蔵したmsgオブジェクトをノードに送ることで送信できる。
              また、受信はInternet of Things Starterのクレデンシャルを設定しておくだけで自動的に行われる。
            • Functionノードに、トピックが"test"で内容が"event"のmsgオブジェクトを作り、IBM Outノードに送信、その内容がRaspberry Pi側に送ることに成功した。
          • LINEを送るにはもちろんそれを送るチャンネル(アカウント)がなければいけない。このStateでは、行った設定などを中心に説明する。
            • 今回はLINE DevelopersのMessaging APIのチャンネルを作成した。
              この時に重要なのが、LINEをユーザーに送信する PUSH_MESSAGE の機能が使えるプランを選択すること。送られてきたメッセージに返信をするだけじゃあ意味がない。
            • API利用に必要なアクセストークンLINEからのリクエスト(ユーザーが送ったメッセージ)を取得するためのWebhookの設定をした。

              Webhook URLは https://[アプリ名].mybluemix.net/webhook で設定できる。
          • 実際にプログラムを組み、Cactify のシステムを作る。
              1.  "all commands"とあるIBM IoTノードでクラウドからリクエストを受け取る。
              2. Javaなどのif文にあたる機能をもつswitchノードでリクエストを種類分けする。
              3. 種類に応じて、センサーから値を取得する。
              4. 取得した値をfunctionノードでJSONに成形し、"ibmout"とあるIBM IoTノードでクラウドに送信する。

            • フローはここから閲覧→IBM Cloud Node-RED フロー
              量が多いので、フロー内のコメントノード内で細かく説明します

              とりあえず大まかに説明。
              • 送られて来るwebhookには種類があり、友達登録の場合とメッセージの場合がある。それが友達登録の場合初期設定のメッセージをLINEにPOSTし、ユーザーの返信内容に基づいて初期設定を行う。これをIBMCloudantというデータベースに保存する。
              • webhookがメッセージによるものの場合、そのメッセージの原文をそのままIntent(パターン)作成済みのDialogflowにPOSTする。原文から読み取った文章の意味をクラウドのNode-REDに返し、ユーザーへの返信やデバイスへのリクエストなどを行う。

              • injectノードで、3時、12時、9時になったときにデバイスにコマンドを送り、その結果をもとにメッセージをLINEにPOSTする。

              ちなみに、セリフを打つのが一番しんどかったです...

            • DialogflowではIntentとよばれるメッセージのパターンを追加していくことで、いろいろなメッセージに対応させる。普段Google AssistantなどでDialogflowを使うとき、このIntentResponses(返答)を入れるのだが、センサーの値やボットの性格など、返答を変動させる要素がこのプロジェクトではいくつかあるため、Responsesの代わりにActions and parameteresDialogflowに送られたメッセージの意味のパラメータのみをNode-REDに返し、そのパラメータに基づいてユーザーにメッセージを送る流れにした。
            • ユーザーが送るLINEのパターンは単語の組み合わせで無限になり、これを一つずつIntent発動のトリガーとして設定するのは非常に効率が悪い。トリガーの設定の手間を最小限にするために、Dialogflowの機能の一つであるEntitiesを使った。Entitiesとはいわば単語辞書のようなもので、いくつかの単語を一つにまとめることができる。上にある画像のように、Intentのトリガーとなるパターンを入力すると自動的にEntitiesに登録されている単語をタグ付けし、Entitiesで同じ登録されている単語の数だけIntentの発動条件を増やせる。ハイライトされている単語がタグ付け済みの単語。
              • 毎日 6,12,9時にセンサーの状態をユーザに通知。挨拶もしてくれる。
              • ユーザが「土はどう」などと話しかけると該当するセンサーから値を取得、ユーザに通知。
              • 水をやると感謝メッセージを送る。
              • 名前を呼ぶと返事をする。
              • BOTは性格を変えられる(普通、真面目、ツンデレ)。
          • システムは完成した。
            一応はこのままでも使えなくはないが、センサーのモジュールや配線がブレッドボード上でむき出しになっているのはさすがに見るに堪えないし、植木に設置する都合上、水がかかってショートする恐れがあり、実用性にも問題がある
            そのため、これらをショートなどの危険から守り、かつセンサーのモジュールや配線が極力みえない入れ物を作ることにした。
            • DHT11SKU:SEN0193はそれぞれ植木鉢上になければならないので、センサーを格納するものは植木鉢上にあっても違和感のないものを考えた。
              →形と色が植物であれば違和感がないはず!

              形の案として、双葉とサボテンを考えた。
              どちらの案をとるかを決めるため、2つともとりあえず3Dデータを作ることにした。

            • まずは、3Dプリントすることを考慮せずに簡単に作ってみた。

              一応センサーをはめることは考慮して、SKU:SEN0193の直径、2.35cm以上の直径を持つように設計した。

              作ってみてわかったのが、双葉は構造的に難しい点があるということだ。
              センサーを格納する都合上、物はある程度太さが必要なのだが、双葉の場合はデザイン的に茎を細くしたかったため、デザイン的にも構造的にも中途半端な出来になってしまった。
              その点、サボテンの場合はデザイン的に太さを確保しやすく、センサーを格納するのに十分な空間を内部に取れそうだった。

              この結果より、実際にプリントするものはサボテンにする方針に決めた。


            • 構造を説明する。
              まず、センサーとモジュールは、それらを固定できる最小限の大きさの筒(土台)に入れる。
              その筒からは、vcc、gnd、dht11のアウトプット、SKU:SEN0193のアウトプットの配線4本が出ており、Raspberry Piと接続してある(SKU:SEN0193のみRaspberryPiのカバーに固定したmcp3002につなげる)。
              最終的にこの土台に、サボテンのカバーをかぶせる。

              この構造になった理由として、
              • センサーを固定する作業が簡単になる。
              • サボテンの種類を複数作りたかったため、カバーを変えられるようにしたかった。

            • まず、どうやって土台にセンサーを固定するかだが(特に、地面に刺すタイプのSKU:SEN0193)、SKU:SEN0193をよく見てみると、ここで固定してくださいと言わんばかりの凹みがあることに気が付いた。これに着目した私は、土台にツメを設けてここに引っ掛けるようにして縦方向に固定することに決めた。
              また、センサーが土台内で回転して取れることがないよう、横方向の回転は土台の底で固定する。





            • 実際にプリントしてみたところ、採寸ミスや3Dデータのミスで、何回も印刷しなおす羽目になってしまった。
              特に、前述のツメの作成では、採寸を定規一つでやっていたため、採寸ミスが頻発し、そのパーツを4回も再設計して印刷することとなった。
              印刷しなおすのは非常に時間がかかるため、正しい採寸の大切さを身に染みて感じた。

              なお、部品の組み立てはこの順で
              1. SKU:SEN0193に底を白い線まで取り付ける。
              2. 土台下部をSKU:SEN0193の上から差し込む。
              3. 土台下部を90°回す。そうするとSKU:SEN0193が土台内で固定される。
              4. 底と土台下部を接着剤で固定。
              1. SKU:SEN0193に底を白い線まで取り付ける。
              2. 土台下部をSKU:SEN0193の上から差し込む。
              3. 土台下部を90°回す。そうするとSKU:SEN0193が土台内で固定される。
              4. 底と土台下部を接着剤で固定。
              5. センサーが完全に固定される。
            • 土台の下部と上部を取り付けた。
              あとはここにカバーを取り付けるだけだ。

            • まずは、最初に作ったサボテンをカバーにするために改造していく。
              試作時からの変更点として、
              • 土台のスペース確保のために中央を土台の直径より1mm太くくりぬいた
              • 配線を通すための隙間を設けた
              • 三角面を全部ふさいでやった
              がある。

              Blenderのアドオンの3D Print  Toolboxで出た、手作業で修正しきれなかったエラーは
              Autodesk Netfabb PremiumAuto Repair機能で修復した。

            • よりサボテン感を出すため、ネオングリーンカラーのフィラメントでプリントした。

              印刷してみた感想として、出来栄えには非常に満足している。
              デフォルメして作ったサボテンとネオングリーンの色が合わさって、カートゥーン感を醸し出しており、非常にかわいらしくなった。

              土台の装着も一発でできた。
            • せっかく土台のカバーを付け替えられる方式にしたので、サボテンのカバーをもう一つ作る。
              先のサボテンを印刷してみて、ある程度ローポリでも問題がないことがわかったので、作業短縮のために思い切ってかなりローポリで仕上げた(モデルが曲線で構成されている都合上、一つずつしか面張りできないため)。もう少しスマートに3Dモデルを作れるようになりたい...

              「サボテン 丸」で画像検索して、それをもとにして作ったつもり。
              もちろん、前回同様土台と配線のスペースは確保した。



            • プリントする際、先のサボテンカバーと変わり、今度はリアルなサボテンに近づけるため、より深い色のクリアグリーンでプリントした。クリアというだけあり、若干光沢と透明感があるが、Davinci Mini用のフィラメントの色の種類がそもそも少ないので仕方ない(XYZさん...色のバリエーションを増やしてくれ...)。
              それでも、期待した通りのリアル感は感じたので満足だ(実際に植木に置いてみるとすごく馴染む)。

              前回同様、土台はピッタリハマった。
            • プリントしているところを早送りで見れたら面白いと思って、タイムラプス動画(印刷時間は4時間弱)をとってみた。
              改めて、3Dプリンターのすごさを感じました。
          • システム、土台、カバーのそれぞれが完成した。
            これらをすべてつなぐ。
            • 今回、テスターとして、一人暮らしをしている
              僕のおじいちゃんが試してくれることに。

              おじいちゃんが植物を「みどりちゃん」と命名
              (ちょっと昭和っぽいのにウケた)。

              おじいちゃんに文字をタイプしてもらうのは難しそうだったので、音声入力で文字を入力してもらったのだが、
              まるで本当に植物に話しかけているようだった

              おじいちゃんが笑ってくれました( ´∀` )
            • 動画でLINEのメッセージが見れなかった方のために貼っておきます。


            • 今回、IoTでいろいろするにあたって、Node-REDに物凄く頼っている気がした。
              Node-REDはNode-RED同士の交信が非常に得意だ。
              事実、Node-REDを活用することで、プログラム作成(特に外部機器、サービスとの接続)の時間を多くカットできた。
              Node-REDがIBM Cloudの標準OSSであり、Raspberry Piでもつかえることから、
              Raspberry PiでIoT化をしていくならIBM Cloudで初めるのが最も易しいだろう(決して回し者ではない)。

            • Blenderはすごい。
              何がすごいかっていうと、その汎用性だ。
              普段はゲーム用の3Dモデル作成などにつかっていたBlenderが3D CADソフトに様変わりしたのだ。
              それに加えてなんと無料(回し者ではない。大事なことなのd)。

              このBlenderの素晴らしさのおかげでSteamでのBlenderプレイ時間が最近ぐんぐんのぼっていたことに、友達にヒカれた。
            • まだLINE BOTが対応している会話のパターンが少なく、ユーザーがBOTと遊べるほど賢くはないので、どんどん会話パターンを作り、本当に植物と話せるようになりたい。
              AI技術をDialogflowにとどまらず、いろいろなサービスを他にも活用していけばもっと発展できるのではないかと考えている。
          Add Card Order

          References

            Usages

              Project comments