フタなしカンヅメ

徒然なるままに @happytar0

7セグLEDの3桁表示に挑戦

前回の記事で1桁の7セグ表示することができたので、今回は3桁点灯させてみることにした。
3桁点灯させるにはトランジスタが必要ということで、いよいよトランジスタを使うことになる。

ここでトランジスタやダイナミックドライブについて調べていくと、
ATMEGA328PのI/Oピンは最大40mAなので、カソードコモンをマイコンに接続すると最大電流量を越えてしまうようだ。

各セグメント10mAで8本、合計80mA流すと、カソード側が80mAになる。
これを回避するためにトランジスタを使うらしく、少ない電流から大きい電流に増幅出来るので、最大40mAを超えないで制御できるそうだ。

トランジスタを使う

とにかくトランジスタを使ってみることにした。
使うトランジスタはNPN型の2SC1815GRというものだ。
他にPNP型というものもあるようだけど、今回はカソードコモンの7セグなので出番はないようだ。

トランジスタには、コレクタ、ベース、エミッタという3本の足があり、ベースに電流を流すことで、エミッタに増幅された電流が流れていくらしい。
この増幅率をhFEというようだ。

エミッタを7セグのコモン端子に繋ぎ、ベースにマイコンのPB0〜2ポートへと繋ぐ。
また、エミッタとベース間には安定化させるための抵抗10kΩ、ベースとマイコンポート間には4.7kΩを繋ぐ。

以前にすでに計算しているのだけど、マイコンとトランジスタ間に繋ぐ電流制限抵抗値は、以下のようにして計算した。

このトランジスタの電流増幅率(hFE)は100で、
トランジスタを通すことによって0.7Vほど電圧降下がすることを考慮して、以下ように計算した。
(5V - 0.7V) * 100hFE / 100mA = 4.3kΩ
4.3kΩに近い4.7kΩの抵抗を使うこととした。

ダイナミックドライブさせる

3桁の7セグを高速で切り替えることで、3桁とも点灯しているように見せるのが、ダイナミックドライブ(ダイナミック点灯)と言うらしい。

表示する桁のポートにビットを立てながら切り替えるだけなので、コードはさほど難しくなかった。
下記のように関数を作って、表示したい桁と数字(ドットなど)を指定できるようにした。

#define DIG_MAX 3
#define NUM_MAX 11

void showNumber(char dig, char num) {
  char nums[] = {0b00111111, 0b00000110, 0b01011011, 0b01001111,
    0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111,
    0b01101111, 0b10000000};

  if (dig < DIG_MAX && num < NUM_MAX) {
    PORTB = 1 << dig;

    if (num == -1) {
      PORTD = 0b00000000;
    }
    else {
      PORTD = nums[num];
    }
  }
}

3桁順番に数字などを表示させてみた。配線が汚くて恥ずかしい…。
f:id:happytar0:20130204043707j:plain

今回のコードはこちら
pontago/avr-7SegLed3Dig · GitHub

参考
今から始めるAVR #2 ATtiny2313 7セグ4桁ボード〜そこ(7セグ)んとこ、詳しく