こんにちは、のすけです。

中華で始める Arduino入門日記の15回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

今回は、7セグメントLEDを4つ付けたやつを利用してみたいと思います。

チュートリアルのchapter13に対応しています。

早速始めましょう。

7セグx4

こやつです。数字部分が4つに増えました。

f:id:hollywis:20151211165528j:plain

裏にピンが12個あります。
数字部分が4つなので、7セグの10ピン*4で40ピンとかでは無いようです。安心しました。

1個との違い

中華キットに入っていたのが5461ASでしたので、データシートを探してみました。

データシート(5461AS)より
f:id:hollywis:20151211163345p:plain

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の表示に対応している模様

f:id:hollywis:20151211155027j:plain

まずは、a~g部分(11,7,4,2,1,10,5,3ピン)を指す

前回とほぼ一緒なので、いきなり刺します。

こんな感じでしょうか。

f:id:hollywis:20151211165726j:plain

プログラム的にはこんな感じになります。

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が重なっているようです。

f:id:hollywis:20151211174145j:plain

いろいろと試行錯誤をした結果

数字の選択の前に、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);
}

f:id:hollywis:20151211180916j:plain

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

次回は「74HC595」を使います。

Receive the latest news in your email
Table of content
Related articles