見出し画像

ESP32+BLEで郵便受け投函通知機を作成

実は、数年前に投函通知機の計画をしたのですが、その時は断念しました。その理由は…

  • 集合住宅の郵便受けなので、内部が狭くて設置(工事)が難しい

  • ステンレス製の郵便受けなので、電波の通りが不安

  • バッテリー駆動(というより充電機能付き)するボードを作るのが面倒

月日は流れ、バッテリー駆動用ESP32ボードも自作し、3Dプリンターも導入しました。新しい試みとしてBLEを用いた機器の特性を知りたいという欲求もあり、再度、挑戦することにしました。

Arduino IDE ESP32 BLE Libraryを知った

実はBLE機器も以前断念しています。ESP32はBLEに対応していますが、当時は参考事例がほとんどなく、さっぱりわからない状況でした。そんな中、今回、Arduino IDE ESP32 BLE Libraryというライブラリの存在を知り、これならできそうだと感じました。

今回、参考にしたのは「ESP32による近距離無線通信の実験② BLE通信」の記事です。以前、BLE規格を調べたときには、仕様がまったく頭に入っていきませんでしたが、この記事のおかげで、ずいぶん理解が進みました。ま~ちゃん様には、この場を借りして感謝の意を表したいと思います。

BLEをIoTとして使う場合の勘所

BLEは、Bluetoothの規格の一種ですので、基本的には、1対1(PCと周辺機器)の接続が基本になります。これを知らないで、Ethernetのように多対多の接続をイメージしてシステム構成を考えていると途中でわけがわからなくなります。

したがって、結論から言うとIoTに向いている仕様ではないと感じています。今回はBLEの特徴を理解するのも目的の一つですので、あえてBLEありきでシステム構成を行いました。最終的には、Mqtt Broker(mosquitto)まで通知をしないといけませんので、BLEゲートウェイ機も作成します。

投函センサー

  • 最初、振動センサーでやってみたのですが、敏感すぎて、隣の郵便受けに投函されても反応してしまい断念。結局、投函扉と取り出し扉の両方にリードセンサーを付ける仕様に落ち着きました。

  • 取り出し扉にもセンサーを付けると、取り出したかの判別ができるので便利です。必要なければ投函扉の1つでもよいです。

  • リードセンサーは、3Dプリンターでベースをつくり、何とか郵便受け内部に取り付けました。郵便受けを外して卓上で作業ができれば簡単なのですが、集合住宅の郵便受けだとそういうわけにもいきません。

BLE通知プログラミング

内容的には、起動したら、BLEでブロードバンド通知して、すぐにスリープするだけです。しかし最終的に下記のような仕様にする必要があることがわかり、意外と手間取りました。

  1. 投函口と取出口の扉のいずれかが開いたら起動

  2. ただし、一旦は両方の両扉が閉じてから
    大きい郵便物だと扉が開きっぱなしになることがあるため

これをバッテリー駆動で実現しようとすると、ちょっと工夫が必要になります。なぜなら1だけの場合、スリープしても扉が閉じていないので、すぐに再起動してしまい、それを延々と繰り返すので、あっという間にバッテリーが無くなってしまうからです。

これも結論から言えば、スリープする直前に扉が開いているか判断して、起動条件を変えてスリープさせます。具体的には…

  • いずれかの扉が開いていたら、両方閉まった時に起動する条件
    ESP_EXT1_WAKEUP_ALL_LOW

  • すべての扉が閉まっていたら、いずれか開いたら起動する条件ESP_EXT1_WAKEUP_ANY_HIGH

起動時に、esp_sleep_get_ext1_wakeup_status()で、起動pin状態を判別し、いずれかの扉がHighの場合のみBLE通知するようにします(この起動pinは、ESP_EXT1_WAKEUP_ALL_LOWで起動した場合だと、なんか思った値と違うので注意してください)。両扉がLowの場合は閉じたときの起動なので何もせずにスリープします。

こうすることで、とにかく起動している時間を短くし、バッテリー消費をおさえます。

今回、2つのPinを使うので、マスク値の作成が必要になります。この関数を示します。ULLを付けないと32bit整数になってしまうので、ご注意ください。

// GPIO番号からマスクを作成して返す
uint64_t getPinMask(gpio_num_t gpio_num)
{
	return 1ULL << (int)gpio_num;
}

使用ボード

今回は私のオリジナルESP32ボードを使いました。(きちんと検証していないのですが)M5Stackは避けた方が良いかもしれません。M5Stackライブラリを使うと、どういうわけかBLEがうまく動きませんでした。

ネット記事では、M5StackでBLEを使っている事例もあったので、ライブラリのバージョンとかも影響しているかもしれません。

ハードウェア回路のヒント

  • リードセンサーに繋ぐPinは外部プルアップにします。
    内蔵プルアップは起動後に有効にするものなので、起動Pinでは機能しません。

  • リードセンサーは扉が閉まった状態だと、センサー回路はCloseなのでLowになります。扉が開くと回路はOpenになり、プルアップさせているのでHighになります。

  • 今回センサーが2つありますが、先のESP_EXT1_WAKEUP_ALL_LOWと、ESP_EXT1_WAKEUP_ANY_HIGHで、うまく機能します。

BLEゲートウエイ

BLE端末からの通知は、Mqtt Brokerにデータ変換して送信する必要があります。このBLEゲートウエイ機は、AC電源に繋いで使います。
問題は、ESP32はWi-FiとBLEを同時に使うことができないらしいのです。これは、BLEゲートウエイ機を作るうえでは致命的な仕様です。

これも結論から言えば、同時に使うことができないだけで、切り替えて使うことは可能でした。

ざっくりいうと…

  1. Wi-fiのAPに接続する

  2. WiFi.setSleep(true)でWi-Fiスリープする

  3. BLEを開始して、パッシブスキャンする
    BLEDevice::init()、BLEDevice::getScan();

  4. デバイスが見つかり、該当データだったらBLEを切る
    BLEDevice::deinit()

  5. WiFi.setSleep(false)でWi-Fiスリープ解除

  6. Mqtt Brokerに通知をする

  7. 2に戻る

このようにBLEとWi-Fiを切り替えて使えば、1台でまかなえます。BLE端末が少なく、通知頻度もすくない場合は、この仕様でも実用になります。

運用報告

  • 私の部屋は1Fで、郵便受けにも近いのですが、ゲートウェイの設置位置によってはうまく機能しませんでした。現在は、郵便受けから壁(鉄筋コンクリート)を隔てて、3mくらいの位置に設置しています。

  • 1か月程度の運用ですが、思った以上にきちんと動作しています。もっと通知の取りこぼしとか、バッテリー消費とか問題が起きると思っていたのですが意外でした。

  • 利便性は期待した以上です。いままで確認のためだけに、郵便受けの開け閉めしていましたが、そういう無駄がなくなりました。

  • 私は、(モニターで見て)あやしい訪問者の場合は応答しないのですが、宅配とか国勢調査とかだと何かしら投函していきます。なにも投函していかなかった場合は、たいてい勧誘か営業なので、すぐに判別ができるようになりました。

この記事が気に入ったらサポートをしてみませんか?