旅を楽しくするArduino端末を作る。その9-電圧計の誤差とその代替案-

第9回は、その3で紹介した分圧回路を用いた電圧計に発生する誤差の説明と、正確な値を取得する代替案を紹介いたします。
第3回の分圧回路編を踏まえた内容ですので、まだご覧になっていない方はこちらからどうぞ。

カーボン抵抗を用いた分圧回路の欠点

安価でお手頃なカーボン抵抗だが・・・

以前作成したカーボン抵抗を用いた分圧回路ですが、実際に利用してみると誤差が大きくバッテリー電圧を測定するには向いていませんでした。
推測になりますが、誤差の原因として、

1.カーボン抵抗の誤差(抵抗値の1%)
2.温度係数がある(外気温によって抵抗値が変わる)
3.Arduinoの分解能が10bit(20Vを1024分割で測定)
※一般的には12bitぐらいで測定する。

などがあげられます。
正直、作成時は無視できると思っていましたが、実際に運用してみるとバイクのバッテリー電圧を図るには適していないほどずれが発生していたため、この問題を解決します。

代替案(INA219)

電圧測定の代替案として、今回挙げさせていただくのは、
Adafruit社製の「INA219 High Side DC Current Sensor」
です。
これはINA219というMaxDC26Vまで測定できる、電流電圧測定ICを搭載したセンサーになります。
センサーとの通信はI2Cを用いるので、2線のみで電流と電圧を測れます。
詳しい仕様はテキサスインスツルメンツのHPからデータシートを見ることで分かります。

https://www.tij.co.jp/product/jp/INA219

わたしは、秋月電子通商で購入しました。
Adafruitの公式販売はディスコンになっていので、もしかしたら再販はないかもしれません。

回路

回路は非常にシンプルです。

INA219側Arduino側
Vcc5V
GndGnd
SclScl
SdaSda

通信だけなら上記の接続だけで大丈夫です。
実際に測りたい配線をVin+からVin-に直列で配線すると測定できます。
注意してほしい点として、電流計ですので、直列に配線する必要があります。
並列につないでしまうと測定できません。

コード

#include <Wire.h>
#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;


void setup(void) 
{
  Serial.begin(9600);
  while (!Serial) {
      // will pause Zero, Leonardo, etc until serial console opens
      delay(1);
  }

  uint32_t currentFrequency;
    
  Serial.println("Hello!");
  
  // Initialize the INA219.
  // By default the initialization will use the largest range (32V, 2A).  However
  // you can call a setCalibration function to change this range (see comments).
  if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip");
    while (1) { delay(10); }
  }
  // To use a slightly lower 32V, 1A range (higher precision on amps):
  //ina219.setCalibration_32V_1A();
  // Or to use a lower 16V, 400mA range (higher precision on volts and amps):
  //ina219.setCalibration_16V_400mA();

  Serial.println("Measuring voltage and current with INA219 ...");
}

void loop(void) 
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  Serial.println("");

  delay(2000);
}

まずはI2CのアドレスをArduino側で確認します。
デフォルトでは0x40のアドレスが設定されているので、ちゃんと出力があるか事前に確認してみてください。
もし、0x40がほかのセンサーで利用していた場合は、別のアドレスを設定する方法もありますので、公式ドキュメントを参照してみてください。

https://www.adafruit.com/product/904

I2Cのアドレス確認方法は下記記事をご覧ください。

今回のコードは公式ドキュメントにあるサンプルコードをもとに、使い勝手がいいように設定を少し変えています。
利用にあたり、Adafruit_INA219.hのライブラリのインストールが必要になりますので、下記リンクを参考にインストールをしてください。

https://learn.adafruit.com/adafruit-ina219-current-sensor-breakout/arduino-code

結果のほうはArduino IDEのシリアルモニターをご覧ください。

結果

何も負荷につながないと、電流値or消費電力は測定できませんので、今回は旅Arduino Ver1で最も電気を食っているLCDのを測定しました。
電源には12Vの電源を使用しています。Arduino UNOに流れる前の電気をVin+にいれVin-をArduinoのVinに入れています。
LCDの一行目に表示されている値がINA219からの測定値で単位はVです。
右側のマルチメーターの値も単位がVなので、多少のずれはあれどちゃんと測定できていることがわかります。
※前回使用した分圧回路での電圧計は小数点第一桁目がずれていたため、こちらよりは正確だと思います。

また、LCDの2行目は消費電力を表示しております。単位はmWです。
ArduinoとLCDとINA219の消費電力は1W以下に抑えられていることがわかります。

まとめ

旅Arduino Ver1はLCD以外に大きな消費元を持たないため、最大負荷時でも2Wは超えないでしょう。
バイクのグリップヒーターは軒並み20~30W消費していますので、旅Arduinoでの消費電力は誤差みたいなものです。

次回は、このINA219を旅Arduinoに組み込んで、Ver2を作成します。

旅を楽しくするArduino端末を作る。リンク集

その1-不満点を挙げよう- 
その2-不満点をまとめよう-

その3-電圧測定器を作る-
その4-温湿度計を作る-
その5-気圧計を作る-
その6-方位・高度計をGPSで-
その7-12Vバッテリーから電力供給
その8-Ver1作成-
その9-電圧計の誤差とその代替案-
その10-Ver2へアップデート-
その11-LCDをI2Cで制御しよう-
その12-LCDをI2C化-
その13-Ver3へアップデート-
その14-USB充電の仕様に関して-
その15-Arduino言語を用いながらBluetoothで通信できるESP32-
その16-旅Arduino Ver4 スマホアプリ化-

関連記事一覧

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP