More than 3 years have passed since last update.
ESP-NOWを使ってGateWay方式でSORACOMへ送信する~機械のIoT化を低コストで
動機
私は稲作農家でコンバインで収穫した籾を穀物乾燥機で水分を乾燥させる必要があります。
日中収穫し夕方までに乾燥機内に張り込んで、夜通し灯油を燃やした熱風を当てて乾かします。
ほとんどは設定すれば翌朝の乾燥終了まで自動で行われますが、なにかトラブルがあると米の品質にも影響がありますし翌日の作業にも支障があります。
そこで夜に確認しに機械を見て廻ることがあり、こういった作業や異常警報を素速くわかるようにIoT化しようと思いました。
構成
機械の稼働状況と警報をリモートで確認したい。
ただし複数あるので個々にSimを挿してではコストがかかる。
かといって有線を張り巡らすのは邪魔。
そこでESP32を一台を親機として複数の子機から送られてくるデータを無線で集めて、SORACOMに送信するゲートウェイ方式を考えました。
IoTデバイスはLTE-M Shield for ArduinoとESP32開発ボード、子機からの送信方式はEspressif独自の通信方式のESP-NOWが使いやすそうなので採用しました。仕様としては子機の数は20個以下payloadは250Byte以下の制約はありますが、使ってみた感じでは到達距離も問題なさそう。
👁 2.png
送信(子機 Sender)
温度センサーはOneWire DS18B20
モーターのオンオフは電磁開閉器の補助接点から、
警報はDC12Vブザーの配線を分岐してフォトカプラを介して取りました。
ESP-NOWのスケッチはこちらを参考にしました。
親機のMacアドレスを予め調べておきペアさせます
送信データは構造体にして複数の数値を送ります
typedef struct struct_message {
char name[4];//機体名
uint8_t id;//機体ID
uint8_t motorStatus;//モーター状態
float temp;//温度
} struct_message;
motorStatus は8bitのうち5bitで以下のON/OFFの状態を表しています
|bit5|bit4|bit3|bit2|bit1|bit0|||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|警報ブザー|スロワモーター|繰出モーター|送風モーター|搬送モーター|受信チェック||
|buzzer|thrower|kuridashi|soufu|hansou|receive|十進||
|0|0|0|0|0|0|0|受信異常|
|0|0|0|0|0|1|1|停止|
|0|0|0|0|1|1|3|運転中*|
|0|0|0|1|1|1|7|張込|
|0|0|1|1|1|1|15|通風/乾燥|
|0|1|1|x|1|1|27,31|排出|
|1|x|x|x|x|x|32~|警報|
*機械によってはモーターが1台のものもある
受信(親機 Receiver)
arduinoUNO型のESP32搭載ボードIotExpress とLTE-M Shield for Arduino を重ねてUART接続により子機から集めたデータをモデムを通してSORACOMへ送信します。
送信の際はこの記事を参考にバイナリーで送りバイナリーパーサーでJSON形式に戻すことで通信料を削減できます。
稼働時間、警告フラグと子機1台につきmotorStatus=1Byte + temp=2Byte をHEXにして送ります
バイナリーパーサー
数が増えて手入力だと面倒なのでpythonで作りました
text="uptime:0:uint:16 error:2:uint:8 "
names = ["A1","A2","A3","A4","B1","B2","B3","B4","C1","C2","C3","C4"]
for i ,name in enumerate(names):
text+=f"{name}:{i*3+3}:uint:8 t_{name}:{i*3+4}:uint:16:/100 "
print(text)
uptime:0:uint:16 error:2:uint:8 A1:3:uint:8 t_A1:4:uint:16:/100 A2:6:uint:8 t_A2:7:uint:16:/100 A3:9:uint:8 t_A3:10:uint:16:/100 A4:12:uint:8 t_A4:13:uint:16:/100 B1:15:uint:8 t_B1:16:uint:16:/100 B2:18:uint:8 t_B2:19:uint:16:/100 B3:21:uint:8 t_B3:22:uint:16:/100 B4:24:uint:8 t_B4:25:uint:16:/100 C1:27:uint:8 t_C1:28:uint:16:/100 C2:30:uint:8 t_C2:31:uint:16:/100 C3:33:uint:8 t_C3:34:uint:16:/100 C4:36:uint:8 t_C4:37:uint:16:/100
SORACOM Lagoon - ダッシュボード
新しくなったSORACOM Lagoonでこのようにひと目で機械の稼働状況を確認でき,警報時はLINEで通知もされるようになりました。
👁 スクリーンショット 2021-08-16 180544.png
便利と思った機能は
- Table 表示される文字列を変更する
int型のmortorStatusから日本語へ変換ができわかりやすく表示できました。
👁 スクリーンショット 2021-08-16 180631.png
- LINE通知
警報が鳴ったらLINEで通知するようにした
👁 Screenshot_20210816_200523_jp.naver.line.android_LI (2).jpg
苦労した点、課題
・SDカードスロットが付いていたのでcsvファイルで保存できるようにしたら、IotExpressのSDカードに使用してるピンとモデムのUARTに使うピンがかぶっていた。
・はじめ子機はM5-ATOMを使うつもりだったが電波の到達距離が短かかったので、ESP開発ボードを使い端子台用にPCBを作った。
・配線が大変だった
・電磁開閉器の接点から取れない機械もあるので他の方法でモーターのON/OFFを検知する方法が必要
・機械ごとの稼働時間もグラフ化したい
・Wi-Fiの届くところではLTE-Mセルラー回線を使わずにESP32からSORACOM Arcが使えるそうなので試してみたい
制作費用 (2021/10/1追記)
・親機
| 購入先 | 価格(税込み・送料別) | |
|---|---|---|
| IoT Express MkII | https://www.aitendo.com/product/16899 | 3058円 |
| ESPrOne 32 | https://www.switch-science.com/catalog/3555/ | 3575円(似たようなボード ピン配置等は未検証です) |
| LTE-M Shield for Arduino | https://soracom.jp/store/5303/ | 7180円(1500円クーポン付き) |
| 300MBパック (IoT SIM plan-D D-300MB) | https://soracom.jp/store/13380/ | 初期902円 月額330円 |
| SORACOM Harvest | https://soracom.jp/pricing/ | 日額5.5円~(無料枠あり) |
・子機
| 購入先 | 価格(税込み・送料別) | |
|---|---|---|
| ESP32-DevKitC ESP-WROOM-32開発ボード | https://akizukidenshi.com/catalog/g/gM-11819/ | ~1480円(aliexpressで探せば安いのも) |
| PCB | https://www.fusionpcb.jp/ | $4.9 50mmx100mm 20枚分 |
| DS18B20 防水型温度センサ | https://www.amazon.co.jp/gp/product/B083TTCB9Q/ | 5個988円 |
| フォトカプラTLP222GF | https://akizukidenshi.com/catalog/g/gI-07331/ | 60円 |
| ピンソケット、ターミナルブロック、抵抗、LED、配線、端子等 | 13台分で5000円ほど | |
| USB充電器、USBケーブル、ケース | 百均 | 400円 |
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
