概要
水田の水位をリモートで監視するシステムの構想を練り、通信モジュールのセットアップを行った。
背景と目的
ある事情により、水田の水位をリモートで監視するシステムを作ることになった。そこで、まず構想を練るのと、通信モジュールのセットアップを行う。
詳細
0.参考
すでに、前例や市販品がないかを調べたところ、前例がいくつかあった。
- 【水位センサー】Amazonで約400円!自動水位計を組み立てる方法[配線図/自作/回路図/原理の解説] | ミニマムライフ研究室
- 農家の悩みもコレで解決? 次世代型「スマート水田」がスゴい【IoTのチカラ】 |TIME&SPACE by KDDI
前例はあるのだが、市販品はないみたい? というわけで、こういったものを参考にしながら、作成していく。
1.構想
構想としては、
- 水田の水位をセンサで検出する
- 結果を無線通信でクラウド等に飛ばす
- 電池で動く
というものにしたい。いろいろ検討した結果、以下のような感じになった。
1.1 水位センサ
水位センサは、もともと私は全然詳しくないのだが、どうやら水槽用のものが比較的安価に売られているので、以下のものなどを使っていこうと思う。
1.2 無線通信
水田は、自宅から離れているので、自宅のWi-Fiなどは届かない。そこで、最近利用しやすくなってきたLPWAの一つであるSigFoxを使う。SigFoxは、SORACOMからArduinoシールドタイプのモジュールが売られているのでそれを使おうと思う。
1.3 電池で動く
水田の近くに、電源がなさそうなので、電池駆動とするが、一般的な充電池、できれば手持ちのエネループを使いたい。
2.通信モジュールのセットアップ
早速、SigFox通信モジュールであるUnaShield V2Sを購入した。使い始めるには、セットアップが必要とのことなので、セットアップを行う。手順は、
Sigfox Shield for Arduino をセットアップする | Getting Started | SORACOM Developers
に書かれた手順にしたがう。
2.1 受け取り確認
SORACOMのコンソールから、受け取り確認を行おうと思ったが、3日以内の期限を過ぎていて自動で受け取り済みになっていた。まあ問題なし。
2.2 グループを作成してHarvestの設定
SigFoxグループ>作成で、PaddyField(つまり水田)という名前のグループを作成した。 Harvestの設定もする。
2.3 デバイスをグループに所属させる
SigFoxデバイス管理>デバイス操作>グループ変更から、PaddyFieldに所属させた。
2.4 Arduino IDEのセットアップ
GitHub - UnaBiz/unabiz-arduino: Arduino library for connecting UnaShield to SIGFOX network
から、UnaSheildライブラリをzip形式でダウンロードして、Arduino IDEで、スケッチ>ライブラリをインクルード>zip形式...で、ダウンロードしたzipファイルを選択。
2.5 ESP-WROOM-32と接続してSigFoxで送信してみる
UnaSheildライブラリのサンプルDemoTestUnaShieldV2SRCZ3を試しにESP-WROOM-32で実行してみたが、少し難航した。 このサンプルは、Arduino Unoを使う前提となっていて、ESP-WROOM-32用にビルドしようとすると、いくつかエラーが出る。
- SoftwareSerial.hがない
ESP-WROOM-32用のSoftwareSerial.hをGitHubのリポジトリからダウンロードする必要がある。
GitHub - jdollar/espsoftwareserial: Implementation of the Arduino software serial for ESP32
- ESP-WROOM-32用のSoftwareSerial.hをインクルード
unabiz-arduino-masterフォルダ内に、ダウンロードしたESP-WROOM-32用SoftwareSerialをフォルダごとコピーする。そして、unabiz-arduino-master内のソースコードを修正。
SIGFOX.hの25行目の#ifdef...の節をコメントアウトし、代わりにESP-WROOM-32用のSoftwareSerial.hをインクルードするように変更する
// #ifdef BEAN_BEAN_BEAN_H // // Bean+ firmware 0.6.1 can't receive serial data properly. We provide // // an alternative class BeanSoftwareSerial to work around this. // #define SoftwareSerial BeanSoftwareSerial // #include "BeanSoftwareSerial.h" // #endif // BEAN_BEAN_BEAN_H #include <EspSoftwareSerial/src/SoftwareSerial.h>
また、Wisol.hの12行目 #ifdef CLIONの節を変更
#ifdef CLION //#include <src/SoftwareSerial.h> #include <EspSoftwareSerial/src/SoftwareSerial.h> #else // CLION #ifndef BEAN_BEAN_BEAN_H // Bean+ firmware 0.6.1 can't receive serial data properly. We provide // an alternative class BeanSoftwareSerial to work around this. // See SIGFOX.h. //#include <SoftwareSerial.h> #endif // BEAN_BEAN_BEAN_H #endif // CLION
3.動作確認
3.0 接続
ESP-WROOM-32は、手持ちのESP-WROOM-32 DevKit Cを使用。 注意が必要なのは、IO5。Sigfox Module側は5V系のインターフェースなので、そのままつなぐと、動かなくはないのだが、ESP32のIOに3.3V以上の電圧がかかる。一応、定格越えの気がするので、約3.3VくらいになるようにD5出力を39kΩと10kΩで分圧した。
Sigfox Module | ESP32 | 備考 |
---|---|---|
5V | 5V | |
3V3 | 3V3 | |
GND | GND | |
D4 | IO4 | |
D5 | IO5 | 抵抗分圧してIO5に入る電圧を下げる |
3.1 setup関数
以下は、setup関数内でのシリアルへのログ出力。
Running setup... - Disabling SNEK emulation mode... - Wisol.sendBuffer: ATS410=0 >> ATS410=0 << OK0x0d - Wisol.sendBuffer: response: OK - Getting SIGFOX ID... - Wisol.sendBuffer: AT$I=10 >> AT$I=10 << 0074512C0x0d - Wisol.sendBuffer: response: ******** - Wisol.sendBuffer: AT$I=11 >> AT$I=11 << 4E992F0DCDE8434E0x0d - Wisol.sendBuffer: response: 4E992F0DCDE8434E - Wisol.getID: returned id=********, pac=**************** - SIGFOX ID = ******** - PAC = **************** - Wisol.setFrequencyJP - Set frequency result = OK - Getting frequency (expecting 3)... - Frequency (expecting 3) = 51 - Wisol.sendMessage: ********,0102030405060708090a0b0c - Wisol.sendBuffer: ATS302=15 >> ATS302=15 << OK0x0d - Wisol.sendBuffer: response: OK - Wisol.sendBuffer: AT$SF=0102030405060708090a0b0c >> AT$SF=0102030405060708090a0b0c << - Wisol.sendBuffer: Error: No response Waiting 10 seconds...
- sendMessage関数のresponseがない
うまく動いているように見えるが、最後にNo responseと表示される。 本当にちゃんと動いているのか?とても不安な感じ。
3.2 loop関数
次に、loop関数1回分のログが以下。 こちらもうまく動いているように見えるが、最後にNo responseと表示される。 しかし、SORACOM harvestの画面を見ると、ちゃんとデータが届いており、問題がないらしい。納得いかないが。。。
Running loop #8 - Wisol.sendBuffer: AT$T? >> AT$T? << 242 - Wisol.sendBuffer: response: 242 - Wisol.getTemperature: returned 24.20 - Wisol.sendBuffer: AT$V? >> AT$V? << 33200x0d - Wisol.sendBuffer: response: 3320 - Wisol.getVoltage: returned 3.32 - Message.addField: ctr=8 - Message.addField: tmp=24.2 - Message.addField: vlt=3.3 - Wisol.sendMessage: ********,920e5000b051f20094592100 - Wisol.sendBuffer: ATS302=15 >> ATS302=15 << OK0x0d - Wisol.sendBuffer: response: OK - Wisol.sendBuffer: AT$SF=920e5000b051f20094592100 >> AT$SF=920e5000b051f20094592100 << - Wisol.sendBuffer: Error: No response Waiting 10 seconds...
- 実は、温度センサ値が正しくとれていない
温度センサの値を必要としないのであればどうでもいいのだが、実ははじめ温度が0.7という数値になっていた。 一応気になるので調べたら、どうも、ESPとUnaShield間の通信の間隔に問題があるようだ。なので、サンプルスケッチのloop関数内を以下のように変更。 delay関数を入れたところ、ちゃんと動くようになった。謎。
// Get temperature and voltage of the SIGFOX module. float temperature; float voltage; delay(2000); transceiver.getTemperature(temperature); delay(2000); transceiver.getVoltage(voltage); delay(2000);
3.3 まとめ
納得がいかないが、SORACOMにはちゃんとデータが届いているみたいだし、ひとまず動いているような気がする。 今回は、とりあえず、これでよしとする。
まとめ
構想を練り、通信モジュールを動作させることができた。次回は、回路の検討に入る。