11月26日発売 書籍『わかる!電子工作』にArduinoで動かす4足歩行ロボットを掲載して頂きました!

【Arduino入門編㉔】Arduinoで7セグメントLEDを制御してみよう!(スタティック制御 / ダイナミック制御)

Arduinoを使った電子工作で数字や文字などを表示させる事が出来るデバイスはいろいろとあります。

Arduino入門編記事としてこれまでLCDディスプレイに文字を表示させる方法をご紹介しました。
パラレル接続では多くの信号線を接続する必要がありましたが、I2C通信を使うことにより非常に少ない信号線のみでディスプレイに表示させることが出来ました。

【Arduino入門編⑱】I2C通信の基礎!LCDディスプレイに文字を表示させてみる![後編]

今回は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の制限抵抗に関してはこちらの記事も参考にして下さい。

【Arduino入門編①】ArduinoでLEDを点滅(Lチカ)させてみる!Arduinoの基本となるデジタル出力の解説その①

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のデジタルピンの使い方に関してはこちらを参考にして下さい。

【Arduino入門編②】複数のLEDを点滅(Lチカ)させてみる!デジタル出力の解説その②

スケッチ①解説

Arduinoのデジタルピンを使い対応するLEDを点灯させ数字を表示させるだけの最も簡単なスケッチとなります。
今回アノードコモンタイプの7セグメントLEDを使っているので、デジタルピンをLOWにすることにより対応するLEDを点灯させています。

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:消灯)

ABCDEFG
1111110
0110000
1101101
1111001
0110011
1011011
1011111
1110000
1111111
1111011

7セグメントLEDの点灯パターンはこのように決まっているので、これを配列として定義すれば上記スケッチを短く簡素化する事が出来ます。

スケッチ②解説

7セグメントLEDの点灯パターンは各数字で決まっているので、このパターンを配列を使い処理しています。
この部分がそれにあたります。

そしてそのA~GのLEDはそれぞれデジタルピン2~8に繋がっているので、for文を使いdigitalWrite関数でそれぞれのLEDを点灯させています。
今回アノードコモンタイプの7セグメントLEDを使っているので点灯させたい場合はLOW(つまり0)、消灯させたい場合はHIGH(1)と反転しているので、digitalWrite(i, !number0[i-2]);で反転させています。

7セグメントLEDに内蔵されている各LEDは配置が決まっていて数字を表示させる時の組み合わせは決まっているので、配列を使った方がスケッチはスッキリしますね!
やっていることは上記スケッチ①と同様、デジタルピンの単純な制御をしているだけです。

スケッチ③

同様な考え方で2列の配列を使えばスケッチはもっとシンプルになります。

桁数を増やす(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と加算され表示されていきます。

スケッチ解説

LEDの点灯レイアウトは先程と同じように配列で定義しています。
あとはタクトスイッチを押した時だけ数値を加算しています。
このあたりはスイッチによるON/OFF判定となりArduinoのデジタルピンを使った基本的な使い方なので以下の記事も参考にして下さい。

【Arduino入門編⑦】ジョイスティックの制御方法!デジタル・アナログ入力の解説です!
【Arduino入門編⑤】プルアップ・プルダウンって何?デジタル入力の解説です!

state変数に格納された数値をタクトスイッチを押すごとに加算します。
%(余剰)を使い1の位と10の位に数値を分解しています。

そしてこの部分がダイナミック制御で交互に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だけとなります。

これを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ボードは、互換ボードの中でも非常にクオリティーが高いのでおすすめです!

【ELEGOO Arduino Uno】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の点灯方法には他にもシフトレジスタを使った表示方法やシリアルドライバ内蔵のモジュールなどもあり、これらを使えばより少ない配線で接続する事もできます。
これらの制御方法についても今後ご紹介できればと思います。

コメントを残す