ESP-WROOM-02とBME280 電池駆動で温度/湿度/気圧測定 (その1)

概要

秋月電子の AE-BME280をI2C接続でESP-WROOM-02に接続し、温度/湿度/気圧を測定する。測定結果は室内のWiFiルーターに接続後、インターネット上のサーバーにhttpリクエストでもって投げて、同じサーバーで動いているMySQLに保存する。測定と送信は約5分間隔で行い、送信後は次の測定タイミングまでdeep-sleepモードに入る。

当初は、前に作った温度/湿度センサーのHDC1000を使ったボードに気圧センサーのみを追加しようと思っていたのだけど、いろいろなセンサーを物色しているうちに、つい、BME280を使ったモジュールをポチッとしてしまった。もったいないので、HDC1000も同じボードに載せてやって温度と湿度については2つのセンサーからの値を報告させることにする。同じボード上のI2Cバスに複数のデバイスを接続する、ということになる。

今回は回路側のお話。

ae-bme280とae-hdc1000

また、今回はニッケル水素充電池(エネループ)を電源として利用することにした。環境データと共に電源電圧(三端子レギュレータに入力する前の値)も計測し、同時にサーバーに送り込む。電圧が低下して測定データが届かなくなるまで動かしたとき、どういう経緯をたどるのかを知りたかったので。

回路

以下のような回路図となった。以前に作ったものとは、WROOM-02のブートモードを制御するIO0やIO2、IO15ピンの使い方を変更している。定期的な測定と測定間のスリープのために、WROOM-02がもつdeep-sleep モードを使うこととし、スリープからの復帰はIO16ピンからRSTピンに与えられるパルスによって行われる。

wroom02-bme280-hdc1000-1

電源としての電池について

電池の種類と構成についてちょっと考えてみた。

エネループかアルカリ乾電池か

これら2種類の放電特性を言葉にすると、以下のようにまとめられると思う(Panasonic社のFAQページを参考にした)。

アルカリ乾電池
1) 初期電圧が高い(手元の新品の実測で1.65V)。
2) 連続放電させると、終止電圧までリニアに降下する。
3) 終止電圧は約0.9V。

NiMH充電池
1) 初期電圧は実測で1.35V程度
2) しばらく使うと1.2Vで安定する。
3) ある時点で急に1.0V以下になり、機能しなくなる。

ESP-WROOM-02やセンサー類の電源には、3~3.3Vが必要になるから、いずれの電池を使うにしても何本か直列につなぐことになる。直列につないだときの初期電圧から終止電圧までを足し算で単純に求めると、以下のようになる。

  • 直列3本、アルカリ乾電池:4.95~2.7V
    直列3本、NiMH充電池:4.05~3.0V
  • 直列4本、アルカリ乾電池:6.6~3.6V
    直列4本、NiMH充電池:5.4~4.0V

けっこうな変動があるので、ボード上の電源として使うためには、安くて出力電圧が一定な3.3V出力の三端子レギュレータを使うことになるが、三端子レギュレータの仕組みとして、入出力電圧の差に相当する損失(ドロップアウト)が生じてしまう。例えば3.3Vの出力電圧を得るためには、少なくとも最小損失分(VDROP) を加えた入力電圧(3.3V + VDROP) を与える必要があり、電池の構成にはその点も考慮すべきだろう。

3.3V出力三端子レギュレータのVDROPが 0.5V だとすると、電池側の電圧として3.8V 以上は欲しい。直列3本構成でもその以上の電圧は得られるが、アルカリ乾電池ならば1本あたり1.25Vを切ったあとでも、電池としての寿命はまだまだ残っているし、NiMH電池は1.2Vが安定電圧なのですぐに足りなくなる。
また、三端子レギュレータの入出力間の電位差が大きくなると、熱として捨てられる損失も大きくなるから、あまり余裕があるのももったいない。結論として、NiMH充電池を直列4本で使うのがちょうどよさそう、と考えた。

wroom02-bme280-hdc1000-1

三端子レギュレータの選択

ESP-WROOM-02を駆動できる3.3V出力の三端子レギュレータのうち、秋月電子で売っているようなポピュラーな製品のスペックを見直してみると、以下のようになっていた。

  • TA48033S
    IOUT : 1A
    VDROP : 0.3~0.5V(@500mA)
    スタンバイ電流 : 0.8~1.8mA (@0mA)
  • TA48M033
    IOUT : 500mA
    VDROP : 0.17~0.35V (@250mA)
    スタンバイ電流 : 0.8~1.4mA (@0mA)
  • NJU7223F33
    IOUT : 500mA
    VDROP : 0.4~0.6V(@300mA)
    スタンバイ電流 : 30~60μA

TA48033SとNJU7223F33

いずれも低損失 (Low Drop Out) を謳うだけあって損失は小さい。損失を考えるとTA48M033がよさそうである。ただ、今回の仕組みでは、約5分間おきに測定と送信を行うが、ほとんどの時間はdeep-sleepに入って寝ている。スリープから復帰して測定~送信に3秒かかるとしても、1時間のうちの99%はスリープ中なのである。
そうなると、東芝のTA48シリーズのスタンバイ電流が気になる。他の部分で頑張っても常時1mA食われてしまうのはもったいない。そこで今回は、 新日本無線製のNJU7223F33を使うことにした。

NJU7223F33

今まで使っていた東芝のTA48シリーズと比べると、データシートに標準回路例が載っていない点に不安があった(測定用のテスト回路例は載っていたが)。しょうがないので、テスト回路にしたがって積層セラミックの0.1μFをレギュレータの近傍に配置した。また、電源変動に備えて、他に47μFの電解コンデンサも使った。今のところレギュレータに発熱もなく、安定して動作しているように見えるので、そのまま使うことにした。

ただ、パッケージを製品名側から見たとき、TA48033Sのピン配置は、左から入力、GND、出力となっている。それに対して、NJU7223は、出力、入力、GNDとなっている。つまり、差し替えて使うわけにはいかないことに注意が必要だろう。

wroom02-bme280-hdc1000-1

電池からの接続は、電源ケーブルとして先端にブレッドボード用のピンがついたバッテリスナップケーブルを使い、三端子の足の直近に接続した。

電池の電圧を測る(TOUT)

回路図から分かるように、電池の電圧を測るために44kΩと10kΩの抵抗で分圧し、TOUTに接続している。こういう分圧比にしたのは、直列4本のエネループの出力が無負荷時に5.4Vあったことと、WROOM-02のTOUTピンが0~1Vの電圧を10ビットの分解能でA/D変換する仕様であるため。

さいわいなことに、esp8266 core for Arduino (2.3) ではTOUTピンの役割が外部電圧のA/D変換用になっているが、別の実行環境ならば測定できないかもしれない。Espressif社のESP8266 SDK API Guide (version1.5.4)system_adc_read の項には、次のように書かれている。

・system_adc_read is only available when TOUT pin is wired to external circuitry. Input Voltage Range restricted to 0 ~ 1.0V.

・The 107th byte in esp_init_data_default.bin(0~127byte) is named as “vdd33_const”, and when TOUT pin is wired to external circuitry, the vdd33_const must be set as real power voltage of VDD3P3 pin 3 and 4, and has to be less than 0xFF.

そして、system_get_vdd33の項では以下のようになっている。

・system_get_vdd33 can only be called when TOUT pin is suspended.

・The 107th byte in esp_init_data_default.bin(0~127byte) is named as “vdd33_const”,  when TOUT pin is suspended vdd33_const must be set as 0xFF.

この中にでてくる、esp_init_data_default.bin の107バイト目にあたる vdd33_const には、どうやら 33 と書かれているようである (ライブラリの core_esp8266_phy.c を参照)。
逆に言えば、WROOM-02に与えられている電源電圧を測定するための system_get_vdd33() は、たとえTOUTをN.C. にしても機能しないだろう。

system_adc_read() を呼ぶことで電池の電圧を得ているが、データシートやガイドを漁ってみても変換速度に関する記述が見つからなかった。しょうがないので、テスト用にブレッドボードの+3.3Vを22kΩと10kΩで分圧してTOUTにつなぎ、

みたいなコードを走らせたところ、5000回の変換に約470msecかかっていた。つまり1サンプルあたり約94μ秒、大雑把には10ksps の性能ということなる。
逐次比較型なのでS/H回路なども内蔵しているのだろうとは思うのだけど詳細は不明。電池や電源の電圧を測る分には不足はなさそうである。

センサーモジュール

ブレッドボードに、温度湿度センサーのHDC1000とBME280の両方を載せてみた。いずれもI2CインタフェースでESP-WROOM-02と接続する。
データシートによれば、温度の計測精度はHDC1000が±0.2℃でBME280が±1℃となっており、湿度についてはいずれも ±3% となっている。ほぼ同時に計測させてみて、測定値の比較ができるようにした。
また、気になる消費電力だが、いずれも測定(変換)を行っていないスタンバイ時にはきわめて微小で、変換中についてもESP-WROOM-02が稼働していることを考えれば無視できる程度である。

HDC1000

秋月電子のAE-HDC1000を使用。AE-BME280に比べて安価なのだけど、気圧センサーが載っていない。I2Cの結線に必要なデータ線とクロック線のプルアップ抵抗は基板に載っている (10KΩ)。また、I2Cアドレスは0x40に固定されている。

BME280

湿度/温度/気圧センサーのBME280は、ドイツの有名な電装品メーカーのボッシュ社製で、I2CとSPIの2種類のインタフェースに対応している。基板に載せたマイコン接続用の製品は各社からいろいろ発売されているが、今回は秋月電子のBME280使用 温湿度・気圧センサモジュールキット を使うこととし、HDC1000と一緒に使うからI2CでESP-WROOM-02に接続した。
この製品も秋月のDIP化キットの一種で、BME280の周辺に必要な抵抗やコンデンサを載せた小さな基板になっており、6ピンのピンヘッダを自前でハンダ付けすることでブレッドボードや工作用の基板で使いやすくなる。BME280自体は2.5 mm x 2.5 mm x 0.93 mmしかないから、こういう具合に売ってくれないととても使えない。

基板上のジャンパエリアにハンダを流すことで、I2C用のプルアップ抵抗を有効にできるが、AE-HDC1000側でプルアップ済なのでジャンパ接続は無し。また、回路図のように#4ピンのSDIをVDDに接続してI2Cを選択し、#5ピンのSDOをGNDに接続することで、I2Cアドレスを0x76とした。

ae-bme-280

ピンヘッダをハンダ付けしたAE-BME280をほぼ等倍で撮影。ハンダ付け失敗してしまってみっともないですが。もっと細くていいコテを買わないといけない。

きょうのまとめ

スケッチの掲載は後回しにしたが、今回はセンサーモジュール用のライブラリを使わなかったので、BME280とのインタフェース部分が少々長くなっている。

三端子レギュレータの入力電圧が3.3V + VDROP を下回った際の挙動と、ESP-WROOM02の電源電圧範囲を考えると、NiMH 3本でもいけそうな気がしたのだけど、充電するときは2本か4本のセット単位で行うのがベターということなので、4本を選択することにした。カメラのフラッシュ用のエネループを流用したせいもあるが。

実のところ1週間ほど前から稼働しておりGoogle chartsを使った測定結果表示用のHTMLファイルも更新した。ただ、しょうしょう説明しづらい測定結果がでてきている。それについても次回に。