7セグメントLEDx4を使ってみる | 中華で始める Arduino入門日記15
こんにちは、のすけです。
中華で始める Arduino入門日記の15回目になります。
この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。
中華で始める Arduino入門日記1 はじめに「中華機を購入してみる」 - hollywis's diary (はりうすブログ)
今回のお題
今回は、7セグメントLEDを4つ付けたやつを利用してみたいと思います。
チュートリアルのchapter13に対応しています。
早速始めましょう。
7セグx4
こやつです。数字部分が4つに増えました。

裏にピンが12個あります。
数字部分が4つなので、7セグの10ピン*4で40ピンとかでは無いようです。安心しました。
1個との違い
中華キットに入っていたのが5461ASでしたので、データシートを探してみました。
データシート(5461AS)より

1個の数字の入力は基本的に同じようです。
ただしDIG1~4まであるので、あとはその表示をDIG1~4のどこを対象にするのかを指定するだけです。
つまり、DIGを指定する入力端子が4つ増痩せば良いということですね。
PINが全部で12あり、左下から反時計回りにPIN1~12となるようです。
pin12,9,8,6はDIG指定用で、11,7,4,2,1,10,5,3はLEDのa~gの表示に対応している模様

まずは、a~g部分(11,7,4,2,1,10,5,3ピン)を指す
前回とほぼ一緒なので、いきなり刺します。
こんな感じでしょうか。

プログラム的にはこんな感じになります。
int a=1; //LED 11pin
int b=2; //LED 7pin
int c=3; //LED 4pin
int d=4; //LED 2pin
int e=5; //LED 1pin
int f=6; //LED 10pin
int g=7; //LED 5pin
int dp=8; //LED3pin
残りはpin12,9,8,6ですな。
それぞれArduinoのデジタルpin9~12に刺します。
//DIG選択用
int d1 = 12; //LED12pin
int d2 = 11; //LED 9pin
int d3 = 10; //LED 8pin
int d4 = 9; //LED 6pin
プログラム
サンプルを参考にしつつアレンジしました。
まずは表示確認ということで、1,2,3,4を出してみます。
// 7セグメントLED x4の制御
int a=1; //LED 11pin
int b=2; //LED 7pin
int c=3; //LED 4pin
int d=4; //LED 2pin
int e=5; //LED 1pin
int f=6; //LED 10pin
int g=7; //LED 5pin
int dp=8; //LED3pin
//DIG選択用
int d1 = 12; //LED12pin
int d2 = 11; //LED 9pin
int d3 = 10; //LED 8pin
int d4 = 9; //LED 6pin
// すべて消す
void all_low(void)
{
unsigned char j;
for(j=1;j<=8;j++)
digitalWrite(j,LOW);
}
//display number 1
void digital_1(void)
{
all_low();
digitalWrite(c,HIGH);
digitalWrite(b,HIGH);
}
//display number2
void digital_2(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
}
// display number3
void digital_3(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
// display number4
void digital_4(void)
{
all_low();
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
// display number5
void digital_5(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
// display number6
void digital_6(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
}
// display number7
void digital_7(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
// display number8
void digital_8(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(b,HIGH);
}
// display number9
void digital_9(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
// display number0
void digital_0(void)
{
all_low();
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
digitalWrite(c,HIGH);
digitalWrite(b,HIGH);
}
// display point
void dispDec(void)
{
digitalWrite(dp, LOW);
}
void pickDigit(int x) {
//DIGの選択
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
delayMicroseconds(55);
switch(x)
{
case 1:
digitalWrite(d1, LOW); break;
case 2:
digitalWrite(d2, LOW); break;
case 3:
digitalWrite(d3, LOW); break;
case 4:
digitalWrite(d4, LOW); break;
default:
digitalWrite(d4, LOW); break;
}
}
void pickNumber(int x) {
switch(x)
{
case 1:
digital_1(); //1
break;
case 2:
digital_2();
break;
case 3:
digital_3();
break;
case 4:
digital_4();
break;
case 5:
digital_5();
break;
case 6:
digital_6();
break;
case 7:
digital_7();
break;
case 8:
digital_8();
break;
case 9:
digital_9();
break;
case 0:
digital_0();
break;
default:
digital_0();
}
}
long n=0;
int x = 100;
int del =155; //delay time
void setup()
{
int i;//define i
for(i=1;i<=12;i++)
pinMode(i,OUTPUT);//set pin1~pin12 output
}
void loop()
{
pickDigit(1);
pickNumber(1);
delayMicroseconds(del);
pickDigit(2);
pickNumber(2);
delayMicroseconds(del);
pickDigit(3);
dispDec();
pickNumber(3);
delayMicroseconds(del);
pickDigit(4);
pickNumber(4);
delayMicroseconds(del);
n++;
}
1234の結果
やはり一筋縄ではいかない。
どうやらひとつ前の残像が残ってしまい、1,2,3,4が重なっているようです。

いろいろと試行錯誤をした結果
数字の選択の前に、all_low()を入れて数値のリセットを入れると良いことが判明
そうすると綺麗に表示されました。
void loop()
{
all_low();
pickDigit(1);
pickNumber(1);
delayMicroseconds(del);
all_low();
pickDigit(2);
pickNumber(2);
delayMicroseconds(del);
all_low();
pickDigit(3);
dispDec();
pickNumber(3);
delayMicroseconds(del);
all_low();
pickDigit(4);
pickNumber(4);
delayMicroseconds(del);
}

7セグメントLEDはdelayの差し込み具合とかがシビアで、ちょっと使いにくいです。
次回は「74HC595」を使います。
