Arduino

Arduinoを使って7セグ表示器を点灯する

今回はLED点灯の応用的なこととして7セグ表示器を表示させたいと思います。7セグ表示器とは、十進数(0~9までの10個)を表示させる小さなディスプレイのことで7つのセグに電気信号(HIGHかLOW)を送って表示させます。デジタル時計の数字を表示させる機器です。

今回も2パターンの回路を作成します。1つ目は、2個のスイッチを使って0~3の数字を表示させる回路で、Arduinoは使いません。2つ目は、Arduinoを使い、スイッチを押したタイミングによってランダムな数字を表示させる回路です。

7セグ表示器

冒頭でも説明しましたが、7セグ表示器はディスプレイにある7つのセグを光らせることによって0~9の十進数を表すことが出来ます。

7セグ表示器には10個のピンがあり、二つは数字を表示するセグ用に7個、ドット表示用に1個、VccまたGND接続用に2つあります。今回使用する7セグ表示器はC-551SRDというものになります。

型番によって内蔵されるLEDが順方向なのか逆方向なのかがことなりますので、データシートを確認する必要があります。この型番は順方向向きです。

また、データシートを確認するとどのピンがどのセグに対応しているのかがわかります。この図からセグとの対応は以下の表のようになります。

A 7ピン
B 6ピン
C 4ピン
D 2ピン
E 1ピン
F 9ピン
G 10ピン
DP 5ピン
Vcc/GND 3ピン、8ピン

2つのスイッチを押して7セグを表示させる回路

ここでは2個のスイッチを使って4パターンの入力信号から、0~3の数字を表示させる回路を作ります。以下の4つの組合わせになります。

スイッチ1:OFF スイッチ2:OFF → 0
スイッチ1:OFF スイッチ2:ON  → 1
スイッチ1:ON スイッチ2:OFF → 2
スイッチ1:ON スイッチ2:ON  → 3

これらの組み合わせを満たす回路は一体どんな回路になるのでしょうか。ここからは論理演算の概念が必要となります。

論理演算

論理演算とは、真(True)と偽(False)の2値の真理値で行われる演算の事です。AND演算、OR演算、NOT演算を基本として多くの演算があります。これら基本の3つを簡単に説明します。

AND演算

AND演算とは、2値がそれぞれ真(True)の時に結果の真理値が真(True)となる演算です。よく×や・で表されます。例:A×B、A・B

OR演算

OR演算とは、2値のどちらが真(True)の時に結果の真理値が真(True)となる演算です。よくA+Bで表します。

NOT演算

NOT演算とは入力した真理値と反対の真理値を出力する演算です。よく~Aとあらわされます。

論理回路をつくる

本題に戻ります。2つのスイッチの入力によって出力するセグの表示を変えたいわけですが、数字を表示するには7つのセグをそれぞれ点灯・消灯をコントロールできればいいわけです。そこで、スイッチの押された状態と各セグの点灯状態をもとに論理演算をします。具体的には以下の表となります。

この真理値表をもとに各セグを表示する論理式を導きます。その結果が以下になります。

A=~X・~Y+X・~Y+X・Y=X(~Y+Y)+~X・~Y=X+~X・~Y=X+~Y
B=1
C=~X・~Y+~X・Y+X・Y=~X・~Y+Y(~X+Y)=~X・~Y+Y=~X+Y
D=~X・~Y+X・~Y+X・Y=~X・~Y+X(~Y+Y)=~X・~Y+X=X+~Y
E=~X・~Y+X・~Y=~Y(~X+X)=~Y
F=~X・~Y
G=X・~Y+X・Y=X(~Y+Y)=X

そして、この論理式を回路に組み込んだ回路図は以下になります。

入力回路部分はスイッチを使っていますが、論理回路部分は上記論理式を反映しています。

7セグ表示器の回路を組む

今回作成した7セグ表示の回路は以下の図のようになります。

7セグ表示器の回路を組みにあたって使用する、機器・端子は以下の表となります。

ブレッドボード 抵抗・ジャンパー線などを使って回路を作る基板
7セグ表示器 0~9の数字を表示できるディスプレイ
抵抗1kΩ 電圧を下げる端子
抵抗510Ω 電圧を下げる端子
タクトスイッチ ボタン押下による通電のスイッチ
ジャンパー線 電気を中継する線
電池ケース(単三4本) 5v用電源(実際は6v)
TC74HC08AP AND演算を行うIC
TC74HC32AP OR演算を行うIC
TC74HC14AP NOT演算を行うIC

7セグ表示器とVcc間の抵抗

7セグ表示器とVcc間の抵抗値を求めます。今回は電池4本を電圧としますので、1.5V×4本分の6VがVccになります。

7セグ表示器は冒頭でも説明した通り、ダイオードが使われています。このダイオードには電圧降下があり、20mAを流したいとしてデータシートを確認すると、1.8Vの順方向電圧がかかることがわかります。

Vccとダイオード間に設置する抵抗に係る電圧は6V-1.8V=4.2Vとなります。20mAの電流を流すためにはR=4.2V÷20mA=210Ω以上となります。

今回は私の手元に510Ωがたくさんあったのでこちらを使っています。210Ω以上であればいいです。

論理演算をするIC

論理演算をするためにICを使っていますので、簡単に紹介します。

TC74HC08AP

AND演算をするICになります。ひとつのICで4つのAND演算が出来ますが、必ずVccとGNDはつないでください。

TC74HC32AP

OR演算を行うICです。ひとつのICで4つのOR演算が出来ますが、必ずVccとGNDはつないでください。

TC74HC14AP

NOT演算を行うICです。ひとつのICで6つのNOT演算が出来ますが、必ずVccとGNDはつないでください。

回路の配線図

配線図は以下を参考にしてください。

実行結果

実行した結果は以下の動画をご覧ください。

Arduinoを使って7セグ表示器を光らせる

次にはArduinoを使って7セグ表示を光らせたいと思います。スイッチを一つ用意し、まずスイッチでディスプレイの点灯・消灯を制御します。そしてスイッチの押下に合わせてディスプレイ表示時にはランダムに0~9の数字を表示させる仕組みとします。

回路を組む

使用する機器・端子は以下の表をご確認ください。

Arduino 小型コンピュータ搭載のマイコン
ブレッドボード 抵抗・ジャンパー線などを使って回路を作る基板
7セグ表示器 0~9の数字を表示できるディスプレイ
抵抗1kΩ 電圧を下げる端子
抵抗510Ω 電圧を下げる端子
タクトスイッチ ボタン押下による通電のスイッチ
ジャンパー線 電気を中継する線

実際に組み立てた回路は下図になります。

配線は以下の配線図を参考にしてください。

プログラムコード

プログラムコードは以下になります。

const int BTN = 13;//スイッチを13番ピンに指定

//表示する数字に対応した7セグの信号
unsigned char seg[10][7] = {
{1,1,1,1,1,1,0},//0
{0,1,1,0,0,0,0},//1
{1,1,0,1,1,0,1},//2
{1,1,1,1,0,0,1},//3
{0,1,1,0,0,1,1},//4
{1,0,1,1,0,1,1},//5
{1,0,1,1,1,1,1},//6
{1,1,1,0,0,1,0},//7
{1,1,1,1,1,1,1},//8
{1,1,1,1,0,1,1} //9
};

int currentTime = 0;//基板が起動してから経過した時間を記憶
int value = 0; //スイッチの現在の値
int old_value = 0; //スイッチのひとつ前の値
int states = -1; //スイッチの押された状態(-1:押されていない、1:押された)
int num = -1; //ディスプレイに表示する数字

void setup() {
// put your setup code here, to run once:
pinMode(BTN,INPUT); //スイッチ用のピンのためINPUT
pinMode(2,OUTPUT); //LED用のピンのためOUTPUT
pinMode(3,OUTPUT); //LED用のピンのためOUTPUT
pinMode(4,OUTPUT); //LED用のピンのためOUTPUT
pinMode(5,OUTPUT); //LED用のピンのためOUTPUT
pinMode(6,OUTPUT); //LED用のピンのためOUTPUT
pinMode(7,OUTPUT); //LED用のピンのためOUTPUT
pinMode(8,OUTPUT); //LED用のピンのためOUTPUT
}

void loop() {
// put your main code here, to run repeatedly:
value = digitalRead(BTN); //スイッチを押されたかを確認

if(old_value == 0 && value == 1)
{
states = states * -1; //スイッチの状態を変更する

currentTime = millis(); //基板が起動してからの経過時間を取得
num = currentTime%10; //剰余でディスプレイに表示する数字を算出

delay(50); //バウシング対策
}else{
//処理なし
}

old_value = value; //現在のスイッチの値をひとつ前の値に移動

if(states > 0)
{
for(int i = 0; i < 7; i++)
{
digitalWrite(i + 2,seg[num][i]);//7つのセグに信号を送る
}

delay(50);

}else{

for(int i = 0; i < 7; i++)
{
digitalWrite(i + 2,LOW);//消灯させる
}

delay(50);
}

}

ここで予め配列を使って7セグのディスプレイに表示する数字とそれに対応した各セグの状態を表しています。具体的には数字0~9の10個を表すためにはA~Gの7セグのLOW,HIGHを用意しています。

//表示する数字に対応した7セグの信号
unsigned char seg[10][7] = {
{1,1,1,1,1,1,0},//0
{0,1,1,0,0,0,0},//1
{1,1,0,1,1,0,1},//2
{1,1,1,1,0,0,1},//3
{0,1,1,0,0,1,1},//4
{1,0,1,1,0,1,1},//5
{1,0,1,1,1,1,1},//6
{1,1,1,0,0,1,0},//7
{1,1,1,1,1,1,1},//8
{1,1,1,1,0,1,1} //9
};

また、ランダムに0~9の数字を表示させるためにmillis関数で求めた経過時刻を10で割り、その余りを求めています。

currentTime = millis(); //基板が起動してからの経過時間を取得
num = currentTime%10; //剰余でディスプレイに表示する数字を算出

実行結果

実行結果は以下の動画をご覧ください。

まとめ

今回は7セグ表示器を表示する回路についてご紹介しました。7セグ表示器は今後も色々な場面で活躍する端子ですので、しっかりとマスターをしていただければと思います。実際にArduinoを使わない場合と使った場合とを比較してみて感じましたが、Arduinoを使った方が配線もシンプルになりますし、作成するコストも下がって、プログラムで多くを制御できるため簡単と感じました。大学とかでは、マイコンを使って何かを制御することがないかもしれません。しかし、世の中にはこのようにマイコンという便利なものがあることを知っておけば、大学の講義なり実験でも、この部分をマイコンにしたらどうなるのかを考えるともっと楽しめるのではないかと思います。