見出し画像

Arduinoで自分自身の電源電圧を計測する方法

Arduinoマイコンで開発するIoTデバイスにおいて、自分自身の電源電圧を計測する方法をまとめます。基準電圧に注意する必要があります。


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

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

電源電圧を計測するためには、AD変換を用いることが一般的です。ただし、自分自身の電源電圧を計測する上で、AD変換における基準電圧に注意する必要があります。私自身、このことに気づかず、電源電圧が減っているのにも関わらず、デバイスからは送信される電源電圧が5.0Vとなってしまうという失敗をしたことがあります。

前回の記事で電源電圧の計測について触れたこともあり、本記事では電源電圧計測について深堀りします。

2. まず基準電圧を理解する

Arduino UnoのAD変換は10bitであり、入力電圧された電圧に応じ0〜1023で返します。通常、基準電圧は5.0Vであり、5Vというアナログ入力に対して、1023というデジタル値が出力されます。2.5Vであれば512となります。得られたデジタル値をアナログ値に換算すれば、入力電圧を知ることができます。

Arduino Unoの電源が、商用電源〜5V変換アダプタ〜USB端子であれば、5Vが入力されるため、上記方法で特に問題はありません。

一方、Arduino Unoの電源が、電池やバッテリーの場合は注意が必要です。仮に、電源が電池〜USB端子であり、電池電圧が4.5Vまで下がったとします。この場合、基準電圧は5.0Vではなく4.5Vとなってしまい、例えば1023という値が返ってきたときの入力電圧は4.5Vとなります。基準となる電圧が変わってしまうと、正しくAD変換をすることができません。電源電圧計測のためには、基準電圧について正しく理解する必要があります。

3. 基準電圧の決め方には3つの選択肢がある

Arduino Uno(Arduino AVR Boards)において、基準電圧の決め方には3つの選択肢があります。

  1. DEFAULT: 電源電圧(5V)が基準電圧となります(デフォルト)

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

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

通常は1.でAD変換されますが、analogReference(INTERNAL);やanalogReference(EXTERNAL);と指定することで、2.や3.の方法も選択できます。3.のAREFピンの位置を下図に示します。今回は3.の方法で電池電圧を計測します。

Arduino UnoのAREFピンの位置

4. 基準電圧を3.3Vとし、分圧抵抗を用いて計測する

私は電池駆動型自作IoTデバイスの電源として、ニッケル水素電池4本をよく用いています。ニッケル水素電池の初期電圧を約1.35V本、終止電圧を約1.1V/本とすると、5.4Vからスタートし、4.4Vまで下がることになります。

Arduinoには3V3ピンがありますが、ここにはArduino Unoに内蔵されている3.3Vレギュレーターで、3.3Vが作り出されます。4.4V程度であれば、ドロップ電圧を加味しても3.3Vが作り出される(はず)。ということで、3V3ピンとAREFを接続する方針とします。

また、電源電圧計測のため、分圧抵抗を入れます。5Vピン(USB端子からの電源電圧が出力される)とGND間に、20kΩを2つ入れ、その中間をアナログ入力ピン(ここではA0ピン)に接続します。電源電圧として初期電圧5.4V+α=6.0Vが入力された場合、2つの抵抗の中間の電圧は3.0Vであり、これは基準電圧以下であるため、計測可能です。電源安定化のため10μFのコンデンサも追加しています。参考までに、回路図とコードを示します。

3.3Vを基準電圧とした電源電圧計測回路図
const float referenceVoltage = 3.3; // 外部基準電圧3.3V
const float resistorRatio = 2.0;    // 分圧比(20kΩ:20kΩ)

analogReference(EXTERNAL); // 外部基準電圧を使用
int sensorValue = analogRead(A0); // A0ピンのアナログ値を読み取る
float voltage = sensorValue * (referenceVoltage / 1023.0); // A0ピンの電圧を計算
float batteryVoltage = voltage * resistorRatio; // 分圧された電圧を元に戻す

Serial.print("Battery Voltage = ");
Serial.print(batteryVoltage);
Serial.println(" V");

正直、分圧抵抗の選定指針や、コンデンサの選定指針がイマイチわかっていません。教えて頂ければ幸いです。

5. まとめと今後の課題

電池やバッテリーで駆動するIoTデバイスにおいて、電源電圧を計測するためには、基準電圧を正しく理解する必要があることがわかりました。5V昇圧回路を用いる場合は、デフォルトの基準電圧設定でも問題ないかもしれませんが、用いない場合は外部基準電圧の設定が有効な選択肢の一つです。電池駆動型IoTデバイスにおいて、電源電圧の把握は重要です。ご参考ください。

参考

・電源電圧がうまく計測できず、なんでやーと苦しんでいたときにヒットした記事。電源電圧の計測方法について、詳しく書かれています。

・Arduinoのレファレンスも参考ください。


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