最近、ラズパイを使って屋外環境のセンシング(気温とか)をやってみようと考えていたのですが、屋外で運用しようとすると「電源どうするの?」問題が付きまとうわけです。
はじめは自動車などに使う12Vバッテリーなどを考えていたのですが、もっと気軽に使えるようなものにしたいなと。そこで、モバイルバッテリーを考えたのですが、普通に使ってはすぐにバッテリーが切れてしまいます。
5000mAhの容量で4〜6時間ぐらいでしょうか。(正確に測ったことはないですが体感で)
気温などのデータを取得するのは数分間隔でも問題ないので、センサを動かしていない時は電源を落とすという装置があれば良さそうだと思って作ってみました。
<開発環境>
・Raspberry Pi 3
・Arduino UNO
・Arduino IDE 1.8.2
やりたいこと
まずはざっくり要求仕様の定義です。
・ラズパイの電源を定期的にON/OFFしたい
(3〜30分周期ぐらいで、使用時にカスタマイズできるようにしたい)
・ユーザが近くにいる時は、データをテザリング経由でサーバへ送りたい(これ)
・電源OFFはラズパイのシャットダウン後にしたい(精神衛生上)
と、このぐらいです。
仕組み
・電源装置
まずは電源ON/OFF装置から。
*ハードはあまり詳しくないため、あまりいい回路ではない気がします…あと書き方もよくわからないです。すいません。
マイコンは50円で買えるATtiny13Aを使うことにしました。
このマイコンを使って時間を図り、定期的にMOSFETで電源ON/OFFを行います。
リセット時にDIPスイッチを読み、電源ONの間隔を3,6,15,30分の4パターンで切り替えができるようにします。
また、スイッチをONにするとMOSFETで電源ONして、スイッチでONしたことをラズパイに知らせるためにPB4のSW_ON出力をHIGHにします。
ATtiny開発環境の構築
開発環境の構築方法は、http://workpiles.com/2017/05/arudino-isp-attiny/です。
ソースコード
ソースコード一式はgithubにあげてあります。
https://github.com/workpiles/DozePi
・ラズパイ側
ラズパイ側では、電源がONになったら自動的にセンサ値を読み、シャットダウンを行うようにします。
リセット後の自動実行にはSystemdを使って行いました。(やり方は検索するとたくさん出てきます)
[Unit] Description=Soil_monitor Wants=dhcpcd.service After=dhcpcd.service [Service] Type=simple ExecStart=/**スクリプトへのパス**/boot_script.sh [Install] WantedBy=multi-user.target
これをリセット復帰後に実行されるようにSystemdに登録します。(やり方は割愛)
dhcpcd.serviceのあとに呼び出されるようにしているのは、データをサーバへ上げる時のためです。
boot_script.shはこんな感じです。
#!/bin/bash cd `dirname $0` if [ `gpio -g read 13` -eq 1 ]; then #GPIO13がHIGHの場合はキャンセル echo "Cancel" exit 0 fi if [ `gpio -g read 19` -eq 1 ]; then #Update Task sleep 10 ip_addr=`ifconfig wlan0 | grep "inet addr" | awk {'print $2'} | cut -d':' -f2` if [ -n "$ip_addr" ] ; then echo "Connected:" $ip_addr gpio -g mode 26 out gpio -g write 26 1 sleep 1 gpio -g write 26 0 python updater.py fi else #Monitoring Task python monitoring.py fi sleep 20 shutdown -h now
GPIO19には電源ON/OFF装置のSW_ON出力がつながっていて、ONの場合はサーバへのデータアップロード、OFFの場合はセンサからのデータ取得を切り替えています。
実際使ってみてわかったこと
ラズパイの時間が狂う
ラズパイはRTCモジュールを積んでないので、電源を落としてしまうと時間が狂います。
ネットワークが使える環境であれば、NTPサーバから正確な時間が取得できるため問題ないのですが…。
今回も、センサからのデータ取得時間を記録していたのですが、壮大にずれて使い物になりませんでした。
対策としては、RTCモジュールを外付けしてやればいいだけです。
連続動作時間は約40時間ぐらい
モバイルバッテリー(5000mAh)で15分間隔の間欠作動(OFF14分、ON1分周期)させた場合の持ちは、約40時間でした。
もうちょっとでかいバッテリー(10000mAh)なら80時間まで行けそうですが…最近のモバイルバッテリーはオートカット機能がついているので、ATtinyの消費電力では容赦なく電源カットされてしまいます…使えない(これにより新調したバッテリーが約立たずになってしまいましたorz)
最近では、「IoT専用」と銘打ってオートカットされないバッテリーも売っているようですが、若干お値段高め…オートカットついてないのになんでや。
あとがき
取り敢えず第1弾ということで、こんな感じなものを作ってみました。
いろいろ問題もあるので、そのうち改良版を作ろうと思います。
というかESP-WROOM-02で作りなおそうかなと…