多くのESP8266搭載ボードに用意されている内蔵 ADC を使った 電圧測定 を、 WeMos D1 mini (互換品)に ESP Easy を焼いて試してみました。
WeMos D1 mini (の互換品)
以前、非接触温度計の製作した時、簡単なプログラムを書いて使って以来のWeMos D1 miniです。
当時何個か買った残りを開けてみると、本体と様々なピンヘッダがセットになっていました。
連結可能な2.54mmピンソケットは、D1 mini向けに展開されている各種シールドを繋ぐためのもの。
あらためて基板本体を確認してみると、メタルケースに収まったESP8266MODを搭載していることから、比較的古いV2モデルの相当品ということが分かります。
現行モデルはブランド名すら変わりLOLIN D1 mini V4と呼ばれ、ESP8266がむき出しになるなど実装レイアウトもだいぶ変わりはしましたが、ピンアウトの互換性は維持されています。
内蔵ADCとその分圧
ESP8266にはADC端子が1つあるものの、ここへ入れて良いのは最大1Vまで。WeMos D1 miniは回路図によると下図のように、220kΩと100kΩに分圧することで、 A0 端子で3.3Vまで計測することができます。この仕様はESP-12E(関連記事はこちら)も全く同じなものの、ESP-01S(関連記事はこちら)にはこの A0 端子はオミットされています。
実際には、A0端子付近に分圧抵抗R1、R2が載っていました。
もう少し高い電圧まで計測可能したい場合、分圧抵抗をどのように設計すればよいか、さらにはESP Easyでの応用例まで、こちらの記事が大変参考になりました(Great Works!!)。
記事中のFormula for calculationより、例えばUSBの電圧(少しマージンを取って最大5.2V)を測定したいような場合、分圧抵抗R1は次のように算出されます。
1 |
R1 = (5.2-1) x 100k = 420k |
WeMos D1 miniの基板上には既に220kΩのR1が実装済みなので、A0端子の先に残る200kΩ分の抵抗を直列に追加すれば良いことが分かりました(下図例では 3V3 端子を計測)。
ESP Easyの導入
WeMos D1 miniも、これまで何度か使ったことのあるESP-12E(関連記事はこちら)と、同じ仕様のESP Easyファームウェアが使えます。
1 2 3 |
$ ls -l 1,023,520 byte ESP_Easy_mega_20230306_normal_ESP8266_4M1M.bin 1,023,920 byte ESP_Easy_mega_20230306_normal_ESP8266_4M1M_VCC.bin |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo ./esptool.py --port /dev/ttyUSB0 --baud 115200 flash_id esptool.py v3.3-dev Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... Unsupported detection protocol, switching and trying again... Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 5c:cf:7f:##:##:## Uploading stub... Running stub... Stub running... Manufacturer: ef Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ sudo ./esptool.py --port /dev/ttyUSB0 --baud 115200 erase_flash esptool.py v3.3-dev Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... Unsupported detection protocol, switching and trying again... Connecting.... Detecting chip type... ESP8266Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 5c:cf:7f:##:##:## Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 8.9s Hard resetting via RTS pin... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ sudo ./esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size 4MB --flash_mode dio 0x00000 ./ESP_Easy_mega_20230306_normal_ESP8266_4M1M_VCC.bin esptool.py v3.3-dev Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... Unsupported detection protocol, switching and trying again... Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 5c:cf:7f:##:##:## Uploading stub... Running stub... Stub running... Configuring flash size... Flash will be erased from 0x00000000 to 0x000f9fff... Flash params set to 0x0240 Compressed 1023920 bytes to 676652... Wrote 1023920 bytes (676652 compressed) at 0x00000000 in 59.7 seconds (effective 137.2 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin... |
ところが、普段よく使う ...4M1MVCC.bin と言うVccが計測可能なファームウェアでは、その計測に唯一の内蔵ADCが使われている為、A0端子を用いた計測を利用しようとすると注意書きを受けてしまうほか、その現在値もVccのものしか表示されません。
あらためてVcc計測を含まない通常の ...4M1M.bin ファームウェアファイルを焼き直すと、先ほどの警告文言は無くなりました。
内蔵ADCの設定
分圧抵抗を算出する際に参考にした記事に記載されている、ESP Easyでの設定方法を元に、まずはキャリブレーションなどを以下のように設定します。
ThingSpeakへデータを送信する場合は、 Send to Controller へチェックを入れると共に、インデックス値IDXをデフォルトの から 1 などへ変更します。
ThingSpeakへデータを送るチャンネルの設定は、このように設定してあります。
内蔵ADCの校正
内蔵ADCデバイス設定を確定させると、二点校正がグラフ化され、実際に計測も始まります。下図では、 A0 端子に 3V3 端子の3.3Vを当てているにもかかわらず、換算値は遥かに低い状態。
そこで、比較的容易に得られる2つの電圧、USB 5VとVcc 3.3Vを A0 端子に当て、デジタルマルチメータで測った電圧値と、ADCのRaw値のペアを2つ得て、この二点で再校正しました。
簡易的ですが今回の校正はここまで。いずれ、基準電圧電源を作って精度を上げたいと思います。
モバイルバッテリのUSB 5Vを継続的に測ってみましたが、ブレッドボードに配線しているせいか、バラツキが大きく出てしまいました。
次回は、I2C接続のADコンバータを使った複数チャンネルの電圧計測を試してみたいと思います。