植物発電の供給で BLE を試せるか
jun-fu@bitengineers です。
前回の投稿でも書いた植物発電(以下 N-Energy) ですが、何気なくベランダを見ていたら、なんと N-Energy の LED が光ってました!!
前回はこちら
LED が光らない原因として埋め方が悪かったのかと思ってましたが、2週間近く放置していたら光だしてました。2~3週間経て徐々に光が増した気がします。
今度こそ希望の光となるのか?!
電圧、電流計測
電圧は変わらず 1.5V で、電流は 4mA ほどでした。 やはり、というか弱々しいです。
計測時に水やりすると数値は多少上下するので状態・条件によってはもう少し電力が取れるかもしれないです。
オフィシャルのスペックではもう少し電流引っ張れそうなので
期待を込めてもうしばらく様子を見る方向で、再度放置します。
低消費化の策はあるのか?!
さて、分かっていたことですが、この発電量の数字を見ると ESP32 を採用するのは間違っている気がしますよね。直接電源としては使えないです。
M5StickC+ だと Deep Sleep していても消費電流は 30~40mA です。ディスプレイ搭載であることや、消費電流には内部バッテリへの充電も含んでいるのでしょうがない気もします。
以下のサイトを参考にすると ESP32開発ボードの中でも Deep Sleep 時に低消費に抑えられているものは多くないよう。
M5StickC+ をやめて、Deep Sleep 時の消費が抑えられているESP32 ボードにハードウェアを交換するという策は、今後検討しても良さそうです。
Sleep 以外でも消費を抑える対応はないかと調査してみると
データシートより、
受信時の消費は同程度、送信時の消費はWiFi より BT/BLE 時は 50mA ~ 110mA 消費が小さい。
せめて WiFi を BLE へ変更すると多少は消費が抑えられる、のかな?と。
ここではソフトウェア面での改善を図ります。
BLE に触れてみる
今までは WiFi でクラウドへデータを送信するのに使用していたので、無線機能を BLE へ変更するとなると、クラウドへの到達できなくなります。WiFi と BLE を中継する機能などを考えないとならなくなり、変更インパクトは小さくないです。なので今回はサンプルを試すところから始めてます。
Bluetooth Host 実装
ESP IDF SDK では Bluetooth 実装は bluedroid と NimBLE の二つから選択できます。bluedroid は一時期 Android で使用されたいた実装で、NimBLE は apache project の mynewt という組み込み用途の OS で使用されている 実装のようです。
Bluetooth Classic は BR/EDR と言われ、bluedroid は BR/BLEとBLE 両対応です。片や NimBLE は BLE のみ対応です。
mynewt も NimBLE も知らなかったですね。。。BLE に全振りで良いので、NimBLE を触ってみることに。
Apache NimBLE
を参照するとapp_main 内で
esp_nimble_hci_and_controller_init()
nimble_port_init()
gat_svr_init() // GAP, GATT 初期化、独自 GATT Service を追加等
nimble_port_freertos_init() に nimble_port_run()を実行する関数を渡す
と呼び出す流れのようです。
サンプルでは nimble_port_init() 後に ble_hs_cfg 構造体の各フィールドにコールバックや security_manager 関連のパラメータを設定しています。
ここでのコールバック が4つあり
ble_hs_cfg.reset_cb = bleprph_on_reset;
ble_hs_cfg.sync_cb = bleprph_on_sync;
ble_hs_cfg.gatts_register_cb = gatt_svr_register_cb;
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
ble host が reset されたときの callback
ble host が sync (初期化後に呼ばれる?)時の callback
GATT Server の Event callback
不揮発性の情報を保存する際の callback
この時 .sync_cb が起動後に実行され、ble_advertise() が呼ばれ BLE device として検索が可能に。
このサンプルではペアリング時に面白いギミックがあり
idf.py menuconfig
で "Example Configuration" -> "I/O Capability" を
KEYBOARD ONLY
Both KEYBOARD & DISPLAY
にすると idf.py monitor 上で keyboard 入力を読み取って pairing 時の key 入力ができます。これは面白いですね。
I (9899) NimBLE_BLE_PRPH: PASSKEY_ACTION_EVENT started
I (9899) NimBLE_BLE_PRPH: Enter the passkey through console in this format-> key 123456
I (17739) You entered: key 573142
I (17739) NimBLE_BLE_PRPH: ble_sm_inject_io result: 0
key <入力したい値>
デバッグにも使えそうでいいですね。
GATTの Service, Characteristic, Descriptor 定義とアクセス実装もシンプルなので NimBLE 悪くないですね。
ただ、BLE ペリフェラルのサンプルですが、消費電力は低くなってないですね。むしろ接続待機するので Sleep するタイミングがなく、同程度(40mAほど) 消費しています。
BLE を実装すれば解決という話ではないようですね。この辺も再度検討事項です。
おわりに
盆栽 + IoT の開発を始めてからずっと電力まわりは課題が残ってます。N-Energy をどう使うかはまだ答えが出てないですが、電力まわりの解決に繋げたいです。
今回は盆栽要素がないですが、以上です。