見出し画像

Wio BG770Aの研究9〜自分自身の電源電圧を計測する〜

Wio BG770Aの研究シリーズでは、Seeed社のLTE-M対応IoT開発ボードWio BG770Aについて、調査・検証した内容を共有しています。前回の記事ではアナログ入力を取り上げました。今回は、アナログ入力の機能を用い、自分自身の電源電圧を計測することを目指します。

なお、本記事は、SORACOM Advent Calendar 2024シーズン2にエントリーしています。


■ なぜ電源電圧を計測するのか?

自作IoTデバイスにおいて、IoTデバイスへの給電方法が商用電源であれば、電源電圧の計測は不要かもしれませんが、電池やバッテリー等であれば、電源電圧を把握は重要です。IoTデバイスに接続された各種センサーで取得したデータと同時に、自分自身の電源電圧をクラウドに送ることで電源電圧の把握が可能となり、死活監視や適切な電池交換時期の把握等が可能となります。

■ まずは基準電圧を理解する

電圧計測するためにはAD変換を用いますが、自分自身の電源電圧を計測するためには、AD変換に用いられる基準電圧を正しく理解する必要があります。以前、Arduinoで電源電圧を測った際、この基準電圧を正しく理解できていなかったため、失敗したことがありました。

◎ Arduino Unoの場合

基準電圧の重要性を説明するため、まずはArduino Uno(Arduino AVR Boards)の例に出します。Arduino Unoにおいて、基準電圧の決め方には3つの選択肢があります。

  1. DEFAULT: 電源電圧が基準電圧となる(デフォルト)

  2. INTERNAL: 内蔵基準電圧を用いる。ATmega328Pでは1.1V

  3. EXTERNAL: AREFピンに供給される電圧(0-5V)を基準電圧とする

ArduinoUnoのデフォルトは1.なのですが、これは電源電圧をフルスケールとして相対的な値を出力するので、基準となる電源電圧そのものを測ることができません。ここで失敗した経験があります。

Arduino Unoで電源電圧を測る場合は、2.か3.を選ぶ必要があります。詳細は、下記記事をご覧ください。

◎ Wio BG770Aの場合

Wio BG770Aの基準電圧を調べると、ボートの初期設定時にインストールされたコードの中に、基準電圧の記述を見つけました。

Internal Reference is +/-0.6V, with an adjustable gain of 1/6, 1/5, 1/4, 1/3, 1/2 or 1, meaning 3.6, 3.0, 2.4, 1.8, 1.2 or 0.6V for the ADC levels.
External Reference is VDD/4, with an adjustable gain of 1, 2 or 4, meaning
VDD/4, VDD/2 or VDD for the ADC levels.
Default settings are internal reference with 1/6 gain (GND..3.6V ADC range)
Warning : On Arduino Zero board the input/output voltage for SAMD21G18 is 3.3 volts maximum

出典:wiring_analog_nRF52.c

これによると、基準電圧として、内部基準電圧0.6Vか、外部基準電圧VDD/4=3.3V/4を選ぶことができます。デフォルトでは内部基準電圧0.6V、ゲイン1/6であり、AD変換のフルスケールは3.6Vです。

Wio BG770Aの場合、電源電圧そのものを基準電圧としているわけではないため、デフォルトで自分自身の電源を計測することができます!Wio BG770AでのAD変換(アナログ入力)については、この記事に詳細をまとめています。

■ 自分自身の電源電圧計測試験

AD変換の基準電圧を理解したところで、実際に電源電圧を計測することができるか確認すべく、試験を行いました。

◎ 試験写真

電池とWio BG770Aの間に、分圧抵抗回路(後述)を割り込ませています。

◎ 回路図

電源のプラスとマイナスの間に分圧抵抗を入れ、中間点をA4ピンに入力しました。電源はニッケル水素単3電池x4本とし、約1.3Vx4本=約5.2Vです。今回はこの記事を参考に200kΩx2で分圧させ、約3.1V(<3.3VなのでOK)をA4ピンにアナログ入力し、電源電圧を計測します。

なお、流れる電流値はI=V/R=約5.2V/400kΩ=約13μAです。電池駆動を想定すると、電流値低減のため、抵抗値を高く設定したいのですが、最大何Ωまで上げられるのでしょうか?

◎ コード

電池駆動を想定し、PSMモードのサンプルコードであるsoracom-uptime-lp.inoの一部を改変し、電源電圧をSORACOMに送信します。

(中略)
const int BAT_VLT_PIN = A4;        // バッテリーピンの定義
const int MEASUREMENT_COUNT = 10;  // 計測回数
(中略)

void setup(void) {
(中略)
  // ADCの分解能を14ビットに設定
  analogReadResolution(14);
(中略)
}

static bool measure(JsonDocument& doc) {
  Serial.println("### Measuring");

  // 経過時間
  doc["uptime"] = millis() / 1000;

  // 電源電圧計測
  uint32_t totalAdcValue = 0;
  for (int i = 0; i < MEASUREMENT_COUNT; i++) {
    totalAdcValue += analogRead(BAT_VLT_PIN);
  }
  int avgAdcValue = totalAdcValue / MEASUREMENT_COUNT;

  int vlt = (avgAdcValue * 3600) / 16383; // [mV]
  vlt = (vlt * 2 / 10) * 10;  // 分圧抵抗分計算後、10の位に丸める[mV]

  doc["vlt"] = vlt;

  Serial.print("vlt: ");
  Serial.println(vlt);

  Serial.println("### Completed");

  return true;
}

◎ 試験結果

一晩試験しました。下図がSORACOM Harvestのグラフであり、5120mV〜5140mVのレンジで計測できています。なお、1mV代を丸め、10mVオーダーで計測しています。

電池電圧計測結果

■ まとめ

今回の記事では、Wio BG770Aの電源電圧を計測し、SORACOMに送信できることを確認しました。以下がポイントです。

  • Wio BG770Aの場合、デフォルトのAD変換の設定で、自分自身の電源電圧を計測できる!

  • PSMモードのサンプルコードにおいて、measure()関数内をいじることで、電源電圧等をSORACOMに送ることができる!

電源電圧計測回路において、抵抗値の設定方法やコンデンサ要否などコメント頂ければ嬉しいです。

次回からは、SORACOMへの通信や、PSMモードを深堀りしていきます。

ここまでお読みいただき、ありがとうございます!この記事が参考になった方は、スキ、コメント、フォローいただけると励みになります。


《 参考》

・Wio 770Aの研究シリーズの各記事を、マガジンにまとめています。

いいなと思ったら応援しよう!