Arduinoで電圧計を作ってみる その2
前回作ったArduino電圧計は、出力がシリアルでPCが無いと結果が見られない状態でしたので、今回はArduino単体で電圧を確認出来るように、7セグLEDに計測した電圧を表示できるようにしてみます。
7 Segment LEDとは
7セグLEDとは、数字を7つの領域(セグメント)に分割して表示する、LEDの集合体です。
LED以外にも、液晶なんかでも7セグ表示は一般的なので、見たことが無い人はいないと思います。
今回は、4桁の物を使います。
秋月電子で200円~250円程で売られているものです。
7セグLEDには、+の端子を1ピンに束ねたアノード・コモンと、-の端子を1ピンに束ねたカソード・コモンの物が有りますが、今回買ったのはアノード・コモンの物です。
本当は、カソード・コモンの物で作ろうと思っていたのですが、間違えて買っちゃいましたw
ダイナミック点灯
複数桁の7セグLEDをArduino等のマイコンで表示する場合、一般的にはダイナミック点灯と言う方式を使って表示します。
ダイナミック点灯とは、複数桁有る7セグLEDの1桁ずつ順番に表示することにより、マイコンに必要となる信号ピンの数を減らすと言う点灯方式です。
1桁ずつを高速に切り替える事で、人間の目には各桁の残像が残り、あたかも全て表示されているように見えると言うわけです。
とりあえず
回路図はこんな感じ↑
先に述べた通り、この7セグLEDはアノードコモンです。
カソードコモンの7セグLEDに、この回路は使えません。
※当初、トランジスタ(2SC1815)を使った回路だったのですが、あまり意味が無いと言うことが分かったのでトランジスタ無しに修正しました。(2011/10/11)
デジタル入力0と1は、いざと言うときPCとシリアル接続する為に空けています。
BATTERY+/- に、計りたい電圧の+/-を接続します。
計測できる最大電圧は 21.6V
10ビット(1024)の分解能で精度は約0.021V
続いてスケッチです。
#include <MsTimer2.h><br /> <br /> #define ANODE_COMMON<br /> <br /> // カソードコモン用表示パターン (GFEDCBA)<br /> unsigned char patterns[] =<br /> {<br /> 0b00111111, // 0<br /> 0b00000110, // 1<br /> 0b01011011, // 2<br /> 0b01001111, // 3<br /> 0b01100110, // 4<br /> 0b01101101, // 5<br /> 0b01111101, // 6<br /> 0b00100111, // 7<br /> 0b01111111, // 8<br /> 0b01101111, // 9<br /> 0b10000000, // .<br /> 0b00000000, //<br /> };<br /> <br /> unsigned char digits[4]={1,2,3,4};<br /> unsigned char digitPos=0;<br /> <br /> void dynamic()<br /> {<br /> digitalWrite(10+digitPos,LOW);<br /> <br /> digitPos++;<br /> digitPos&=0x03;<br /> <br /> unsigned char pattern;<br /> pattern = patterns[digits[digitPos]];<br /> if(digitPos==1)<br /> {<br /> #ifdef ANODE_COMMON<br /> pattern &= patterns[10];<br /> #else<br /> pattern |= patterns[10];<br /> #endif<br /> }<br /> <br /> PORTD = (pattern<<2) | (PORTD & 0b00000011);<br /> PORTB = (pattern>>6) | (PORTB & 0b11111100);<br /> digitalWrite(10+digitPos, HIGH);<br /> }<br /> <br /> void setup()<br /> {<br /> Serial.begin(115200);<br /> <br /> MsTimer2::set(1, dynamic);<br /> MsTimer2::start();<br /> <br /> int i;<br /> for(i=2;i<=13;i++)<br /> {<br /> pinMode(i, OUTPUT);<br /> digitalWrite(i, LOW);<br /> }<br /> <br /> #ifdef ANODE_COMMON<br /> for(i=0;i<sizeof(patterns);i++)<br /> {<br /> patterns[i]=~patterns[i];<br /> }<br /> #endif<br /> }<br /> <br /> void loop()<br /> {<br /> int value;<br /> value = getVoltage();<br /> <br /> digits[3]=value%10;<br /> value/=10;<br /> <br /> digits[2]=value%10;<br /> value/=10;<br /> <br /> digits[1]=value%10;<br /> value/=10;<br /> <br /> digits[0]=value%10;<br /> value/=10;<br /> if(value==0 && digits[0]==0) digits[0]=11;<br /> <br /> delay(500);<br /> }<br /> <br /> int getVoltage()<br /> {<br /> double value;<br /> value=analogRead(A0);<br /> <br /> value*=0.021158854166666666666666666666667; // = 5V / 1024 / 30kΩ * 130kΩ<br /> Serial.println(value);<br /> <br /> return value*100;<br /> }
スケッチ(プログラム)は、こんな感じです。
ダイナミック点灯の為にMsTimer2と言うタイマー・ライブラリを使って、1ミリ秒毎に桁を切り替えて表示しています。
参考)
MsTimer2 – playground
MsTimer2(ミリ秒単位で指定するタイマ) – Arduino 日本語リファレンス
上記の回路、スケッチを利用して、実際に実行している様子がこれ↓
なかなか上手く写真が撮れませんでしたが、12Vバッテリーの計測中を撮影しました。
実物はもっとキレイに光っています。
最後に
今回、7セグLEDに表示するようにすると、ADCで得られる数値のふらつきの振幅が大きくなってしまいました。
しかし、Arduinoの電源をPCのUSBからでは無く、12Vバッテリーから取るようにすると、このふらつきは大きく改善されました。
それでも多少は揺れてしまいますが・・・割と実数に近い数値が表示されて、満足の行く物ができたと自分では思っています。
関連記事
-
-
Arduinoで電圧計を作ってみる その3
前回作ったArduino電圧計を、ケースに入れて完全に単体で動くようにしました。
-
-
Arduinoで電圧計を作ってみる
今後、色々と太陽電池を使った電子工作をして行こうと思っているのですが、何を作るにしても電圧監視は必至
-
-
Arduinoの消費電力
Arduinoにバッテリーを接続した時に流れる電流を計ってみました。 電流計測に使ったのは、MET
-
-
LEDランタン その2
先日作ったLEDランタンの電流制限抵抗を変えて明るさを確認してみました。 左から、1k&Ome
-
-
LEDランタンを作ってみる
太陽電池を有効活用する為に、LEDランタンを手作りしてみました。 ランタンの本体となるのは、1
- PREV
- Arduinoで電圧計を作ってみる
- NEXT
- Arduinoで電圧計を作ってみる その3
Comment (2件)
arudinoで電圧測定、大変勉強になります。
arudinoで7segのLEDを行いたいにですが、
プログラムの30行目 文字変換にする所で digitPos& エラーが出て
コンパイルできないので何か方法がありますか?
‘amp” was not declared in this scopeと出ます
もしわかるようでしたら、お願いします。
ご指摘ありがとうございます。
&の表示はhtmlエンティティで、&=&のことを表しています。
ブログのエディターの変換が原因で、&が&に自動変換されてしまうようで、どうも失礼ました。
とりあえず、修正しましたが、修正もれがあるかもしれません・・・