Arduinoで電圧計を作ってみる

公開日: 電子工作 | ,

今後、色々と太陽電池を使った電子工作をして行こうと思っているのですが、何を作るにしても電圧監視は必至なので、先ずは電圧計を作ってみようと思います。

今回作る電圧計には、Arduinoを使います。
Arduinoと言うのは、ATMEL ATMega328Pを搭載した、マイコン・ボードのことです。 

最新のArduinoはUNOですが、僕が持っているのはDuemilanoveでArduinoの中では一世代前のボードとなっております。 基本的には、UNOもDuemilanoveもコンパチブルで、まったく同様に動作するものと思います。

電圧の計測

電圧の計測には、Arduinoのアナログ入力を使います。
Arduinoのアナログ入力は、0V~最大5V(動作電圧)までの電圧を測定できるのですが、太陽電池パネル(OSSM-SF0012)は開放電圧21Vとなっていてこれを直接Arduinoのアナログ入力に接続すると、Arduinoが壊れてしまいます。

この問題を解決する為に、抵抗を2つ使った簡単な分圧回路を作ります。
分圧を使えば、0V~21Vの高い電圧を、0V~5Vにまで下げることができます。

分圧回路はこのようになります↓

分圧回路

VINに入力された電圧が R1・R2の比率で変換された電圧でVOUTに出力されます。

比率の計算式は

VOUT = R2 / (R1+R2) * VIN

となります。

参考)分圧回路 – Wikipedia

 

今回、手持ちの抵抗と相談して、

R1 = 100kΩ
R2 = 30kΩ

を利用することとしました。
先の計算式に照らし合わせると、0~21.66V が 0~5V になる計算です。

 

Arduinoへの接続

分圧回路2

ブレッドボードを使って接続すると、このようになります。
図では単三電池2本が繋がっていますが、これを鉛バッテリーや太陽電池パネルに置き換えて電圧を測ることができます。

Arduinoのスケッチ

次に、Arduinoのプログラムを作ります。

void setup()<br />
{<br />
  Serial.begin(115200UL);<br />
}<br />
<br />
void loop()<br />
{<br />
  int value = analogRead(A0);<br />
  Serial.println(value);<br />
  delay(1000);<br />
}

このプログラムは、1秒毎にアナログ入力0番ピンの電圧を測定して、接続しているPCにシリアル出力します。

Arduinoのアナログ入力は10ビットの分解能なので、0~5Vの電圧を0~1023までの数値で得られます。
つまり、5Vの時は1023、半分の2.5Vの時は得られる数値も半分の511となります。

それでは、ここに12Vバッテリーを繋いでみます。

分圧回路へ接続

バッテリーを接続すると、PC上のシリアルモニターには、604前後の数字が表示されます。

シリアルモニター1

この数値を、電圧の値を計算すると・・・

604 *  5V / 1024 = 2.94V

アナログ入力には 2.94V の電圧が入力されていると言うことになります。
この電圧は、分圧回路を通った後の電圧なので、分圧される前の値を計算すると・・・

2.94V / 30k * 130k = 12.74V

この12Vバッテリーの電圧は、12.74Vと言うことになります。

この一連の計算を追加したスケッチは、以下のようになります。

void setup()<br />
{<br />
  Serial.begin(115200UL);<br />
}<br />
<br />
void loop()<br />
{<br />
  double value = analogRead(A0);<br />
  value *= 5;<br />
  value /= 1024;<br />
  value /= 30;<br />
  value *= 130;<br />
  Serial.println(value);<br />
  delay(1000);<br />
}

シリアルモニター2 

シリアルモニターには 12.78V 前後の数値が表示されています。
これはdouble型の変数で計算しているので、先に計算した12.74V よりも正確な数値です。

テスターの電圧表示

実際のテスターの電圧表示も、12.77Vと表示されていて、誤差0.01V程の正しい結果が得られていると思います。

最後に

偶然なのか、電圧のふらつきは有るものの、ほぼ正しい数値が得られているようです。
使用した抵抗は、安いカーボン抵抗なので抵抗値に±5%の誤差があることを考え、実際の数値に近づける為に校正が必要だろうと思っていましたが、どうやらこのままで使えそうな感じです。

次は、単体で電圧を計れるように、7セグLEDを使って電圧表示をしてみようと思います。

関連記事

手作りLEDランタン

LEDランタン その2

先日作ったLEDランタンの電流制限抵抗を変えて明るさを確認してみました。 左から、1k&Ome

記事を読む

arduino-voltmeter2

Arduinoで電圧計を作ってみる その2

前回作ったArduino電圧計は、出力がシリアルでPCが無いと結果が見られない状態でしたので、今回は

記事を読む

LEDランタン

LEDランタンを作ってみる

太陽電池を有効活用する為に、LEDランタンを手作りしてみました。 ランタンの本体となるのは、1

記事を読む

arduino 電圧計2

Arduinoで電圧計を作ってみる その3

前回作ったArduino電圧計を、ケースに入れて完全に単体で動くようにしました。  

記事を読む

Arduinoコンパチ・ブレッドボード

Arduinoの消費電力

Arduinoにバッテリーを接続した時に流れる電流を計ってみました。 電流計測に使ったのは、MET

記事を読む

Comment (8件)

  1. funayama

    始めまして funayama と申します。
    Futabaさんの電圧計回路を拝見させていただき
    同じ物を作成しようと取り掛かったのですが
    アナログ入力(乾電池2本 実測3.02v 抵抗無)
    をしたところ660前後とシリアルモニターに表示されました。
    計算上660前後だと660*5v/1024=3.22v程度の電圧が入力されている
    事になるんでしょうか?
    抵抗無しが問題なのでしょうか?
    素人の質問で申し訳ございません。
    お手数掛けまして申し訳ございません。

    1. Futaba

      コメントありがとうございます。
      僕も素人で、その素人の推測で申し訳ないですが・・・
      アナログの基準電圧が問題なのでは無いかと思います。

      Arduinoの電源はどうなさっていますか?
      標準的なArduinoであれば、電源電圧=アナログ基準電圧となるので、電源電圧が5Vで安定していなければ、上記の計算式は成り立ちません。

      僕の知ってる限り、USBのバスパワーは安定性に欠けるので、もしArduinoの電源をUSBから取っているのであれば、できるだけ他のUSB機器を取り外したり、Arduinoの外部電源化を試してみるとまた違った結果が出るのではないかと思います。

      また、プログラムに詳しいのであれば、内臓1.1Vの基準電圧を使ったり、外部基準電圧をAREFピンから入力したりする方法もあります。

      analogReference(type) – Arduino 日本語リファレンス

      1. funayama

        早速のご回答ありがとうございます。

        ご指摘のとおりUSB電圧の不足でした。

        USBバスパワー 4.74v
        アナログ入力 実測 3.07v
        測定値 664

        664*4.74/1024=3.074v

        計算がぴったり合います。

        素人におつきあいくださいましてありがとうございました。
        大変勉強になりました。

        funayama

  2. dateKo

    初めまして。
    dateKoと申します。

    太陽電池をArduinoの入力にするという点で非常に参考になりました。
    一つだけ疑問点があります。

    太陽電池を使うときに負荷は何をつけますか?
    負荷をつけないとArduinoに電流(一般的な太陽電池1直列で500mA程度)が流れてしまわないのでしょうか? もしくは、ArduinoのAD変換器の入力抵抗が非常に大きく、流れ込まないようになっているのでしょうか? いくつか文献やサイトを調べては見たのですが未だに明確な答えは出ていません。。。

    コメントありましたらよろしくお願いします。

    1. Futaba

      dateKoさん、コメント有難うございます。

      一応、AVRのデータシートで確認した所、Mega328のアナログ入力回路は

      概ね10kΩ若しくはそれ以下の出力インピーダンスのアナログ信号用に最適化
      されています。

      とのことなので、アナログ入力には負荷抵抗は必要無いと思います。
      (逆にこのページの分圧抵抗は、抵抗値高すぎだろって言う・・・)
      ただし、電圧には注意が必要です。Arduino(Unoとか)の場合5Vを超えることは出来ません。

  3. dateKo

    Futabaさん
    コメントありがとうございます。

    やはりデータシートには載っているのですね。確認不足でした。ありがとうございます。

    たしかにFutabaさんの回路構成だと、Mega328の入力インピーダンスに対して抵抗分圧の値が大きすぎて、仕様の条件を満たしていないかもしれませんね。ですが、回路も壊れず測定も上手く出来ているのであればそれで良いのかも知れませんね。

    現在、私は太陽電池の出力をArduinoに入力して、MPPTを施すことを実験しています。

    近しい実験をされているようですので、これからもサイトの更新を楽しみにしています。

    どうもありがとうございました。

    1. Futaba

      dateKoさん、コメント有難うございます。

      分圧の部分の抵抗を大きくしているのは、分圧部分は常に電流が流れてしまって、無駄に消費してしまうので、少しでも流れる電流が小さくなるようにと思って大きくしてみました。

      MPPTは僕も興味があるので、完成すれば是非公開して欲しいな・・・なんてw

      このブログはもうかれこれ2年以上更新してませんが、色々と作ってはいるのでまた何か書いてみたいと思いますので、今後ともよろしくお願い致します。

  4. ピンバック: ArduinoでキッチンタイマーのLED制御 | とど日和

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

太陽電池パネルにベランダの手摺りの影
太陽電池パネルの発電不良

ここの所、夕方の日没時でもバッテリーの残量が殆ど無い状態が続いていて、

Arduinoコンパチ・ブレッドボード
Arduinoの消費電力

Arduinoにバッテリーを接続した時に流れる電流を計ってみました。

手作りLEDランタン
LEDランタン その2

先日作ったLEDランタンの電流制限抵抗を変えて明るさを確認してみま

LEDランタン
LEDランタンを作ってみる

太陽電池を有効活用する為に、LEDランタンを手作りしてみました。

arduino 電圧計2
Arduinoで電圧計を作ってみる その3

前回作ったArduino電圧計を、ケースに入れて完全に単体で動くように

PAGE TOP ↑