7セグメントLEDのお稽古をする。意味のあるなしはどうだってよろしい。レッツゴー。
私は古株ぶっているが、実は若い頃に7セグLEDを扱ったことがない。子供の頃の電子工作はもっぱらラジオなどのトランジスタ回路、長じてからは仕事関係で5極真空管やマイクロ波の発振管などを扱っていた。
数値表示のためには、その頃の仕事関係では「ニキシー管」という数値表示のための真空管を扱っていた。これは放電管で、数字の形をした陰極が赤く光るものだ。
そういうわけで、7セグLEDを知らないのである。いや、無論、当時から7セグメントLEDは世の中にあったが、私の職場が特殊だったのである。
で、これが昨日秋月電子八潮店で買ってきた、1個60円の7セグLEDである。
OSL10561-IRA
さて、まずは点灯からだ。データシートから、抵抗と電流っ。
各素子……とあるから、として、
……まず、200Ωばかりつけておいてやればよいのだろう。この前買った集合抵抗の手持ち、8素子9ピンで330Ωのがあるから、それを付ければ多少暗いが10mA前後で光るだろう。
さっそく、全点灯で光らせてみよう。単に電源をくれてやって、抵抗に結線するだけだ。
回路図
光らせてみると、計算上の抵抗の倍近い抵抗値なのに、なかなかどうして、結構明るく光る。
単純全点灯で光らせてみたところ
次に、Arduinoをつないで、数字を表示させる。全点灯で電流を測ってみると67mAほど流れているので、電源はこのまま別建てのほうがいいだろう。
アノードコモンのLEDであるから、カソード側で制御しなければならない。集合抵抗では一本づつ制御できないので、330Ωの電流制御抵抗をバラで8本とりつける。それぞれの足をArduinoのデジタル2ピンから9ピンまで取り付ける。
スケッチをこう書く。点灯のパターンは配列に書くのが手早いだろう。
//
// 7segmentLED_1.ino
// 7セグメントLEDを1個動かす。
// 27.08.10(月) 1300~
// 佐藤俊夫
//
// LED「OSL10561-IRA」
// LED 1 -> Digital 2
// LED 2 -> Digital 3
// LED 4 -> Digital 4
// LED 5 -> Digital 5
// LED 6 -> Digital 9
// LED 7 -> Digital 8
// LED 9 -> Digital 7
// LED10 -> Digital 6
//
void setup() {
for(int i = 2; i <= 9; i++){
pinMode(i, OUTPUT);
}
}
void loop() {
for(int i = 0; i <= 9; i++){
lighting(i);
delay(1000);
}
}
void lighting(int n){
const int pat[10][8] = {
{ LOW, LOW, LOW, HIGH, HIGH, LOW, LOW, LOW}, // 0
{HIGH, HIGH, LOW, HIGH, HIGH, HIGH, HIGH, LOW}, // 1
{ LOW, LOW, HIGH, HIGH, LOW, HIGH, LOW, LOW}, // 2
{HIGH, LOW, LOW, HIGH, LOW, HIGH, LOW, LOW}, // 3
{HIGH, HIGH, LOW, HIGH, LOW, LOW, HIGH, LOW}, // 4
{HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH}, // 5
{ LOW, LOW, LOW, HIGH, LOW, LOW, LOW, HIGH}, // 6
{HIGH, HIGH, LOW, HIGH, HIGH, LOW, LOW, LOW}, // 7
{ LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW}, // 8
{HIGH, LOW, LOW, HIGH, LOW, LOW, LOW, LOW} // 9
};
int i = 0;
for(i = 0; i <= 7; i++){
digitalWrite(i + 2, HIGH);
}
for(int i = 0; i <= 7; i++){
digitalWrite(i + 2, pat[n][i]);
}
}
アノードコモンなので、論理は負論理だ。
Arduinoとブレッドボードをこういうふうにする。
動かすと、ゆっくりカウントアップする。