Arduinoを使った電子工作で数字や文字などを表示させる事が出来るデバイスはいろいろとあります。
Arduino入門編記事としてこれまでLCDディスプレイに文字を表示させる方法をご紹介しました。
パラレル接続では多くの信号線を接続する必要がありましたが、I2C通信を使うことにより非常に少ない信号線のみでディスプレイに表示させることが出来ました。
今回は7セグメントLEDに数字を表示させてみたいと思います。
7セグメントLEDは7セグLEDなどと呼ばれることも多い表示デバイスとなり、デジタル時計などでもよく使われていることからみなさんよく目にする事が多いと思います。
この7セグメントLEDは内部に7つのLEDが内蔵されていて、その点灯により0から9までの数字やアルファベットを表示させる事が出来る表示デバイスとなります。
数字表示に特化した単純なデバイスとなりますが、Arduinoで制御する場合の点灯方法はいろいろな方法が使われます。
今回はこの7セグメントLEDをArduinoで制御することを目的に話を進めていきます。
目次
Arduinoを使って7セグメントLEDを制御してみる!
7セグメントLEDとは?
7セグメントLEDは内部に7つのLEDが8の字のように内蔵された表示デバイスとなり、その点灯位置により0~9までの数字やまたはいくつかのアルファベットを表示させる事が出来るデバイスとなります。
7つのLEDの並びでそれらを表示させることから7セグメントLEDや7セグLEDなどと呼ばれているものとなります。
まわりを見渡せばいろんな電化製品に使われているのでみなさんもうご存知だと思います。
置き時計の時間表示や電子工作でよく使われる安定化電源の表示パネルなどにも使われています。
市販されている7セグメントLEDには、その点灯色や桁数など様々なタイプのものが販売されています。
このように4桁表示や2桁表示タイプのものなどいろいろとあります。
内部構造は非常に簡単です。
1桁につき7つのLEDが8の字に配置されていて、それらの点灯位置により数字を表示させるというものとなっています。
ほとんどの7セグメントLEDには「ドット(小数点を表すDP)」をさせるためのLEDが組み込まれているので、正確には8個のLEDが内蔵されています。
単純なLEDの点灯により数字を表示させているだけなので、これまでのArduino入門編記事を見て頂いていれば点灯させるだけなら非常に簡単です。
LEDの点灯なので電流制限抵抗を使いそれぞれのLEDをArduinoのデジタルピンに繋ぎ、そのON/OFFによって点灯表示させることが出来ます。
先述のように7つのLED(ドット表示を入れると8個)のLEDを点灯させるので、Arduino側では7つ(または8つ)のデジタルピンと接続して制御する形が基本となります。
今回は最も基本となる1桁表示の7セグメントLEDをArduinoに接続し数字を表示させてみたいと思います。
そしてその応用として2桁表示ではどのような方法で点灯させるかなども見ていきたいと思います。
Arduino(こちらではArduino Unoを使って説明していきます)のデジタルピンには数に限りがありあまり多くありません。
2桁や3桁の数字を表示させたりと複数の7セグメントLEDを接続し表示させる場合、Arduinoで使えるデジタルピンが足りなくなってきます。
シフトレジスタを使って少ないデジタルピンの数で表示させたりと、その表示方法はいろいろとあります。
それらの話は今後ご紹介出来ればと思います。
そして今回は1桁表示の最も基本となる7セグメントLEDを表示させその基本を理解することを今回の目的としたいと思います。
7セグメントLEDの内部構造
7セグメントLEDには、数字を表示させる部分に7つとドット(小数点)表示部に1つのLEDの合計8個のLEDが内蔵されています。
この8個のLEDの点灯・消灯により0~9までの数字またはアルファベットを表示させています。
そして重要となってくるのが、7セグメントLEDには『アノードコモン』タイプと『カソードコモン』タイプの2種類があります。
「コモン(Common)」とは「共通」という意味があり内部に接続されているLEDの接続方法によりこの2つのタイプの7セグメントLEDがあります。
ピン配列
7セグメントLEDには合計10本の端子(ピン)が付いています。
そして各LEDには上から時計回りにA~GとD.P(ドット)という名称が割り振られています。
7セグメントLEDの上下に配置されているピン番号は下から反時計回りに1~10番と割り振られています。
そして3番と8番ピンがCom(共通)となるアノードまたはカソードとなっており、これが基本的なピン配列となります。
例えばAの部分を点灯させたい場合、7セグメントLEDの7番ピンと3番ピンまたは8番ピンのcom端子に繋げば点灯させることが出来るということになります。
アノードコモン
まずアノードコモンタイプの7セグメントLEDです。
内部の接続図はこのようになっています。
全てのLEDのアノード(プラス側)が内部で接続されています。
LEDのアノード側が共通で接続されているのでArduinoとの接続はこのようになります。
アノード側に電源を取り付け、カソード側に電流制限抵抗を付けArduinoのデジタルピンに接続して使います。
接続図を見て分かる通りアノード側に電源が繋がりカソード側をArduinoのデジタルピンに接続しているので、制御方法としてはArduinoのデジタルピンをLOWにした時にLEDに電流が流れ点灯します。
またHIGHにした場合、LEDは消灯します。
LOWとHIGHの動作とLEDの点灯・消灯が反転しているので少し分かりづらいですね!
Arduinoのデジタルピン | LEDの状態 |
LOW | 点灯 |
HIGH | 消灯 |
カソードコモン
対してカソードコモンタイプの7セグメントLEDではカソード側(マイナス側)が内部で共通となり接続されています。
そのためアノードコモンとは逆の制御方法となります。
ArduinoのデジタルピンをHIGHにするとその出力される電流によりLEDが点灯する形となります。
Arduinoのデジタルピン | LEDの状態 |
LOW | 消灯 |
HIGH | 点灯 |
制御方法としては、デジタルピンをHIGHにして電流を流すことによりLEDを点灯させるカソードコモンタイプの方が制御するイメージはしやすいかと思います。
しかし一般的には?アノードコモンタイプで点灯させる事の方が多いようです。
少し話がそれてしまいますが、アノードコモンの場合5Vなどの電源をLEDのアノードと接続しArduinoのデジタルピンをLOWに落とすことによりLEDを点灯させています。
つまりアノードコモンタイプのLEDでは、Arduinoに電流を吸い込む(シンク電流といいます)形で点灯させています。
それに対してカソードコモンタイプのLEDでは、ArduinoのデジタルピンをHIGHにする事によりそこから出力される電流をLEDに流し点灯させています。
ArduinoなどICチップに吸い込みで流す電流を「シンク電流」と呼ぶのに対して、カソードコモンでは吐き出す電流で点灯させています。
これをソース電流といいます。
電子工作用途で楽しむには、カソードコモンタイプの7セグメントLEDを使った方が制御も感覚的に分かりやすいと思います。
使用用途により使い分ければいいのですが、一般的にはArduinoなどのマイコンでは吐き出すソース電流よりも吸い込むシンク電流の方が多くの電流を流すことが出来ます。
またアノードコモンで流すシンク電流では外部電源からの供給となるのでマイコンの動作も安定しやすくなるようですね。
今回は手元に多数あったアノードコモンタイプの7セグメントLEDを使って説明していきたいと思います。
アノードコモンタイプ or カソードコモンタイプでは、上記のように接続方法が少し違いますがArduinoの制御としてはスケッチを少し修正するだけなので使いやすい方を選ばれるのがいいかと思います。
接続
それでは7セグメントLEDをArduinoに接続し実際に点灯させ数字を表示させてみたいと思います。。
今回アノードコモンタイプの7セグメントLEDを使っているので、アノード側はArduinoの5V出力端子から電源を取ることにします。
そして各LEDのカソード側はArduinoのデジタルピンと接続しますが、その際に電流制限抵抗を付けておく必要があります。
抵抗値の計算は簡単なオームの法則で求めることが出来ます。
LEDの制限抵抗に関してはこちらの記事も参考にして下さい。
LEDはその点灯色や製品により定格値が異なっています。
詳しくは購入した製品のデータシートを確認しLEDの定格電圧や定格電流などから抵抗値を計算します。
ここでは一般的なLEDの値を使って計算してみます。
- 電源電圧(V):5V(Arduinoの出力端子を使います)
- LEDの順方向電圧(VF):2V(LEDにかかる電圧)
- LEDの順方向電流(IF):20mA(LEDに流したい電流)
上記から抵抗値Rは、
R=V/I=(5-2)/0.02A=150Ωとなります。
今回150Ωの抵抗を使うことにします。
流れる電流を少なくすれば定格を超えることはないので、実際にはこれより高い値の抵抗を選んでおけば問題ありません!(~1kΩくらいで問題ないかと思います)
抵抗値が決まれば7セグメントLEDとArduinoの接続です。
単純に7個のLEDをArduinoのデジタルピンにそれぞれ繋げるだけなので接続は簡単ですが、7セグメントLEDのピン配列は初めてだと少し分かりにくいのでもう一度見ておきます。
LEDのA~G(ドットは今回使いません)をデジタルピン2~8の順に接続しました。
7セグメントLEDの3番ピンと8番ピンは、アノード(またはカソード)となります。
今回アノードコモンタイプのものを使っているので3番ピンと8番ピンはアノードとなりArduinoの5V出力端子に繋ぎます。
3番ピン・8番ピンどちらの端子を使っても問題ありません。
スケッチ①
それでは最も簡単で分かりやすいスケッチで7セグメントLEDを点灯させてみたいと思います。
このようなスケッチを作ってみました。
それぞれLEDに接続されたデジタルピンを出力(OUTPUT)に設定し、デジタルピンのHIGH or LOWでLEDの消灯・点灯をさせるという簡単なものです。
0.5秒おきに数字を0~9の表示を繰り返します。
Arduinoのデジタルピンの使い方に関してはこちらを参考にして下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | // Arduino入門編㉔ 7セグメントLEDを制御する① // https://burariweb.info // 7セグメントLED配列 // A(D2) // ------- // F(D7)| |B(D3) // | G(D8) | // ----- // | | // E(D6)| |C(D4) // ------- .DP // D(D5) const int ASeg = 2; const int BSeg = 3; const int CSeg = 4; const int DSeg = 5; const int ESeg = 6; const int FSeg = 7; const int GSeg = 8; void setup() { pinMode(ASeg, OUTPUT); pinMode(BSeg, OUTPUT); pinMode(CSeg, OUTPUT); pinMode(DSeg, OUTPUT); pinMode(ESeg, OUTPUT); pinMode(FSeg, OUTPUT); pinMode(GSeg, OUTPUT); } void loop() { zero(); delay(500); one(); delay(500); two(); delay(500); three(); delay(500); four(); delay(500); five(); delay(500); six(); delay(500); seven(); delay(500); eight(); delay(500); nine(); delay(500); } // LED表示関数の定義 // 0を表示 void zero() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, LOW); digitalWrite(FSeg, LOW); digitalWrite(GSeg, HIGH); } // 1を表示 void one() { digitalWrite(ASeg, HIGH); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, HIGH); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, HIGH); digitalWrite(GSeg, HIGH); } // 2を表示 void two() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, HIGH); digitalWrite(DSeg, LOW); digitalWrite(ESeg, LOW); digitalWrite(FSeg, HIGH); digitalWrite(GSeg, LOW); } // 3を表示 void three() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, HIGH); digitalWrite(GSeg, LOW); } // 4を表示 void four() { digitalWrite(ASeg, HIGH); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, HIGH); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, LOW); digitalWrite(GSeg, LOW); } // 5を表示 void five() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, HIGH); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, LOW); digitalWrite(GSeg, LOW); } // 6を表示 void six() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, HIGH); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, LOW); digitalWrite(FSeg, LOW); digitalWrite(GSeg, LOW); } // 7を表示 void seven() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, HIGH); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, HIGH); digitalWrite(GSeg, HIGH); } // 8を表示 void eight() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, LOW); digitalWrite(FSeg, LOW); digitalWrite(GSeg, LOW); } // 9を表示 void nine() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, HIGH); digitalWrite(FSeg, LOW); digitalWrite(GSeg, LOW); } |
スケッチ①解説
Arduinoのデジタルピンを使い対応するLEDを点灯させ数字を表示させるだけの最も簡単なスケッチとなります。
今回アノードコモンタイプの7セグメントLEDを使っているので、デジタルピンをLOWにすることにより対応するLEDを点灯させています。
60 61 62 63 64 65 66 67 68 | void zero() { digitalWrite(ASeg, LOW); digitalWrite(BSeg, LOW); digitalWrite(CSeg, LOW); digitalWrite(DSeg, LOW); digitalWrite(ESeg, LOW); digitalWrite(FSeg, LOW); digitalWrite(GSeg, HIGH); } |
Arduinoのデジタルピンの基本的な使い方で点灯させることが出来ました。
Arduino入門編記事としては分かりやすいスケッチですが、少し長いのでもう少し工夫してスケッチを書き直してみたいと思います。
7セグメントLEDの数字の点灯パターンは決まっています。(アノードコモンとカソードコモンでHIGHとLOWが反転しますが)
例えば数字の0ならLED A(HIGH)・LED B(HIGH)・LED C(HIGH)・LED D(HIGH)・LED E(HIGH)・LED F(HIGH)・LED G(LOW)といった感じですね。
上記スケッチではこのHIGHとLOWの組み合わせを毎回デジタルピンのHIGH/LOWの組み合わせで表示させていますが、次に簡素化するために配列を使うとスケッチがスッキリします。
スケッチ②
次に上記と全く同じ動作をするものを配列を使いスケッチを書き換えてみます。
まずはLEDの点灯パターンを確認しておきます。
7セグメントLEDに内蔵されている各LEDの配置をもう1度見てみましょう。
数字の点灯パターンをまとめるとこのようになります。(1:点灯,0:消灯)
A | B | C | D | E | F | G | |
1 | 1 | 1 | 1 | 1 | 1 | 0 | |
0 | 1 | 1 | 0 | 0 | 0 | 0 | |
1 | 1 | 0 | 1 | 1 | 0 | 1 | |
1 | 1 | 1 | 1 | 0 | 0 | 1 | |
0 | 1 | 1 | 0 | 0 | 1 | 1 | |
1 | 0 | 1 | 1 | 0 | 1 | 1 | |
1 | 0 | 1 | 1 | 1 | 1 | 1 | |
1 | 1 | 1 | 0 | 0 | 0 | 0 | |
1 | 1 | 1 | 1 | 1 | 1 | 1 | |
1 | 1 | 1 | 1 | 0 | 1 | 1 |
7セグメントLEDの点灯パターンはこのように決まっているので、これを配列として定義すれば上記スケッチを短く簡素化する事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | // Arduino入門編㉔ 7セグメントLEDを制御する② // https://burariweb.info // 7セグメントLED配列 // A(D2) // ------- // F(D7)| |B(D3) // | G(D8) | // ----- // | | // E(D6)| |C(D4) // ------- .DP // D(D5) // LEDレイアウトの配列を定義 int number0[]={1,1,1,1,1,1,0}; // 0 int number1[]={0,1,1,0,0,0,0}; // 1 int number2[]={1,1,0,1,1,0,1}; // 2 int number3[]={1,1,1,1,0,0,1}; // 3 int number4[]={0,1,1,0,0,1,1}; // 4 int number5[]={1,0,1,1,0,1,1}; // 5 int number6[]={1,0,1,1,1,1,1}; // 6 int number7[]={1,1,1,0,0,0,0}; // 7 int number8[]={1,1,1,1,1,1,1}; // 8 int number9[]={1,1,1,0,0,1,1}; // 9 int i; void setup() { for (int i=2; i<=8; i++){ pinMode(i, OUTPUT); // D2~D8を出力に } } void loop() { for (int i=2; i<=8; i++){ // 0を表示 digitalWrite(i, !number0[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 1を表示 digitalWrite(i, !number1[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 2を表示 digitalWrite(i, !number2[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 3を表示 digitalWrite(i, !number3[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 4を表示 digitalWrite(i, !number4[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 5を表示 digitalWrite(i, !number5[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 6を表示 digitalWrite(i, !number6[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 7を表示 digitalWrite(i, !number7[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 8を表示 digitalWrite(i, !number8[i-2]); } delay(500); for (int i=2; i<=8; i++){ // 9を表示 digitalWrite(i, !number9[i-2]); } delay(500); } |
スケッチ②解説
7セグメントLEDの点灯パターンは各数字で決まっているので、このパターンを配列を使い処理しています。
この部分がそれにあたります。
15 16 17 18 19 20 21 22 23 24 25 | // LEDレイアウトの配列を定義 int number0[]={1,1,1,1,1,1,0}; // 0 int number1[]={0,1,1,0,0,0,0}; // 1 int number2[]={1,1,0,1,1,0,1}; // 2 int number3[]={1,1,1,1,0,0,1}; // 3 int number4[]={0,1,1,0,0,1,1}; // 4 int number5[]={1,0,1,1,0,1,1}; // 5 int number6[]={1,0,1,1,1,1,1}; // 6 int number7[]={1,1,1,0,0,0,0}; // 7 int number8[]={1,1,1,1,1,1,1}; // 8 int number9[]={1,1,1,0,0,1,1}; // 9 |
そしてそのA~GのLEDはそれぞれデジタルピン2~8に繋がっているので、for文を使いdigitalWrite関数でそれぞれのLEDを点灯させています。
今回アノードコモンタイプの7セグメントLEDを使っているので点灯させたい場合はLOW(つまり0)、消灯させたい場合はHIGH(1)と反転しているので、digitalWrite(i, !number0[i-2]);で反転させています。
38 39 40 41 | for (int i=2; i<=8; i++){ // 0を表示 digitalWrite(i, !number0[i-2]); } delay(500); |
7セグメントLEDに内蔵されている各LEDは配置が決まっていて数字を表示させる時の組み合わせは決まっているので、配列を使った方がスケッチはスッキリしますね!
やっていることは上記スケッチ①と同様、デジタルピンの単純な制御をしているだけです。
スケッチ③
同様な考え方で2列の配列を使えばスケッチはもっとシンプルになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | // Arduino入門編㉔ 7セグメントLEDを制御する③ // https://burariweb.info // 7セグメントLED配列 // A(D2) // ------- // F(D7)| |B(D3) // | G(D8) | // ----- // | | // E(D6)| |C(D4) // ------- .DP // D(D5) // LEDレイアウトの配列を定義 boolean number[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,0,0}, // 7 {1,1,1,1,1,1,1}, // 8 {1,1,1,1,0,1,1} // 9 }; void setup() { for (int i=2;i<=8;i++){ pinMode(i,OUTPUT); // D2~D8を出力に } } void loop(){ for(int i=0; i<=9; i++){ NumberPrint(i); delay(500); } } // LED表示関数を定義 void NumberPrint(int j){ for(int i = 0; i <= 6; i++){ digitalWrite(i + 2, !number[j][i]); } } |
桁数を増やす(2桁表示)
以上が最も基本的な7セグメントLEDの制御方法となります。
1つの7セグメントLEDを点灯させるのに合計7本(ドットも入れると8本)のデジタルピンがArduino側で必要となってきました。
それでは2つ、または3つと表示させる7セグメントLEDの数を増やしていくとどうなるでしょうか?
そうなると今回使っているArduino Unoでは使えるデジタルピンの数が足りなくなってきます。
7セグメントLEDにはシリアルドライバなどが内蔵され少ない信号線で制御出来るものもあります。
一般的にはこのようなシリアル信号線での接続やシフトレジスタを使って制御した方が少ないデジタルピンで多くの桁数の7セグメントLEDを制御する事が出来ます。
今回は7セグメントLEDを使ったArduino学習の基礎を理解する事を目的としているので、少し工夫して2つの7セグメントLEDを制御してみたいと思います。
ダイナミック制御
7セグメントLEDの内部で接続されているLEDは、カソードまたはアノードが共通となって接続されていることは分かりましたね。
それではArduinoで余っているデジタルピンを使いこの出力をそれぞれの7セグメントLEDの制御に使えば上手くいくのでは・・・
ここからはダイナミック制御と呼ばれる制御方法を使って2つの7セグメントLEDを点灯させてみたいと思います。
接続図を見た方が分かりやすいので先に紹介します。
このような接続になります。
タクトスイッチを押し数字を0から99までカウントアップさせ表示させるものとなります。
各7セグメントLEDのピンA~Gは、それぞれ共通のデジタルピンで制御しています。
1桁目の7セグメントLEDに追加する2桁目を単純に並列で接続しています。
これまでと違う所は、Arduinoの5V出力端子から電源を取っていたアノード(3番ピン or 8番ピン)がデジタルピンと繋がれているという点です。(D12ピン・D13ピンに繋いでいます)
新たに追加したこの2本のデジタルピンの出力で7セグメントLEDを点灯させ、そのHIGHとLOWでどちらの7セグを点灯させるか切り替えて使おうというものです。
しかしそれぞれの7セグメントLEDのA~Gは並列して繋いでいるので、制御するデジタルピンで切り替えることが出来ても同じ数字が表示されそうですが・・・
ここからがダイナミック制御と呼ばれるものとなります。
先程まで行ってきたスケッチ①~③は7セグメントLEDの個数分デジタルピンに配線をしてそれぞれのLEDを点灯・消灯することにより表示させていました。
直感的で分かりやすい接続でしたが、7セグメントLEDの数が増えると配線も多くなりArduinoで使用するデジタルピンも多くなってしまう欠点があります。
このような接続による制御をスタティック制御と呼びます。
それに対して上記接続ではダイナミック制御による点灯をさせようとしています。
上記回路図を見て分かるようにA~Gを並列して接続しているので7セグメントLEDが2つに増えてもその接続に必要なArduino側のデジタルピンの数は変わっていません。(切り替え用で2本増えていますが)
そしてどのような制御をやろうとしているかというと、新たに増えた制御用のデジタルピンを使い2つの7セグメントLEDを高速に点灯・消灯をさせるというものです。
7セグLED①が点灯中は7セグ②は消灯、7セグ①が消灯中は7セグ②が点灯・・・この状態を高速で繰り返すことにより、人間の目では両方が点灯しているように見えるというものです。
そして7セグLED①が点灯している時は数字の1の位を表示させ、同様に7セグLED②が点灯している時は10の位を表示させ・・・これを交互に高速で繰り返すことによりあたかも2つの7セグメントLEDが同時に点灯しているかのように見えます。
このような制御をダイナミック制御と言いますが、増えるデジタルピンの数はそれぞれのLEDを点灯(制御)するためのデジタルピンが2本増えるだけと、これまでやってきたスタティック制御と比べ少ない配線で複数の7セグメントLEDを点灯させることが出来ます。
スケッチ
理屈が理解しやすようにタクトスイッチを使った数字の加算を行ってみます。
スイッチを押すごとに数値が0~99と加算され表示されていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | // Arduino入門編㉔ 7セグメントLEDを制御する④ // https://burariweb.info // 7セグメントLED配列 // A(D2) // ------- // F(D7)| |B(D3) // | G(D8) | // ----- // | | // E(D6)| |C(D4) // ------- .DP // D(D5) // LEDレイアウトの配列を定義 boolean number[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,0,0}, // 7 {1,1,1,1,1,1,1}, // 8 {1,1,1,1,0,1,1} // 9 }; const int SW_PIN = 11; // スイッチピンをD11 const int Seg1_PIN = 12; // 1桁目の7セグLED制御ピンをD12 const int Seg2_PIN = 13; // 2桁目の7セグLED制御ピンをD13 int SW_state = 1; // スイッチの状態(プルアップしているので1ではOFF) int SW_state_before = 1; // 以前のスイッチの状態 int state = 0; // 現在の数値(0~99) int state_1 = 0; // 1桁目の数値(1の位) int state_2 = 0; // 2桁目の数値(10の位) void setup(){ Serial.begin(9600); // シリアル通信の開始 for (int i=2; i<=8; i++){ pinMode(i,OUTPUT); // D2~D8を出力に } pinMode(SW_PIN, INPUT_PULLUP); // SW_PINをプルアップ入力に設定 pinMode(Seg1_PIN, OUTPUT); // 7セグ制御(切り替え)ピンを出力に設定 pinMode(Seg2_PIN, OUTPUT); } void loop(){ SW_state = digitalRead(SW_PIN); // スイッチの状態を読み取る if((SW_state == LOW) && (SW_state_before == HIGH)) { // スイッチの変化を確認 state = (state+1) % 100; // stateに1加算(剰余演算子を使い0~99までを繰り返す) state_2 = state /10 % 10; // 10の位の計算 state_1 =state %10; // 1の位の計算 } SW_state_before = SW_state; // 以前のスイッチの状態を記憶 digitalWrite(Seg1_PIN,HIGH); // 1桁目の7セグをON digitalWrite(Seg2_PIN,LOW); // 2桁目の7セグをOFF NumPrint(state_1); // 1桁目の7セグに数字を表示(1の位) delay(5); digitalWrite(Seg1_PIN,LOW); // 1桁目の7セグをOFF digitalWrite(Seg2_PIN,HIGH); // 2桁目の7セグをON NumPrint(state_2); // 2桁目の7セグに数字を表示(10の位) delay(5); Serial.println(state); // シリアルモニタに数値を表示 } //LED表示関数を定義 void NumPrint(int Number){ // LEDに表示させる関数の定義 for (int i = 0; i <= 6; i++){ digitalWrite(i + 2, !number[Number][i]); } } |
スケッチ解説
LEDの点灯レイアウトは先程と同じように配列で定義しています。
あとはタクトスイッチを押した時だけ数値を加算しています。
このあたりはスイッチによるON/OFF判定となりArduinoのデジタルピンを使った基本的な使い方なので以下の記事も参考にして下さい。
state変数に格納された数値をタクトスイッチを押すごとに加算します。
%(余剰)を使い1の位と10の位に数値を分解しています。
58 59 60 61 62 | if((SW_state == LOW) && (SW_state_before == HIGH)) { // スイッチの変化を確認 state = (state+1) % 100; // stateに1加算(剰余演算子を使い0~99までを繰り返す) state_2 = state /10 % 10; // 10の位の計算 state_1 =state %10; // 1の位の計算 } |
そしてこの部分がダイナミック制御で交互に2つの7セグメントLEDをON/OFFさせている部分となります。
Seg1_PINをHIGH/Seg2_PINをLOWにする事により7セグメントLED①に1の位の数字を表示させています。
同様にSeg1_PINをLOW/Seg2_PINをHIGHにし7セグ②に10の位の数字を表示させます。
実際の動作は、7セグLED①が点灯している時は7セグLED②は消灯、7セグLED①が消灯している時は7セグLED②が点灯し同時に点灯しているのは1つの7セグLEDだけとなります。
66 67 68 69 70 71 72 73 74 | digitalWrite(Seg1_PIN,HIGH); // 1桁目の7セグをON digitalWrite(Seg2_PIN,LOW); // 2桁目の7セグをOFF NumPrint(state_1); // 1桁目の7セグに数字を表示(1の位) delay(5); digitalWrite(Seg1_PIN,LOW); // 1桁目の7セグをOFF digitalWrite(Seg2_PIN,HIGH); // 2桁目の7セグをON NumPrint(state_2); // 2桁目の7セグに数字を表示(10の位) delay(5); |
これをdelay()関数を使い5msという高速で繰り返すことにより2つの7セグメントLEDが同時に点灯しているように見えるということです。
このような制御方法をダイナミック制御と呼びます。
試しにdelay(5)の部分をdelay(50)などに変更して動かしてみて下さい。
2つの7セグメントLEDがチカチカと点滅し、交互にON/OFFされていることが認識できると思います。
今回のポイント
- 7セグメントLEDは単純なLEDの集まりなのでArduinoのデジタルピンを使い制御する事が出来る!
- スタティック制御では直感的で分かりやすい反面、接続する7セグメントLEDの数が増えるとArduino側の使用するデジタルピンが多くなり足りなくなる場合がある !
- ダイナミック制御では高速にLEDの点灯・消灯を繰り返して同時に複数の7セグメントLEDが点灯しているように見せ、限られたArduinoのデジタルピンでもやりくりすることが出来る!
今回使ったアイテム
7セグメントLED(1桁)
7セグメントLEDは非常に安価な価格で販売されています。
点灯色や桁数、アノードコモン・カソードコモンなど様々なタイプのものがあります。
下記で紹介しているArduinoスターターキットにも数個付属していました。
抵抗
電子工作でLEDを点灯させる場面は多く出てきます。
その際に制限抵抗が必要となり、またそれ以外にも最も使われるパーツとなるのでこのようなセットものを1つ買っておくと便利かと思います。
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数販売されています。
互換品でも正規品と比べて特に問題なく使用でき安価なためArduino学習用としていいと思います。
Elegoo製のArduinoボードは、互換ボードの中でも非常にクオリティーが高いのでおすすめです!
Arduino スターターキット
これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。
最後に!
7セグメントLEDは内部にある7つのLEDを点灯させて数字を表現するものとなり、その基本的な制御自体はArduinoのデジタルピンを使って簡単に表示させることが出来ることが分かりました。
そしてスタティック制御では直感的で分かりやすい配線となりますが、接続する7セグメントLEDの数が増えるとデジタルピンの数が足りなくなる場合があります。
その欠点を補う方法としてダイナミック制御での点灯方法もあり理解できたかと思います。
これが基本的な7セグメントLEDの制御方法となり、これらを理解できれば今回の目的は達成です!
7セグメントLEDの点灯方法には他にもシフトレジスタを使った表示方法やシリアルドライバ内蔵のモジュールなどもあり、これらを使えばより少ない配線で接続する事もできます。
これらの制御方法についても今後ご紹介できればと思います。
コメントを残す