できること

Arduinoで7セグメントディスプレイ(7セグLED)を制御する

Device PlusではArduinoでLEDを使った電子工作を紹介しています。

Arduinoなどのマイコンデバイスは動かしているだけでは状態を確認できないため、LEDによって内部で何が起こっているかをユーザーに伝えられるようにすると便利です。とはいえ、単なるLEDだと点灯・点滅など表示パターンも限られるため、LEDの表現パターンにも限りがあります。
そこで今回は7個のLEDが組み合わさった「7セグメントディスプレイ」と呼ばれる電子部品を紹介します。

この7セグメントディスプレイは数字の表示に特化したLEDで、デジタル時計にもよく使用されるので皆さんもたびたび目にしていると思います。7セグメントディスプレイは数字だけではなく、いくつかのアルファベットも表示できるのでスケッチからユーザーにメッセージを伝えることもできるでしょう。
本記事では7セグメントディスプレイをArduinoに接続して0から9までの数字を表示する実験をしながら使い方を解説します。

 

how-to-add-digital-numerical-display-to-project-01

2個並んだ7セグメントディスプレイ

 

目次

  1. 7セグメントディスプレイの仕組み
  2. Arduino+SevSegで7セグメントディスプレイの制御
  3. 準備
  4. スケッチ全体
  5. 配線
  6. まとめ

 

1. 7セグメントディスプレイの仕組み

7セグメントディスプレイ」はパネル上に棒状の7個のLEDが「数字の(角張った)8の字」のように縦横に並んだ電子部品です。「7セグLED」「LEDディスプレイ」とも呼ばれます。
パネル上の7個のLEDは、それぞれ単体のLEDと同様に点灯/消灯できるので、この点灯パターンで「0」から「9」までの数字やいくつかのアルファベットを表現できます。
7セグメントディスプレイで表示することができる文字はこちらで確認してください。

ほとんどの7セグメントディスプレイは、7個のLEDのほかに「ドット(小数点)」を表すためのLEDが追加された計8個のLEDで構成されています。
さらに、この7セグメントディスプレイ何個か横並びに組み合わせた製品もあり、数字を表示する電子機器の製作を手軽にします。
本記事では7セグメントディスプレイの基本的な使用方法を解説するため、「7個のLED(8の字)とドット」で構成されるシンプルな7セグメントディスプレイを使用します。

7セグメントディスプレイを選定する際には「数字が何個並んでいるか?」という外観だけでなく、「アノードコモン」「カソードコモン」の2種類の電気的な仕様の違いにも注意する必要があります。ちなみに、「コモン(common)」とは日本語で「共通の」と訳されます。

アノードコモン7セグメントディスプレイに実装されている8個(7個+ドット)のLEDのアノードが内部で接続されています。「全てのアノードが共通化されている」という意味でアノードコモンです。
7セグメントディスプレイの内部のLEDも、通常のLEDと同じようにアノード(長い端子)を電源側に、カソード(短い端子)をグランド側に接続します。LEDを使用する際は流れる電流を制限する必要があり、通常のLEDの場合は「電源 === アノード」間、「カソード === グランド」間のどちらかに抵抗を挿入します。

アノードコモンの7セグメントディスプレイの内部では、全てのLEDのアノードが接続されて1本の端子になっているため、こちら側を電源に接続、またカソードは別々の端子8本につながるため抵抗を通してグランドに接続します。
LEDの点灯/消灯を制御するには「カソード === 抵抗 === Arduinoの出力ピン」と接続します。

カソードコモンアノードコモンの逆になり、7セグメントディスプレイ内部の全てのLEDではカソードが1本の端子にまとまっています。「全てのカソードが共通化されているのでカソードコモン」です。この1本にまとまったカソードの端子をグランドに接続、またアノードは別々の端子8本につながるため電源から抵抗を通してそれぞれに接続します。
LEDの点灯/消灯を制御するには「Arduinoの出力ピン === 抵抗 === アノード」と接続します。

8個のLED(7個+ドット)が実装されているタイプの7セグメントディスプレイには端子が9本あります。AからGまでの7本とDP、COMの計9本です。
7セグメントディスプレイのLEDは「8の字」状に7本並んでいますが、「8の字」の上(横)がA、右上(縦)がB、右下(縦)がCと時計回りにFまで、「8の字」の中央(横)がGの端子につながります。また、「ドット(小数点)」を表すLEDはDPの端子です。カソードコモンの場合は8個のLED(7個+ドット)のアノードが、アノードコモンの場合はカソードがA〜G・DPの端子につながります。
COM端子には、カソードコモンの場合は8個のLED(7個+ドット)全てのカソードが、アノードコモンの場合は全てのアノードがつながります。

複数の7セグメントディスプレイを並べて数桁の数字を表現する場合、もしくは横並びに組み合わせた製品を使用して数桁を表示する場合は、各桁の8個のLED(7個+ドット)の端子(A〜G・DP)は、それぞれ共通のArduinoボードのピンに接続します。

例えば2桁の数字表現する場合は「10の位の端子A1と1の位の端子A2をArduinoボードの2番ピンに接続」となります。また、この場合「10の位の端子COMはArduinoボードの12番ピン」「1の位のCOMは13番ピン」というように別々のArduinoボードのピンに接続します。こうすることで、より少ない数のArduinoボードのピン数で7セグメントディスプレイを制御することができます。

「どの端子が7セグメントディスプレイ内部のどのLEDに接続されているのか?」などは製品によって異なる場合があるので必ず各製品のデータシートで確認してください。
また、「アノードコモンカソードコモンどちらの7セグメントディスプレイか?」についてもデータシートに記載されています。

 

2. Arduino+SevSegで7セグメントディスプレイの制御

スケッチから見た7セグメントディスプレイの制御は複数並んだLEDの点灯/消灯と変わりません。
しかし数字やアルファベットを表現するための点灯パターンをスケッチに実装するのは大変です。
そこで本記事はスケッチから7セグメントディスプレイを制御するための「SevSeg」と呼ばれるライブラリを使用します。

このライブラリは複数個並べた7セグメントディスプレイの制御にも対応しています。

それではArduino IDEにSevSegをインストールすることから始めましょう。

SevSegはこちらからダウンロードしてください。
ダウンロードが完了したらArduino IDEを起動し
[スケッチ] ≫ [ライブラリをインクルード] ≫ [zip形式のライブラリをインストール]
を選択します。
githubからダウンロードしたzipファイルを指定してください。
以上でSevSegが使用できます。

 

3. 準備

以下のものを用意してください。

Arduino Uno

図4

 

Arduino IDE

how-to-add-rgb-led-strip-to-home-lighting-03

 

7セグメントディスプレイ
アノードコモン

how-to-add-digital-numerical-display-to-project-02

 

抵抗
330Ω×8本(LEDの破損防止用)

how-to-add-digital-numerical-display-to-project-03

 

ブレッドボード

how-to-add-digital-numerical-display-to-project-04

 

上記に加えてブレッドボード用のジャンパーワイヤ、USBケーブルが必要です。

 

4. スケッチ全体

以下がスケッチ全体です。スケッチのあとに解説が続きます。

#include "SevSeg.h"
SevSeg digit; 

void setup(){
    byte numDigits = 1;
    byte digitPins[] = {1};
    byte segmentPins[] = {3, 2, 8, 7, 6, 4, 5, 9};
    bool resistorsOnSegments = true;

    byte hardwareConfig = COMMON_ANODE; 
    digit.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
    digit.setBrightness(90);
}

void loop(){
    for (int i = 0;i < 10;i++){
        digit.setNumber(i);
        digit.refreshDisplay();
        delay(1000);
    }
}

ポイントを説明します。

以下はスケッチ先頭の2行です。

#include "SevSeg.h"
SevSeg digit; 

1行目はライブラリのインクルードです。SevSegライブラリはArduino IDEにインストールするだけでは有効になりません。include文でライブラリを有効にしてから使用します。
2行目はSevSegオブジェクトの作成です。以降、Arduinoボードに接続した7セグメントディスプレイは変数digitを通して制御します。

setup()関数です。

void setup(){
    byte numDigits = 1;
    byte digitPins[] = {1};
    byte segmentPins[] = {3, 2, 8, 7, 6, 4, 5, 9};

    bool resistorsOnSegments = true;

    byte hardwareConfig = COMMON_ANODE; 
    digit.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
    digit.setBrightness(90);
}

ここでは、Arduinoボードに接続する7セグメントディスプレイに合った設定を行います。
設定はbegin()関数で行います。

引数は順に
「使用する7セグメントディスプレイカソードコモンアノードコモンのどちらか?」
「桁数は?(7セグメントディスプレイが何個横並びになっているか?)」
「各桁のCOM端子はArduinoボードの何番ピンにつながるか?(ピン番号の配列)」
「各桁のA〜G・DP端子はArduinoボードの何番ピンにつながるか?(ピン番号の配列)」
「電流制限用の抵抗がA〜G・DP端子につながっているか?(COM端子の場合はfalse)」
を意味します。

3番目の引数は桁数分のピン番号を指定します。最も左の桁が先頭です。
4番目の引数はA〜G・DPの順にピン番号を指定します。
詳細はSevSegのドキュメント(英語)を参照してください。
最後にsetBrightness()関数でLEDの明るさを指定します。

loop()関数です。

void loop(){
    for (int i = 0;i < 10;i++){
        digit.setNumber(i);
        digit.refreshDisplay();
        delay(1000);
    }
}

ここでは、for文を使用して0から9までの数字を7セグメントディスプレイに表示しています。
最初にsetNumber()関数で表示したい数字をSevSegに指定します。指定した数字に表示を切り替えるのがrefreshDisplay()関数です。
delay()関数で1秒を指定しているので、数字は1秒ごとに切り替わります。
この動作はloop()関数が呼び出されるごとに繰り返されます。

 

5. 配線

今回はアノードコモン7セグメントディスプレイを1個(1桁)使用します。
アノードコモンなので、COM端子は内部にある8個のLED(7個+ドット)全てのアノードにつながります。

最初にCOM端子をArduinoボードの1番ピンに接続します。これはsetpu()関数内でbegin()に指定した「各桁のCOM端子は……?」の
byte digitPins[] = {1};
と一致している必要があります。

続いて各LEDのカソードにつながるA〜G・DPの端子を以下のように接続します。
こちらもbegin()に指定した「各桁のA〜G・DP端子は……?」の
byte segmentPins[] = {3, 2, 8, 7, 6, 4, 5, 9};
と一致している必要があります。

  • 7セグメントディスプレイのA端子をArduinoボードの3番ピンに接続
  • 7セグメントディスプレイのB端子をArduinoボードの2番ピンに接続
  • 7セグメントディスプレイのC端子をArduinoボードの8番ピンに接続
  • 7セグメントディスプレイのD端子をArduinoボードの7番ピンに接続
  • 7セグメントディスプレイのE端子をArduinoボードの6番ピンに接続
  • 7セグメントディスプレイのF端子をArduinoボードの4番ピンに接続
  • 7セグメントディスプレイのG端子をArduinoボードの5番ピンに接続
  • 7セグメントディスプレイのDP端子をArduinoボードの9番ピンに接続

配線は以上です。
完了したらArduinoボードとパソコンをUSBケーブルで接続してください。
7セグメントディスプレイが1秒ごとに0から9まで繰り返し点灯すれば成功です。
点灯しない場合は7セグメントディスプレイのデータシートで「どの端子が内部のどのLEDに接続されているのか?」を確認してください。

how-to-add-digital-numerical-display-to-project-05

基板に実装された7セグメントディスプレイ(イメージ)

 

6. まとめ

Arduinoの状態を確認するのにLEDの点灯状態でステータスを表現するのも良いアイデアですが、今回説明した7セグメントディスプレイを使用すれば、より詳細に状況を表現できます。
7セグメントディスプレイは一見すると配線が複雑ですが、7セグメントディスプレイの内部の接続状況が記されてあり、8個のLEDをArduinoから制御するのと変わらないことがわかるでしょう。
ぜひお試しください。

アバター画像

エレクトロニクスやメカトロニクスを愛するみなさんに、深く愛されるサイトを目指してDevice Plusを運営中。

https://deviceplus.jp

学生ロボコン2019出場ロボット解剖計画