Bluehornet blog

RaspberryPi, Arduinoを日常生活に活用してみたいブログ

田んぼtoLINE

1. 課題

  • 実家が稲作の兼業農家で、家から田んぼは見えません。
  • 田んぼに水を張る際にはどのくらいの水位になっているかを1時間おきに確認に行く必要があります。なので田んぼを定期的に観察しに行くのがかなり面倒です。
  • 過去の気温などのデータ化されておらず、まずは簡単な成長記録を取れると後でデータ分析とかできるかな、と思っています。
1.1 希望する動作(農作業をしている弟からのヒアリング)
  • 田んぼに水を入れているときの水位を定期的に計測したい。
  • 水深だけでなく、温度も参考までに知りたい
  • 成長のデータが残ってほしい
  • 保存されたデータがいつでも見れるとうれしい

市販のシステムは比較的高額で、導入の閾値が高いかなと思います。また、専用の画面などを見に行くのはめんどくさいので、LINEやメールで情報がプッシュされてきた方が見る方も楽。Raspberry pi使えばどうにでもできるでしょ、という思いがありました。一方で、自宅や自宅の庭での運用ではないので以下の課題があります。

1.2 システムを作るときの課題
  • 田んぼ脇には電源がない
  • WIFIも届かない
  • 作った本人(私)が設置する田んぼから離れているため、サポートはめったにできない

2. 解決策

・期待する動作と課題を考慮し、Raspberry Piで定期的に田んぼの画像(水深や稲の高さがわかる定規も一緒に)を撮影してLINEに通知できるものを作ってみました。

2.1システムの構成
  • ソーラーパネル+バッテリーで電源供給
  • Soracomで3G対応通信
  • RPiで田んぼの写真をLINEに通知
  • RPiの状況もプログラム動作時にLINEに通知する
2.2 購入したもの
アイテム 価格
Raspberry pi 4 (8gb) 8,500
micro SD 64gb 1,200
ESP32 DevKitC 1,200
SORACOM IoT SIM(Plan-D) 900
AK-020 5,500
シンワ測定(Shinwa Sokutei) 標尺 アルミ製 巾60mm 100cm 76934 1,200
電源センサーモジュール (INA219) 800
USB電源コンバータ(12V to 5V) 550
12V 7Ahゲルバッテリー 5,000
ソーラーチャージャーコントローラ 2,000
ソーラーパネル(50W 12V) 7,000
オムロンマイクロリレーモジュール 300
その他の細かい部品(配線や架台用L字アングル) 3,000
合計 37,150

安く作れると思いましたが、結局いろいろ買いそろえたら高くなってしまいました。
バッテリーとソーラーパネルはもっと安くて出力の小さいものでいいし、ラズパイも入手できるようになれば安価なZeroで問題ないのでコピーするときはもっと安く作れると思います。

2.3 構成のイメージ

こんな感じで購入品を接続しています。

構成のイメージ
2.4 動作のイメージ

・動作としては以下のような感じ。

動作イメージ
  1. ESP32
    1. マイクロリレーON
    2. RPiに給電開始
  2. RPi
    1. 給電開始により、自動的に起動
    2. 撮像プロセス開始
    3. 撮像したらLINEに投稿
    4. プロセス完了の通知をESP32に送信
    5. RPi自身でシャットダウン
  3. ESP32
    1. プロセス終了の信号を受信
    2. カウントダウンを開始
    3. カウント完了でマイクロリレーOFF
    4. ESP32のDeep sleep機能に突入
    5. Deepsleepからの復帰で最初に戻る

といった手順です。
動作確認用にGPIOの短絡をチェックしてシャットダウンさせないというモードを設けました。
また、プログラムが途中で止まってしまい、RPi4がシャットダウンできなかった時に備えて、cronで毎時15, 30, 45に強制的に再起動させる設定追加しました。

それぞれESP32に書き込んだプログラムと、RPiに書き込んだプログラムは下記の通りになります。

3. 設置

ソーラーパネル以外は組み立ててこんな感じになりました。

装置

ソーラーパネルと組み立てて、こんな感じで畔のところに装置を設置しました。台風などを考慮して、コンクリートブロックに固定し、ブロックを畔に埋め込んでいます。

設置画像

最終的にはこのような形で写真が定期的にLINEに投稿されてきます。

投稿された画像

写真の投稿は6~18時限定です。ただDeep sleepが1時間おきというのが管理しやすかったので、気温だったり生存確認の意味で19~5時までも温度関連の情報だけはLINEに投稿させています。
また19時には気温の変化と、電圧の変化を記録したグラフも下記のような感じで投稿させます。30日分をcsvに記録しているので、その間の情報はこの時に確認できます。

投稿されるデータ

4. 運用した感想や補足

  • とりあえず写真は定期的に撮影してくれているのがわかりました。今のところ自宅の庭で約1か月間トラブルなく動作し、田んぼでもそろそろ1か月程度トラブルなく動いています。
  • 真夏など高温になるときにちゃんと動くかが心配の種です。あとSDカードがどのくらい耐久力があるのか…
  • LINEで通知した画像を1日1枚抜き取ってタイムラプス動画とか作りたいな、と思います。
  • 気温履歴と合わせて稲の生長を分析するなどデータ処理も考えます。

そのほか

  • 当初、水位は超音波の距離計などを使って数値化しようと思いました。ただ、一定条件で距離を計測するのはちょっと大変そうだな、と思いました。どっちにしても稲の育成ログとして画像を取得するため、画像を取得する際に、画像に工事現場などで使われている大きい定規を一緒に撮影してしまえばわかるだろう、と判断しました。
  • 画像データはgoogleドライブに保存するようなイメージをしていましたが、LINEに通知さえしておけば、必要に応じて自分で保存できるでしょ、ということでいかまとめてLINE通知としました。ということでRapberry piを使って定期的に画像を取得し、併せて温度をLINEに通知するシステムを構築することとしました。
  • 大した動作をさせるわけではないので、Rapberry Pi Zeroを使おうと思ったのですが、昨今の状況でZeroを入手できるめどが立たなかったため、とりあえず手持ちの4を使うこととしました。一方で、4は消費電力が大きく、外部から電力供給させるならともかく、バッテリー駆動ではちょっと厳しいかな、と考えました。
  • RPi4を使うにあたり、消費電力を削減するために、LEDをオフにする、HDMI機能はオフにするといったことだけでなく、ダウンクロックは行おうと思いました。しかし、それでも削減できる電力はたかが知れています。さらに夜は特に撮像の必要もないということだったため、できるだけ電源がOFFの状態であるようにしたいと考えました。しかし、ラズパイ単体ではスリープモードがないため、別の装置でスリープさせることにしました。

M5Stackを使ったIFTTT物理ボタン

1. 課題

・寝る前や、外出時にエアコン消して、サーキュレータ止めて、ライト消して、加湿器消して・・・がめんどくさい
・sRemo-R3のマクロ機能で”アプリ” or "Google home mini"から、まとめてオフは実現できた
・"OK google"って言いたくない気分のときもある
・手元にスイッチがあれば声を出すよりボタンプッシュの方が早い
・スイッチを押す、というアクションがあったほうが「やった」感があって良い
・いちいちスマホアプリを立ち上げるのがめんどくさい
・sRemo-R3のアプリを子供は使えない(スマホをもたせていないので)
・色々遊ぼうとIFTTTを有料登録したので、できるだけ使い込みたい

2. 解決策

・物理スイッチ→IFTTT→sRemo→各機器
WIFI、画面のあるM5stackを使って実現

f:id:bluehornet96:20201228100335p:plain
イメージ

3. 構成

■準備したもの
・M5stack Basic
・タクトスイッチ(スイッチ、スイッチキャップ、透明カバー)、後で透明カバーの中にわかりやすくイラストを印刷したものを差し込むため
・ユニバーサル基板(家に余っていたなにかのための基板)
・抵抗(余っていたもの)
・M5stackとスイッチを囲う箱(3DPで作成)

f:id:bluehornet96:20201215224533p:plain
M5stack
f:id:bluehornet96:20201215223102j:plain
スイッチキャップ、透明カバー


タクトスイッチはAmazonで購入。
Amazon | タクトスイッチキャップ透明カバー 12mm×12mm用スイッチ 10個入<1sw-080> | スイッチカバー・プレート | 産業・研究開発用品 通販
Amazon | タクトスイッチキャップ 12mm×12mm用 四角キャップ 白 10個入<1sw-072> | スイッチ | 産業・研究開発用品 通販
Amazon | 3a タクトスイッチ<スナップイン 12mm×12mmスイッチ 全高7mm>10個<1sw-057> | スイッチ | 産業・研究開発用品 通販

・赤外線リモコンに対応していない装置(加湿器とか)のためにリモコンスイッチでコンセントでオフ

f:id:bluehornet96:20201228064305j:plain
リモコンスイッチ

■ハードの準備
・M5stackの5VとGNDをユニバーサル基板に配線。
・タクトスイッチを適当な抵抗と合わせてプルアップでユニバーサル基板に9個を固定。
・スイッチからの配線をM5stackのGPIOに接続

f:id:bluehornet96:20201214213235j:plain
タクトスイッチの取り付け

f:id:bluehornet96:20201214213212j:plain
動作テスト

・組み上がったM5Stackとスイッチをくっつけた基板を入れるケースを3DPで作成
(Autodesk Fusion360でモデルを作成、QIDI X-Smartでプリント)

f:id:bluehornet96:20201228065814p:plain
ケース

・スイッチのカバーの内側に、それぞれのスイッチの役割がわかるように絵を印刷
(ほとんどいらすとや)

4. プログラム

・ボタンを押す
WIFIに接続
・Webhookで通知
・ボタンを押した時刻とか確認のため、LCDに表示
WIFIを接続解除
といった手順で動かす

5. 感想

・「ボタンを押す」という行為と「電源ON/OFF」の連動は感覚が合う
Google homeスマホアプリに次ぐ第3の家電制御として便利
・出かける前に子供が我先に、と外出ボタンを押してくれる
・どのスイッチをどのGPIOにつなげたかわかるように目印を付けていたつもりだったが、途中で間違っていたようで、プログラムで一個ずつずらしながら修正することになってしまった
・M5Stackのケース寸法が適当だったので、グルーガンで荒々しく固定してしまい、メンテナンス性がない。プリントし直す

f:id:bluehornet96:20201214213144j:plain
完成画像

■参考にしたページ
・M5StackのGPIOとスイッチのつなぎ方
意外と知られていない?INPUT_PULLUP – スイッチサイエンス マガジン

・M5StackをWifiにつなぐところ
ここWi-Fi飛んでる?目に見えるデバイスをつくってみた(前編) | Device Plus - デバプラ

・M5StackとIFTTTの連携
IFTTTで簡単IoT!M5StackとLINEを連携する方法 | マトリョーシカ的IoTブログ

Vornado 660-JPをGoogle homeから操作する

1. 課題

・自宅はオール電化なので、エアコンで各部屋を適切な温度に管理する必要がある(出し入れが面倒なので、冬場にファンヒータなど使いたくない)
・エアコンだけでは、リビングダイニングを均一な温度にできず、特にダイニングで調理する妻が夏は暑く、冬は寒い
・サーキュレータVornado 660-JPを使って空気を循環させることで部屋全体が温調できるようになった
・エアコンはGoogle home miniとIFTTTを使って音声でON、OFF、温度変化を調整できていた
・Vornado 660-JPは電源タイマーや赤外線リモコンで制御できない
Google homeからも操作できない
・Vornadoは電源ONでファンが「中」で動作を開始するがうるさい。「弱」で十分

2. 解決策

→エアコンと一緒にサーキュレータを弱で動作させる
Google homeに連携する赤外線リモコンを使う
・Vornado 660-JPのスイッチを押すところを自作
・IoTプッシュボタンも色々売り出されているが自分で作ってみる
・電源ONのあとにすぐに「弱」ボタンも押させる

3. 手順

・イメージは下記の通り。sRemo-R3を使ってエアコンとサーキュレータを制御する

f:id:bluehornet96:20200816142609p:plain
操作概要

・Vornadoの電源スイッチはトグル動作なので、ON/OFFの状態がわかっている必要がある
・そこで、電流センサでON/OFFを確認してからサーボモータを動作させる

持っている機材
Google home mini
・sRemo-R3
・Vornado 660-JP

購入した機材
Arduino micro
・赤外線受信モジュール
・マイクロサーボ SG-90
・クランプ式電流センサ CTL-10-CLS


サーボモータの先端にクッション材をはさみ、電源スイッチを押させる

f:id:bluehornet96:20200506222827p:plain
スイッチ部

4. プログラム

・赤外線受光部で参考にしたページ:
Arduinoで家にある赤外線リモコン全部解析 - Qiita

サーボモータ制御で参考にしたページ:
Arduinoを用いてサーボモータを制御する | 物を作る者

Arduinoのプログラム

5. 運用してみた感想

・朝起きたときにエアコンと一緒にサーキュレータがONになっているので、部屋の温度が一様になっていて良い。
・とりあえずこの方法なら赤外線リモコンに対応していない装置も制御できそうなので色々な機械にくっつけてみたい。
・流石に見た目があまりにもメカメカしいのでちょっと隠れるように工夫が必要。3Dプリンタでケースか何か作ろう。

玄関の鍵の状態をLineに通知する

1. 課題

・鍵をかけたかどうか心配になる
・鍵の開閉はオンラインでできないほうがまだ安心

2. 解決策

・鍵の開閉状態を検知し、鍵がかかっているかどうかをLINE notifyを使って通知

3. 手順

(a) 準備したもの
Raspberry Pi 4
・ホール素子 DN6851
ネオジム磁石

(b) ハードのセットアップ
・接続する図は省略、基本的には上のイメージ図の感じで結線
・磁石とホール素子の位置はこんな感じ
*仮固定ではあるのですが、見た目が悪いので奥さんには大変不評です。

f:id:bluehornet96:20200726170157j:plain
セットアップ

サムターン部にネオジム磁石を取り付け、ホール素子はサムターンに対向できそうな位置に固定。ホール素子からRPiまでは導線を3本無理やりひきまわしています。
・このときのために玄関先のシューズクローク内にコンセントをつけてもらい、ラズパイを稼働させていました(今までは温湿度を測っていただけ)。

4. プログラム

(a)準備
・とりあえずRaspberry piのGPIOをpythonから
使えるようにする

$ sudo apt-get install pigpio
  • 参考にしたページ

https://karaage.hatenadiary.jp/entry/2017/02/10/073000

・LINE Notifyを使えるようにする

  • 参考にしたページ:

https://nakomii.hatenablog.com/entry/python_line_notify

・ホール素子Raspberry piにつなぐ

  • 参考にしたページ:

https://brown.ap.teacup.com/nekosan0/253.html
https://uyamazak.hatenablog.com/entry/2019/08/06/095134

・ドアのサムターン部分にネオジム磁石と、ホール素子を固定する


(b)コード
・現在の鍵の状態はlock_state.csvというファイルに記録しておく
・現在のgpioの状態を確認
・lock_state.csvと同じであれば何もしない
・lock_state.csvと値が異なる場合、「鍵をかけた」OR「鍵を開けた」のどっちかを通知。その後lock_state.csvに状態を上書き(鍵があいていれば0、鍵が閉じていれば1)
・cronを使って5秒間隔でプログラムを実行させる

・cronで5秒おきにプログラムを実行

* * * * * for i in 'seq 0 5 59';do (sleep ${i}; python /home/pi/Documents/lock/lock_line.py) &done;

・これで5秒に1回サムターンの状態を確認して、状態が変化していればLINEグループに通知します。
・文字だけだとLINEでも解錠/施錠の状態を見間違えやすいので、LOCK、UNLOCKのアイコンなどを探して一緒に通知するとわかりやすいです。
・受信用LINEグループを奥さんと共有することで、お互いいつ自宅を離れていつ戻ってきたかなどが確認できます。

5. 運用してみた感想

・「鍵かけたっけ?」に対して、ちゃんと確認できるのでお出かけ直後に一旦鍵を見に戻る、という必要がなくなった
・子供が度のいつ帰ってきたかが把握できるのでちょっと安心

エアロバイクを使った在宅ツーリング

1. 課題

・自宅で楽しく運動したい
・エアロバイクを買ったものの、動画を見ながら漕ぐのも飽きてきた
・バイクに表示される距離の表示だけでは、どの辺りまで進んだかの実感がない

2. 解決策

・漕いだ分だけGoogle map上でピンを進める
Google spreadsheet上に進んだ座標を記録する
・イメージはこんな感じ

f:id:bluehornet96:20200506161223p:plain
全体イメージ

3. 手順

(a) 準備したもの
Raspberry Pi 4
・リードスイッチ
ネオジム磁石
・抵抗
・タクトスイッチ

(b) ハードのセットアップ
・接続する図は省略、基本的には上のイメージ図の感じで結線
・磁石とリードスイッチの位置はこんな感じ

f:id:bluehornet96:20200506161217p:plain
リードスイッチと磁石の位置

4. プログラム

(a)準備
・とりあえずお決まりのアップデート

sudo apt-get update
sudo apt-get upgrade

Google mapをchromiumで開き、操作する。そのためにSeleniumモジュールとchromiumのドライバをインストール

pip3 install selenium
sudo apt-get intsall chromium-chromedriver

Google spreadsheetにデータをアップロードするために必要なモジュールもインストール

(b)コード
・GPIO17で回転を検知して回転数をカウント
・10秒間で漕いだ分だけ緯度経度をすすめてGoogle mapの検索点を更新
・GPIOの20と21でボタンプッシュごとに進行方向を45度程度傾けて進むようにしてみた

5. 運用してみた感想

・かなり適当な進路ですが、観光地周りを起点にして進むとなんとなくイメージが湧いて楽しいです。次は道路上を進むようにさせ、本当にツーリング感を出したいです。
・仲間とスプレッドシート上で回転数とか到着位置を競いたいと思っていましたがまだ一人で遊んでいます。
・エアロバイクでHIIT (High Intensity Interval Training)をしていますが、その時も少しだけ進んでいる感じがあって楽しめています。

乱数の神にランチを決めてもらう

1. 課題
週末の昼食は外食にすることが多いのですが、毎週お店選びに時間がかかります。
かといって子供に聞くと「ハンバーガー!」「ピザ!」となってしまうのでそれもちょっと嫌。

2. 解決策
お店は乱数の神に決めてもらいます。

3. 手順
・週末になるとメニューをTwitterにつぶやくプログラムをRapberry Piで運用
・Twythonを使ってつぶやく
・お店のリストは子供と一緒に行っても大丈夫だったお店を手動でcsvファイルにまとめる
・第3候補まで提案してみる

4. プログラム
とりあえず動かすこと、ということでpythonで下のように書きました。
重複も許容(それくらい神がおすすめしている!と)

#レストラン候補のツイート
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import time
from twython import Twython

if __name__ == '__main__':
        menu = pd.read_csv('/home/pi/Documents/python/menu/restaurant.csv')

        weekly = np.zeros((7,2), dtype = int)
        menu_num = len(menu.index)

        for i in range(3):
                weekly[i,0] = np.random.randint(menu_num)
                weekly[i,1] = np.random.randint(menu_num)

        first = '\n 1⃣  ' + menu.iat[weekly[0,0],0]
        second = '\n 2⃣  ' + menu.iat[weekly[1,0],0] 
        third = '\n 3⃣  ' + menu.iat[weekly[2,0],0] 
        fourth = '\n 1⃣  ' + menu.iat[weekly[0,1],1]
        fifth = '\n 2⃣  ' + menu.iat[weekly[1,1],1]
        sixth = '\n 3⃣  ' + menu.iat[weekly[2,1],1]

        week = 'レストラン候補' + first + second + third +'\n'+'\n' + 'メニュー候補' + fourth + fifth + sixth
        APP_KEY = '****'
        APP_SECRET = '****'
        TOKEN_KEY = '****'
        TOKEN_SECRET = '****'

        twitter = Twython(APP_KEY, APP_SECRET, TOKEN_KEY, TOKEN_SECRET)
        twitter.update_status(status=str(week))

pythonが読みにいっているCSVファイルは下記のような感じにしてあります。
(ローカルのお店はモザイク入れてますが・・・)
選択肢のお店がそもそも少ないですが、新しくチャレンジしたりして、気に入った店が
できたときは適宜CSVファイルに追記します。

f:id:bluehornet96:20190222054329p:plain:w250
csv

これをcronで毎週土曜日と日曜日の午前10時ころにつぶやく設定にします。
すると下のような感じ投稿されますので、候補のうちのどこかに食べに出かけます。

f:id:bluehornet96:20190208052723p:plain:w250
投稿画面

5. 運用してみた感想、今後の展開
「あーでもない」「こーでもない」と不毛な議論をする時間が減りました(少し)。
もちろん食べたいものがあるときはツイートを気にせずそっちに行きます。
「新しいお店の開拓」も大きな課題なので、ぐるなびあたりからたまに
新しいお店の情報を引っ張ってきたりしてみたいです。
車輪の再発明」も恐れることなくトライしていきたいと思います。

Raspberry piPythonも使い始めてみたばかりですので
いろいろ指摘していただけると嬉しいです。
そもそも自分でもちゃんとした書き方や効率的な方法を学んでいきたいと思いますが…

Raspberry Piを使って室内環境をつぶやきづづける

1. 課題

  • sRemo-R3で帰宅前にエアコンをONにしたつもりがついていないことがあった
  • sRemoの温度センサがうまく温度を示してくれないことが多い
  • 気圧の変化とかも見たい
  • Twitterを県や市からのお知らせチェックくらいにしか使えていないので、なんか活用してみたかった

2. 解決策

  • リビングの室温、湿度、気圧を測定する
  • Raspberry Piに室温を定期的にTwitterでつぶやいてもらう

3. 手順

  • Raspberry Piに温度センサを接続
  • 変化をわかりやすくするためグラフを作成(温度、湿度、気圧の24時間分の変化と1週間分の変化をグラフ化して示す)
  • Twythonで定期的につぶやく
  • 準備したもの

4. プログラム

  • BME280のデータを取得
  • RPiに保存してあるcsvファイルに行をずらして取得データを上書き
  • グラフを描画して上書き保存
  • プログラムをcronで15分おきに実行
  • ①まずはBME280を使ってデータを取得するプログラム

  • ②上記を呼び出してデータを取得しつつ、csv更新、グラフ作成、Twitter投稿をするプログラム



f:id:bluehornet96:20200509172229p:plain
投稿される画像

5. 運用した感想

  • 室温がわかるのでエアコンがちゃんと付いたかどうか分かる
  • 温度、湿度、気圧をグラフ化したので暖かくなってきたのか、寒くなってきたのかがわかってよい
  • 古いデータも過去のツイートで辿れる(どこかでまとめておいたほうがそのうち分析とかで遊べそうですが・・・)

■参考にしたページ

  • BME280について

ラズベリーパイで温度・湿度・気圧をまとめて取得!AE-BME280でIC2通信 | Device Plus - デバプラ

  • Twythonについて

Twythonを使ってみた - Qiita