4-digit LED

4桁のLEDを使って、タイマーを作りたい。
まずは4桁LEDの使い方を確認した。

 

1.4桁LEDの接続

4桁LEDは上下に6つずつのピンが付いている。
下段の左から右に1-6、上段の右から左に7-12と番号が付いている。

f:id:spinspine:20170131211205p:plain


12、9、8、6番は4桁それぞれのスイッチになっている。

f:id:spinspine:20170131211324p:plain

番号に対応したセグメントが光る。

f:id:spinspine:20170131211347p:plain

一桁の時はカソードピンがあって、GNDに繋いだのだが、4桁にはそれがない。
12,9,8,6の桁表示用のピンをカソードとして使うってこと?

5461AS(4桁LED)のデータシート
http://www.topliteusa.com/uploadfile/2014/0825/A-5461AS.pdf

5161AS(1桁LED)のデータシート
http://www.dipmicro.com/?datasheet=TOS-5161AS.pdf

7セグメントLEDにはコモンカソードのものとコモンアノードのものがあり、多くは品番に「C」とか「A」とか入ってて見分けられるらしいが、上の二つは「A」があるけどカソードということでいいらしい。
http://thomas.bibby.ie/using-the-kyx-5461as-4-digit-7-segment-led-display-with-arduino/

2.電流の計算

接続の仕方をネットで検索すると、そのまま接続するとボードが壊れてしまうので、トランジスタを入れた方がいいらしい。しかし自分にはこの話がよく分からなかったので整理したい。

4桁LEDの順電流はセグメントあたり30mAとある。
(1桁の7セグメントLEDは各セグメントあたり20mAだった)

Arduino UNOは1ピンあたり20mAしか流せない。
スペック通りに考えれば、合計で30×8セグメント=240mAの電流を供給する必要があり、力不足になってしまう。
しかしI/Oピンを各セグメントに接続すると、20×8ピン=160mAはあるので、まあ大丈夫な気がする。暗くなるだけじゃないの。

一方で、Arduinoボードに規定以上の電流を流すと壊れてしまう。
アナログ/デジタルピンなどのI/Oピンの許容は最大40mA、VCCとGNDピンは最大200mAとなっている。
http://playground.arduino.cc/Main/ArduinoPinCurrentLimitations

なのでそもそも、240mAどころか160mAをそのままピンにつないでもArduinoボードが壊れてしまう可能性がある。
カソードになるI/Oピンに流れる電流を40mAに抑えるには、40÷8セグメント=5mAになるように抵抗を入れる必要があり、5V÷0.005A=1000Ωを各出力ピンに挟めばいい。

こうすればトランジスタは必要ないが、電流量は小さいのでLEDはさらに暗くなる。
LEDをもっと明るくする場合は抵抗を低くしてピンあたりの電流を増やす必要があり、するとピンの許容を超える電流を流すことになるので、それを保護するためにトランジスタを入れるということらしい。

f:id:spinspine:20170208213043p:plain

ダイナミック点灯とは、複数のLEDを同時に光らせるのではなく、高速に切り替えることによって同時に光っているように見せる方法だ。

よって一瞬で考えれば一桁ずつしか光らないので、四桁の場合でも一桁分(40mA)だけ供給すればいい(たぶん)。

 

3.実際に点灯させてみる

よく分からないのはカソードの扱いだが、とりあえずArduino UNOの1-8のI/OピンをセグメントA-Gに出力、9-12のI/Oピンを桁表示(12,9,8,6)の端子に接続して出力(!)する下記のコードを実行。※テストのため、セグメントはBとCだけ

youtu.be

const int digit_1 = 9;//9番ピンを1桁目に
const int digit_2 = 10;//10番ピンを2桁目に
const int digit_3 = 11;//11番ピンを3桁目に
const int digit_4 = 12;//12番ピンを4桁目に
const int LED_B = 2;//2番ピンをセグメントBに
const int LED_C = 3;//3番ピンをセグメントCに
void setup(){ //全てのピンを出力に設定 pinMode(digit_1, OUTPUT);
pinMode(digit_2, OUTPUT);
pinMode(digit_3, OUTPUT);
pinMode(digit_4, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(LED_C, OUTPUT);
} void loop(){
digitalWrite(digit_1, HIGH);//LEDをオフにする
digitalWrite(digit_2, HIGH);
digitalWrite(digit_3, HIGH);
digitalWrite(digit_4, HIGH);
delay(1000);
digitalWrite(digit_1, LOW);//千の桁に1を表示
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, HIGH);
delay(1000);
digitalWrite(digit_2, LOW);//百の桁に1を表示
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, HIGH);
delay(1000);
digitalWrite(digit_3, LOW);//十の桁に1を表示
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, HIGH);
delay(1000);
digitalWrite(digit_4, LOW);//一の桁に1を表示
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, HIGH);
delay(1000);
}

つまりArduinoのI/Oピンは5Vを出力するだけでなく、オンオフ切替可能なGNDにもなるということか。二つのI/Oピンを繋いで、どちらも「HIGH」(あるいはどちらも「LOW」)の時は双方の電圧に差が生じないので電流は流れず、どちらかが「LOW」(あるいは「HIGH」)になれば流れるようになる。

ということは、上のコードの「LOW」と「HIGH」を全て逆にしても電流は流れるはずだが、LEDはダイオードなので一方向にしか電流を流さない。