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
となります。
今回、手持ちの抵抗と相談して、
R1 = 100kΩ
R2 = 30kΩ
を利用することとしました。
先の計算式に照らし合わせると、0~21.66V が 0~5V になる計算です。
Arduinoへの接続
ブレッドボードを使って接続すると、このようになります。
図では単三電池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前後の数字が表示されます。
この数値を、電圧の値を計算すると・・・
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 /> }
シリアルモニターには 12.78V 前後の数値が表示されています。
これはdouble型の変数で計算しているので、先に計算した12.74V よりも正確な数値です。
実際のテスターの電圧表示も、12.77Vと表示されていて、誤差0.01V程の正しい結果が得られていると思います。
最後に
偶然なのか、電圧のふらつきは有るものの、ほぼ正しい数値が得られているようです。
使用した抵抗は、安いカーボン抵抗なので抵抗値に±5%の誤差があることを考え、実際の数値に近づける為に校正が必要だろうと思っていましたが、どうやらこのままで使えそうな感じです。
次は、単体で電圧を計れるように、7セグLEDを使って電圧表示をしてみようと思います。
関連記事
-
-
Arduinoで電圧計を作ってみる その3
前回作ったArduino電圧計を、ケースに入れて完全に単体で動くようにしました。
-
-
Arduinoで電圧計を作ってみる その2
前回作ったArduino電圧計は、出力がシリアルでPCが無いと結果が見られない状態でしたので、今回は
-
-
Arduinoの消費電力
Arduinoにバッテリーを接続した時に流れる電流を計ってみました。 電流計測に使ったのは、MET
-
-
LEDランタン その2
先日作ったLEDランタンの電流制限抵抗を変えて明るさを確認してみました。 左から、1k&Ome
-
-
LEDランタンを作ってみる
太陽電池を有効活用する為に、LEDランタンを手作りしてみました。 ランタンの本体となるのは、1
- PREV
- バイク用鉛蓄電池(WP9B-4)
- NEXT
- Arduinoで電圧計を作ってみる その2
Comment (8件)
始めまして funayama と申します。
Futabaさんの電圧計回路を拝見させていただき
同じ物を作成しようと取り掛かったのですが
アナログ入力(乾電池2本 実測3.02v 抵抗無)
をしたところ660前後とシリアルモニターに表示されました。
計算上660前後だと660*5v/1024=3.22v程度の電圧が入力されている
事になるんでしょうか?
抵抗無しが問題なのでしょうか?
素人の質問で申し訳ございません。
お手数掛けまして申し訳ございません。
コメントありがとうございます。
僕も素人で、その素人の推測で申し訳ないですが・・・
アナログの基準電圧が問題なのでは無いかと思います。
Arduinoの電源はどうなさっていますか?
標準的なArduinoであれば、電源電圧=アナログ基準電圧となるので、電源電圧が5Vで安定していなければ、上記の計算式は成り立ちません。
僕の知ってる限り、USBのバスパワーは安定性に欠けるので、もしArduinoの電源をUSBから取っているのであれば、できるだけ他のUSB機器を取り外したり、Arduinoの外部電源化を試してみるとまた違った結果が出るのではないかと思います。
また、プログラムに詳しいのであれば、内臓1.1Vの基準電圧を使ったり、外部基準電圧をAREFピンから入力したりする方法もあります。
analogReference(type) – Arduino 日本語リファレンス
早速のご回答ありがとうございます。
ご指摘のとおりUSB電圧の不足でした。
USBバスパワー 4.74v
アナログ入力 実測 3.07v
測定値 664
664*4.74/1024=3.074v
計算がぴったり合います。
素人におつきあいくださいましてありがとうございました。
大変勉強になりました。
funayama
初めまして。
dateKoと申します。
太陽電池をArduinoの入力にするという点で非常に参考になりました。
一つだけ疑問点があります。
太陽電池を使うときに負荷は何をつけますか?
負荷をつけないとArduinoに電流(一般的な太陽電池1直列で500mA程度)が流れてしまわないのでしょうか? もしくは、ArduinoのAD変換器の入力抵抗が非常に大きく、流れ込まないようになっているのでしょうか? いくつか文献やサイトを調べては見たのですが未だに明確な答えは出ていません。。。
コメントありましたらよろしくお願いします。
dateKoさん、コメント有難うございます。
一応、AVRのデータシートで確認した所、Mega328のアナログ入力回路は
とのことなので、アナログ入力には負荷抵抗は必要無いと思います。
(逆にこのページの分圧抵抗は、抵抗値高すぎだろって言う・・・)
ただし、電圧には注意が必要です。Arduino(Unoとか)の場合5Vを超えることは出来ません。
Futabaさん
コメントありがとうございます。
やはりデータシートには載っているのですね。確認不足でした。ありがとうございます。
たしかにFutabaさんの回路構成だと、Mega328の入力インピーダンスに対して抵抗分圧の値が大きすぎて、仕様の条件を満たしていないかもしれませんね。ですが、回路も壊れず測定も上手く出来ているのであればそれで良いのかも知れませんね。
現在、私は太陽電池の出力をArduinoに入力して、MPPTを施すことを実験しています。
近しい実験をされているようですので、これからもサイトの更新を楽しみにしています。
どうもありがとうございました。
dateKoさん、コメント有難うございます。
分圧の部分の抵抗を大きくしているのは、分圧部分は常に電流が流れてしまって、無駄に消費してしまうので、少しでも流れる電流が小さくなるようにと思って大きくしてみました。
MPPTは僕も興味があるので、完成すれば是非公開して欲しいな・・・なんてw
このブログはもうかれこれ2年以上更新してませんが、色々と作ってはいるのでまた何か書いてみたいと思いますので、今後ともよろしくお願い致します。
ピンバック: ArduinoでキッチンタイマーのLED制御 | とど日和