工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

水田の水位をリモートで監視するシステムを作る(1)

概要

水田の水位をリモートで監視するシステムの構想を練り、通信モジュールのセットアップを行った。


背景と目的

ある事情により、水田の水位をリモートで監視するシステムを作ることになった。そこで、まず構想を練るのと、通信モジュールのセットアップを行う。


詳細

0.参考

すでに、前例や市販品がないかを調べたところ、前例がいくつかあった。

前例はあるのだが、市販品はないみたい? というわけで、こういったものを参考にしながら、作成していく。


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リポジトリ

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にはちゃんとデータが届いているみたいだし、ひとまず動いているような気がする。 今回は、とりあえず、これでよしとする。


まとめ

構想を練り、通信モジュールを動作させることができた。次回は、回路の検討に入る。