7セグメントディスプレイをArduinoで光らせよう!シフトレジスタでのピンの増やし方
電子工作が趣味なAndroidエンジニアのとまとと申します。
Arduinoはなんでもできて便利ですが、制御ピンの数に限りがあります。そのため、ピンをたくさん使いたいときは困ってしまいますよね。
例えばLEDを100個くらい用意してそれぞれ一つずつパターンを決めて制御したいとき、当然ピンが足りなくなりますよね……。
そんなときのために制御ピンを増やすことができる方法を今回は紹介します!今回はたくさんのピンの制御が必要な7セグメントLEDディスプレイを少ないピンで光らせて見たいと思います。
準備するもの
今回はArduino Uno、7セグメントLEDに加えて、出力を増やすことのできるシフトレジスタや、スイッチングをすることのできるトランジスタを使って行きます。
小型3桁赤色7セグメントLED表示器 7mm高(2381BS)
7セグメントLEDは7個のLEDを八の字に組み合わせた電子部品で、それぞれのLEDを独立して制御することにより、数字などを表現することができます。
今回は2381BSという型番のものを使って行きます!
8ビットシフトレジスタ(74HC595)
シフトレジスタは、簡単に説明すると一つの出力を複数に増やすことのできる電子部品のことです。
マイコンボードのピンは個数が限られているので、複数のセンサ等を使いたいときはシフトレジスタを用いることにより、資源を有効に使うことができます。
また、シフトレジスタは出力を増やす以外にも複数の入力を1つにまとめることもできます。
トランジスタ(C1815) 8個
トランジスタには3本の端子があり、それぞれベース、コレクタ、エミッタと呼ばれます。コレクタ、エミッタ間を導通するかを、ベースに流すか流さないかで制御することができます。今回はこれをスイッチとして使います。
今回使うC1815は平らな面から見て左から順にエミッタ、コレクタ、ベースとなっています。
その他
配線してみよう
今回は初心者の方に取ってはあまり馴染みのないパーツも多いと思うので、それぞれ基本の回路の組み方から見ていきたいと思います。
とにかく7セグの回路が知りたい!と言う方は「7セグとトランジスタ、シフトレジスタの配線方法」の項目を見てみてください。
トランジスタの配線方法
まずはトランジスタの使い方から見てみます。
コレクタに制御したいピン(LEDなど)をつなぎ、ベースに制御するピン(Arduinoの13番など)をつなぎます。最後に、エミッタをGNDに繋げば回路の完成です。ベースのオンオフによってLEDをつけたり消したりすることができます。
シフトレジスタの配線方法
シフトレジスタの回路の組み方は次のようになります。
シフトレジスタの16番・10番を5Vに、13番・8番をGNDに繋いでいます。14、12、11番はそれぞれ、Arduinoの制御ピン(11、10、9番)に繋いでいます。
余ってる8つのピンをLEDのアノード(+)に繋ぎ、LEDのカソード(−)を抵抗を経由してGNDに繋げば完成です。
7セグとトランジスタ、シフトレジスタの配線方法
さて、いよいよ7セグを光らせてみましょう!回路は以下の図です。
配線がかなり多くなるので、短いジャンパを駆使するのがオススメです。
これで回路は完成です。
プログラムを書き込もう
では、次のプログラムをコピペしてArduino IDEを使ってボードに書き込みましょう!int num = 7
には光らせたい数字を代入します。
プログラムの仕様は回路の組み方によって変わるため、今回は同じように組んでください。
#define DATA 11
#define LATCH 10
#define CLOCK 9
// 0b10000000 DP
// 0b01000000 D
// 0b00100000 E
// 0b00010000 F
// 0b00001000 A
// 0b00000100 G
// 0b00000010 C
// 0b00000001 B
static const int num[] {
0b01111011, //ZERO
0b00000011, //ONE
0b01101101, //TWO
0b01001111, //THREE
0b00010111, //FOUR
0b01011110, //FIVE
0b01110110, //SIX
0b00001011, //SEVEN
0b01111111, //EIGHT
0b01011111, //NINE
};
int count;
void setup()
{
count = 0;
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop()
{
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, 8, num[count]);
digitalWrite(LATCH, HIGH);
delay(1000);
if (count == 9)
count = 0;
else
count++;
}
プログラムの解説
プログラムの一部を解説していきます。
#define DATA 11
#define LATCH 10
#define CLOCK 9
// 0b10000000 DP
// 0b01000000 D
// 0b00100000 E
// 0b00010000 F
// 0b00001000 A
// 0b00000100 G
// 0b00000010 C
// 0b00000001 B
static const int num[] {
0b01111011, //ZERO
0b00000011, //ONE
0b01101101, //TWO
0b01001111, //THREE
0b00010111, //FOUR
0b01011110, //FIVE
0b01110110, //SIX
0b00001011, //SEVEN
0b01111111, //EIGHT
0b01011111, //NINE
};
int count; // カウンタ
ここでは使うピンと、7セグを光らせるパターンの定義をしています。
void setup()
{
count = 0;
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
ここでは、Arduinoから出力をするピンを指定します。
void loop()
{
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, 8, num[count]);
digitalWrite(LATCH, HIGH);
delay(1000);
if (count == 9)
count = 0;
else
count++;
}
ここで、1、2、3番ピンを全てHIGHにしていますが、LOWに切り替えることにより各7セグを制御することができます。
表示したい数字の配列を読み込み、shiftOut()
で光らせたいLEDのピンを指定します。
LATCHピンをLOWにすることにより、shiftOut()
でデータを送ることができ、送信後HIGHにすることにより、実際にそれぞれのLEDを光らせることができます。
試してみる
上記のコードでint num = 7
を試してみると、このような感じで光らせることができます!
まとめ
シフトレジスタを用いた回路は電子工作をやりはじめた人には難しいかもしれませんが、初歩的なものの組み合わせでできているのでこの記事を見て試してみるのも面白いと思います。
また今回使ったシフトレジスタは一つだけでしたが、複数組み合わせて身近なLCDディスプレイやLEDキューブ、自作のロボットの制御などのようなものを実現することができます。考え方次第でなんでも作ることができると思います!
ぜひ試してみてください!