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

公開日: 電子工作 | ,

前回作ったArduino電圧計は、出力がシリアルでPCが無いと結果が見られない状態でしたので、今回はArduino単体で電圧を確認出来るように、7セグLEDに計測した電圧を表示できるようにしてみます。

7 Segment LEDとは

7セグLEDとは、数字を7つの領域(セグメント)に分割して表示する、LEDの集合体です。
LED以外にも、液晶なんかでも7セグ表示は一般的なので、見たことが無い人はいないと思います。

参考)7セグメントディスプレイ – Wikipedia

7-segment-LED

今回は、4桁の物を使います。
秋月電子で200円~250円程で売られているものです。

7セグLEDには、+の端子を1ピンに束ねたアノード・コモンと、-の端子を1ピンに束ねたカソード・コモンの物が有りますが、今回買ったのはアノード・コモンの物です。
本当は、カソード・コモンの物で作ろうと思っていたのですが、間違えて買っちゃいましたw

ダイナミック点灯

複数桁の7セグLEDをArduino等のマイコンで表示する場合、一般的にはダイナミック点灯と言う方式を使って表示します。
ダイナミック点灯とは、複数桁有る7セグLEDの1桁ずつ順番に表示することにより、マイコンに必要となる信号ピンの数を減らすと言う点灯方式です。
1桁ずつを高速に切り替える事で、人間の目には各桁の残像が残り、あたかも全て表示されているように見えると言うわけです。

とりあえず

とりあえず、作ってみる。

Arduino Voltmeter2 回路図2

回路図はこんな感じ↑
先に述べた通り、この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&amp;=0x03;<br />
<br />
    unsigned char pattern;<br />
    pattern = patterns[digits[digitPos]];<br />
    if(digitPos==1)<br />
    {<br />
#ifdef ANODE_COMMON<br />
        pattern &amp;= patterns[10];<br />
#else<br />
        pattern |= patterns[10];<br />
#endif<br />
    }<br />
<br />
    PORTD = (pattern<<2) | (PORTD &amp; 0b00000011);<br />
    PORTB = (pattern>>6) | (PORTB &amp; 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 &amp;&amp; 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&Omega; * 130k&Omega;<br />
    Serial.println(value);<br />
<br />
    return value*100;<br />
}

スケッチ(プログラム)は、こんな感じです。
ダイナミック点灯の為にMsTimer2と言うタイマー・ライブラリを使って、1ミリ秒毎に桁を切り替えて表示しています。

参考)
MsTimer2 – playground
MsTimer2(ミリ秒単位で指定するタイマ) – Arduino 日本語リファレンス

上記の回路、スケッチを利用して、実際に実行している様子がこれ↓

arduino-voltmeter2

なかなか上手く写真が撮れませんでしたが、12Vバッテリーの計測中を撮影しました。
実物はもっとキレイに光っています。

最後に

今回、7セグLEDに表示するようにすると、ADCで得られる数値のふらつきの振幅が大きくなってしまいました。
しかし、Arduinoの電源をPCのUSBからでは無く、12Vバッテリーから取るようにすると、このふらつきは大きく改善されました。
それでも多少は揺れてしまいますが・・・割と実数に近い数値が表示されて、満足の行く物ができたと自分では思っています。

  • このエントリーをはてなブックマークに追加

関連記事

手作りLEDランタン

LEDランタン その2

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

記事を読む

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

Arduinoの消費電力

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

記事を読む

arduino 電圧計2

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

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

記事を読む

分圧回路へ接続

Arduinoで電圧計を作ってみる

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

記事を読む

LEDランタン

LEDランタンを作ってみる

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

記事を読む

Comment (2件)

  1. 虻川(あぶかわ)

    arudinoで電圧測定、大変勉強になります。
    arudinoで7segのLEDを行いたいにですが、
    プログラムの30行目 文字変換にする所で digitPos&amp; エラーが出て
    コンパイルできないので何か方法がありますか?
    ‘amp” was not declared in this scopeと出ます
    もしわかるようでしたら、お願いします。

    1. Futaba

      ご指摘ありがとうございます。
      &amp;の表示はhtmlエンティティで、&amp;=&のことを表しています。
      ブログのエディターの変換が原因で、&が&amp;に自動変換されてしまうようで、どうも失礼ました。
      とりあえず、修正しましたが、修正もれがあるかもしれません・・・

虻川(あぶかわ)さんに返信 キャンセル

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

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

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

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

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

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

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

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

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

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

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

PAGE TOP ↑