LoRa で間欠的に送信する実験をしてみた。送信していないときは sleep することにした。
PmodRTCC で目覚めるのじゃ
Arduino(ATmega328P) の sleep/wakeup の実験。これはもう何度もやっているのでお手の物だ。今回は Watch Dog Timer は使わない。外部の RTC で起こすようにした。使用した RTC はなぜか手元にあった PmodRTCC。これは MCP79410 が載っている。データシートを見ると、ALARM を設定することが出来、時刻になると外部ピンに出力することが出来る。Arduino の DIO3 につなぐと番号 1 で割り込みをとることが出来る。回路的には DIO3 を抵抗でプルアップして RTC からは Active LOW で起こすことにした。最初 Active HIGH にしていたのだが、先人の知恵、やはり Active LOW の方が使いやすい。Active HIGH でも大丈夫だと思うけど、確認は Active LOW の方が楽。普段は HIGH というのが確認のしやすさの一つだ。CMOS だから消費電力増えないし。
つまずいたところは割り込み番号。割り込み時に detachInterrupt で解除するのだが番号を間違えていてハングしていた。どうやら Active LOW ということで何度も割り込みが発生する模様。FALLING で割り込みすれば解決したのかも。
RTC のコントロールは I2C。MCP79410 のデータシートを見ながら毎分あるいは30分毎に割り込みを掛けるようにした。
LoRa の送信は割り込みを使う
RadioHead というライブラリを使った。このライブラリは LoRa だけでなく様々パケット通信に対応している。そして包括的なラッパー API を用意しており、使いまわしが楽になるように設計されている。なんで名称が RadioHead なのか悩んだが、バンド名からとっただけで技術的な意味はなさそう。
手元のボードがRFM92_93というモジュールを使っていて、対応するライブラリが RH_RF95。通信には SPI を使う。
RadioHead では SPI/CS/割り込み 信号線を必要とする。Arduino 的にはそれらの信号線の標準仕様が決まっており、オブジェクト生成時に何も指定しないと、例えば割り込みは DIO2 で番号 0 番になる。ソースを読むと 3 つまで割り込みを扱えるようになっていた。つまり最大 3つまで LoRa モジュールを接続可能。
割り込みルーチンは完全に隠蔽されていて(protected や private で保護)外からいじれない。ということで、単純にサンプルをコピペして完成。
実機検証
割り込みが入ったら LED を光るようにするなどちょっとした工夫をして実験した。参考までに書くといきなり全部は作らず個々にテストをして最終的にそれをまとめ上げた。
- I2C のテスト + RTC のテスト
- RTC のポーリングテスト
- RTC の割り込みテスト
- sleep/wakeup テスト
- 割り込みによる wakeup テスト
- LoRa 送受信テスト
- LoRa 送受信テスト + RTC + wakeup
結果として、LoRa の送信しをした後 Arduino および RFM92_93 を sleep。RTC で 10 秒後に wakeup し、さらに LoRa で送信。そして sleep。その後、USB バッテリが省電力が少なくなったためでしょう電源 off!!
かしこい USB バッテリは消費電力が少なくなると自動的に off になるらしい。IoT 用にそれを抑制する USB バッテリもあります。今後は Ni-MH + ソーラパネルに移行することになるでしょう。