部品 · 読了まで6分

7セグメントディスプレイの使い方:Arduinoで数字を表示する、アノードコモンとカソードコモンの違い

7セグメントディスプレイはどう動くのか。セグメントの記号(a〜g、dp)、カソードコモンとアノードコモン、ピン配置と抵抗、0〜9を数えるコード、4桁ディスプレイとダイナミック点灯、TM1637モジュール、ESP32とPicoを解説します。

7セグメントディスプレイは、数字の「8」の形に並べた7本の棒状のLEDと小さな点でできたシンプルな表示器です。デジタル時計、電子レンジのタイマー、スコアボード、ガソリンスタンドの給油機などに使われています。安くてとても明るく、遠くからでも読みやすいのが特長です。Arduinoのプロジェクトでは、カウンター、サイコロ、ストップウォッチ、時計を作るための定番の出力部品のひとつです。

1桁の7セグメントディスプレイ
1桁の7セグメントディスプレイ:7本の棒状のセグメントと点(dp)があります。ピンは10本で、下に5本、上に5本並んでいます。

7セグメントディスプレイはどう動く?

セグメントにはアルファベットの名前が付いています。上のaから時計回りに、b(右上)、c(右下)、d(下)、e(左下)、f(左上)と続き、真ん中の棒がg、点がdpです。各セグメントは実際にはそれぞれ独立したLEDで、どれを点けるかによって違う数字ができます。たとえば「1」ではbとcだけが点き、「8」では7本すべてが点きます。

数字点灯するセグメント
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

カソードコモンかアノードコモンか?

RGB LEDと同じく、すべてのセグメントの片側は共通ピンにまとめられています。カソードコモンのディスプレイでは共通ピンをGNDにつなぎ、セグメントにHIGHを与えると点きます。アノードコモンのディスプレイでは共通ピンを5Vにつなぎ、セグメントにLOWを与えると点きます。外から見ると同じなので、どちらかを調べるには、共通ピンをGNDにつなぎ、セグメントのピンを220 Ωの抵抗を通して5Vに当ててみます。セグメントが点けばカソードコモンです。点かなければ、接続を逆にしてもう一度試してください。

項目カソードコモン(CC)アノードコモン(CA)
共通ピン(3と8)GND5V
セグメントを点けるにはHIGHLOW
コードではdigitalWrite(pin, 点灯)digitalWrite(pin, !点灯)

ピン配置とArduinoへの配線

一般的な10ピンの1桁ディスプレイでは、表示面を手前に向けたとき、左下から反時計回りにピン番号が振られています。真ん中の2本のピン(3と8)が共通端子で、内部でつながっています。下の表は、ディスプレイのピンと、この記事のコードで使うArduinoのピンの両方を示しています。

ディスプレイのピンセグメントArduinoのピン
7aD2
6bD3
4cD4
2dD5
1eD6
9fD7
10gD8
5dpD9
3と8共通GND(カソードコモン)または5V(アノードコモン)
セグメントごとに専用の抵抗を付けてください(5 Vなら220〜330 Ω)。共通ピンに抵抗を1本だけ付けると、点いているセグメントの数で電流が分けられるため、「1」はとても明るく、「8」は暗く見えます。抵抗値の計算にはLED抵抗ツールを使ってください。

Arduinoで0から9まで数える

各数字でどのセグメントを点けるかをビットとして配列に保存すると、コードが短くなります。下の例では、各バイトのいちばん左のビットがセグメントa、いちばん右のビットがセグメントgです。showDigit()関数はこれらのビットを1つずつ読み取ってピンに書き込みます。アノードコモンのディスプレイを使う場合は、COMMON_ANODEをtrueにするだけです。

C++ (Arduino IDE)
1const int SEG_PINS[7] = {2, 3, 4, 5, 6, 7, 8};   // a, b, c, d, e, f, g
2const bool COMMON_ANODE = false;                 // ortak anotsa true / true for common anode
3
4// her rakam için a–g segmentleri (1 = yanar) / a–g segments per digit (1 = on)
5const byte DIGITS[10] = {
6  0b1111110, // 0
7  0b0110000, // 1
8  0b1101101, // 2
9  0b1111001, // 3
10  0b0110011, // 4
11  0b1011011, // 5
12  0b1011111, // 6
13  0b1110000, // 7
14  0b1111111, // 8
15  0b1111011  // 9
16};
17
18void showDigit(int n) {
19  for (int i = 0; i < 7; i++) {
20    bool on = DIGITS[n] & (1 << (6 - i));       // a en soldaki bit / a is the leftmost bit
21    digitalWrite(SEG_PINS[i], COMMON_ANODE ? !on : on);
22  }
23}
24
25void setup() {
26  for (int i = 0; i < 7; i++) pinMode(SEG_PINS[i], OUTPUT);
27}
28
29void loop() {
30  for (int n = 0; n <= 9; n++) {
31    showDigit(n);
32    delay(1000);
33  }
34}
このコードにボタンを加えれば、押すたびに1ずつ増えるカウンターや、ランダムな数字を出す電子サイコロを作れます。ボタンの配線とチャタリングについてはArduinoに押しボタンをつなぐ方法で解説しています。

4桁ディスプレイとダイナミック点灯

4桁の7セグメントディスプレイ
4桁の7セグメントディスプレイ:8本のセグメント線は4桁すべてで共有され、各桁には専用の選択ピンもあります。合計12ピンです。

4桁のディスプレイには、32本の独立したセグメントピンがあるわけではなく、ピンは12本だけです。全桁で共有する8本のセグメント線(a〜gとdp)と、どの桁を点けるかを選ぶ4本のピンです。セグメント線が共有されているので、同じ瞬間に桁ごとに違う数字を表示することはできません。解決策はダイナミック点灯(マルチプレクス)です。1桁目だけを数ミリ秒点け、次に2桁目、3桁目、4桁目と点けていきます。このサイクルを1秒に50回より速く繰り返すと、目には4桁すべてが同時に点いているように見えます。このスキャンを自分で書くより、SevSegライブラリを使うほうがずっと簡単です。

C++ (Arduino IDE)
1#include "SevSeg.h"
2
3SevSeg sevseg;
4
5void setup() {
6  byte digitPins[] = {2, 3, 4, 5};                    // hane seçme pinleri / digit select pins
7  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};  // a, b, c, d, e, f, g, dp
8  sevseg.begin(COMMON_CATHODE, 4, digitPins, segmentPins, true);  // dirençler segmentlerde / resistors on segments
9  sevseg.setBrightness(90);
10}
11
12void loop() {
13  sevseg.setNumber(millis() / 1000);   // geçen saniye / elapsed seconds
14  sevseg.refreshDisplay();             // sürekli çağrılmalı / must be called continuously
15}
ダイナミック点灯のディスプレイでは、loop()の中でdelay()を使わないでください。スキャンが止まり、最後の桁だけが点いたままになります。時間の管理はmillis()で行い、refreshDisplay()が絶えず呼ばれるようにしてください。

TM1637モジュール:2本の線だけで4桁

TM1637 4桁7セグメントディスプレイモジュール
TM1637モジュール:内部のドライバチップがスキャンを担当します。CLK、DIO、VCC、GNDの4本のピンだけで接続できます。

12本の配線と絶え間ないスキャンが大変そうなら、TM1637モジュールがおすすめです。ドライバチップがダイナミック点灯を自分で行い、ArduinoはCLKとDIOピンを通してどの数字を表示するかを伝えるだけです。ほとんどの製品には、時計を作るための真ん中のコロン(:)もあります。ライブラリマネージャからAvishay Orpaz作のTM1637ライブラリをインストールしてください。下のコードは、コロン付きで分と秒を表示します。

C++ (Arduino IDE)
1#include <TM1637Display.h>
2
3TM1637Display display(2, 3);   // CLK, DIO
4
5void setup() {
6  display.setBrightness(5);    // 0–7
7}
8
9void loop() {
10  int minutes = (millis() / 60000) % 60;
11  int seconds = (millis() / 1000) % 60;
12  // ortadaki iki noktayla dakika:saniye / minutes:seconds with the colon
13  display.showNumberDecEx(minutes * 100 + seconds, 0b01000000, true);
14  delay(200);
15}

ESP32とRaspberry Pi Picoで7セグメントディスプレイを使う

1桁のディスプレイはESP32やPicoに直接つなげます。ピンの出力が3.3 Vなのでセグメントが少し暗くなるため、100〜150 Ωのような小さめの抵抗を使ってください。TM1637モジュールも3.3 Vで動き、ESP32では同じArduinoのライブラリで使えます。MicroPythonを使うPicoでは、tm1637.pyファイル(mcauser氏のライブラリ)をPicoにコピーするだけです。

MicroPython
1import tm1637
2from machine import Pin
3import time
4
5tm = tm1637.TM1637(clk=Pin(16), dio=Pin(17))   # tm1637.py Pico'da olmalı / tm1637.py must be on the Pico
6tm.brightness(4)                               # 0–7
7
8count = 0
9while True:
10    tm.number(count)        # -999 … 9999
11    count += 1
12    time.sleep(1)

7セグメント、LCD、OLEDのどれを選ぶ?

項目7セグメント16x2 LCDOLED
表示できるもの数字といくつかの文字英字、数字、カスタム文字文字、グラフィック、アイコン
読みやすさとても明るく、遠くからでも読めるバックライトがあれば良好コントラストは高いが小さい
必要なピン8本以上(TM1637なら2本)2本(I2C)2本(I2C)
向いている用途時計、カウンター、スコアボードメニュー、測定値の文字表示グラフィック、アイコン、小型ガジェット

数字だけを表示できればよく、遠くからの読みやすさが大事なら、7セグメントディスプレイにかなうものはありません。文字や単位、メニューが必要ならI2C LCDディスプレイの使い方を見てみてください。

7セグメントディスプレイのプロジェクトアイデア

  • 電子サイコロ:ボタンを押すと1〜6のランダムな数字を表示します。
  • ボタンカウンター:1つのボタンで増え、もう1つのボタンでリセットされるカウンターを作ります。
  • デジタル時計:TM1637とRTCモジュールで、停電しても時刻を保つ時計を作ります。
  • カウントダウン:ボードゲームや実験に使える、時間を設定できるタイマーです。
  • 温度表示:DHT11で測った温度を大きな数字で表示します。
  • 反応速度テスト:LEDが点いてからボタンを押すまでの速さをミリ秒で表示します。

よくあるミスと直し方

  • どのセグメントもまったく点かない:共通ピンのつなぎ先が違います。アノードコモンのディスプレイをGNDにつないでいる可能性があります。
  • 数字がめちゃくちゃに見える:セグメントとArduinoのピンの対応が違っています。セグメントを1つずつ点けて確認してください。
  • 一部の数字が暗い:共通ピンに抵抗が1本だけ付いています。セグメントごとに別の抵抗を使ってください。
  • 4桁ディスプレイで1桁しか点かない、またはちらつく:loop()にdelay()があるか、スキャンの頻度が足りていません。
  • 点くべきセグメントが消え、ほかが点いている:アノードコモンとカソードコモンを取り違えています。COMMON_ANODEを変えてください。
  • ピンが足りない:TM1637モジュール、MAX7219ドライバ、または74HC595シフトレジスタでピン数を減らしてください。

各セグメントが実はLEDだと知ることが、7セグメントディスプレイを理解するカギです。基本についてはLEDとは?を見てみてください。BlueGraysアプリには、0〜9のカウント、ボタンカウンター、サイコロ、4桁のデジタル時計、爆弾アニメーションのプロジェクトが回路図とコード付きでステップごとに載っています。

よくある質問

7セグメントディスプレイにはどの抵抗を使えばいいですか?

5 Vなら、セグメントごとに220〜330 Ωが適しています。220 Ωはより明るく、330 Ωは電流が少なく済みます。ESP32やPicoのような3.3 Vのボードでは100〜150 Ωを使えます。抵抗は共通ピンではなく、各セグメントの線に別々に付けてください。

7セグメントディスプレイがアノードコモンかカソードコモンかは、どうやって見分けますか?

共通ピン(3または8)をGNDにつなぎ、セグメントのピンを220 Ωの抵抗を通して5Vに当てます。セグメントが点けばカソードコモンです。点かなければ、共通ピンを5Vに、セグメントのピンを抵抗を通してGNDにつなぎます。今度点けばアノードコモンです。型番にもたいていCCかCAが含まれています。

7セグメントディスプレイのピンは何本ありますか?

1桁のディスプレイは10ピンで、セグメント7本、点1本、共通ピン2本です。4桁のディスプレイは12ピンで、共有のセグメント線8本と桁選択ピン4本です。TM1637のようなモジュールは、4本のピン(CLK、DIO、VCC、GND)だけで接続できます。

4桁ディスプレイで1桁しか点かないのはなぜですか?

4桁ディスプレイはダイナミック点灯で動くので、桁を絶えず順番にスキャンする必要があります。loop()でdelay()を使うとスキャンが止まり、最後の桁だけが点いたままになります。SevSegのようなライブラリを使い、refreshDisplay()を絶えず呼び出し、時間の管理はmillis()で行ってください。

7セグメントディスプレイで文字を表示できますか?

一部の文字ならできます。A、b、C、d、E、F、H、L、P、U、oは見分けがつく形で表示できます。K、M、W、Xのような文字は7本のセグメントではうまく描けません。文字を表示する必要があるなら、LCDやOLEDディスプレイのほうが向いています。

少ないピンで7セグメントディスプレイを駆動するには?

いちばん簡単なのはドライバチップ付きのモジュールです。TM1637は2本の線で4桁を、MAX7219は3本の線で8桁を駆動します。自分で回路を組みたいなら、74HC595シフトレジスタを使えばArduinoのピン3本だけで8つのセグメントを制御できます。

全プロジェクトを見る
7セグメントディスプレイに0–9を表示
#41中級
プレミアム

7セグメントディスプレイに0–9を表示

エレベーターやデジタル時計で見慣れた数字を、自分で表示してみます。7本の小さな発光バーでできたディスプレイに、Arduinoが0から9までの数字を1秒に1つずつ表示し、最初から繰り返します。それぞれの数字がどのバーの点灯で作られるかを確かめ、カウンターや時計のプロジェクトに向けた基礎を学べます。

4.5(30)
43
7セグメントディスプレイで0〜99を表示
#42上級
プレミアム

7セグメントディスプレイで0〜99を表示

電卓のように棒状のセグメントで数字を表示する2桁のディスプレイで、0から99まで数えます。Arduinoが数値を1の位と10の位に分け、各桁の7つのセグメントのうち必要なものを点灯させます。数値は1秒間に5回増え、99の次は再び0から始まります。デジタル時計やスコアボードなどのプロジェクトの基礎になります。

4.5(27)
35
7セグメントディスプレイとボタンで作るカウンター
#43上級
プレミアム

7セグメントディスプレイとボタンで作るカウンター

3つのボタンを使うシンプルなカウンターです。1つ目のボタンを押すと表示の数字が1増え、2つ目を押すと1減り、3つ目を押すと0に戻ります。1桁の7セグメントディスプレイで0から9まで数え、範囲の端に達すると隅の小さな点が0.5秒間点灯して知らせます。スコアボードや順番表示器などのプロジェクトの基礎になります。

4.6(35)
47
サイコロのプロジェクト
#79中級
プレミアム

サイコロのプロジェクト

ボードゲームでサイコロをなくす心配がなくなります。ボタンを押すたびに、7セグメントディスプレイに1から6までのランダムな数字が表示されます。1回押すと結果が1つだけ出て、コンピューターの画面にも表示されます。友達とのゲームで使える、手作りのデジタルサイコロです。

5.0(48)
67
4桁の7セグメントディスプレイで0〜9999を表示
#47中級
プレミアム

4桁の7セグメントディスプレイで0〜9999を表示

4桁のディスプレイで数字が0から9999まで素早く進み、再び0から始まります。Arduinoは目の錯覚を利用して、4桁すべてが同時に点灯しているように見せます。実際には各桁を非常に速く順番に点灯させています。スコアボードやデジタル時計にも、このようなディスプレイが使われています。

4.4(19)
25
4桁の7セグメントディスプレイで作るデジタル時計
#48中級
プレミアム

4桁の7セグメントディスプレイで作るデジタル時計

キッチンのオーブンの時計のように、4桁の数字が光るデジタル時計です。DS1302時計モジュールが時刻を保持し、Arduinoが毎秒、時と分を読み取って4桁のディスプレイに表示します。時と分の間には小さな点が点灯します。時刻を保持するモジュールとディスプレイを組み合わせる方法を学びます。

4.8(56)
73
4桁の7セグメントディスプレイで作る爆弾アニメーション
#49初級
プレミアム

4桁の7セグメントディスプレイで作る爆弾アニメーション

映画に登場する時限爆弾のシーンを、危険のない仕掛けで机の上に再現します。4桁のディスプレイが1:05からカウントダウンし、毎秒ブザーが鳴って赤色LEDが点滅します。3本の配線のうち、どれを抜くかを選びます。1本はカウントダウンを速め、1本は爆弾を解除して緑色LEDを点灯させ、もう1本はその場で爆発させます。友達と楽しめる、緊張感のある卓上ゲームです。

4.8(63)
79
ESP32 TM1637 4桁7セグメントディスプレイ
#125中級
プレミアム

ESP32 TM1637 4桁7セグメントディスプレイ

TM1637ドライバーを搭載した4桁7セグメントディスプレイモジュールをESP32で制御します。2本のGPIOピン(CLKとDIO)だけで0~9999のカウンターを動かし、明るさを調整し、中央のコロン(:)を時計のように表示します。TM1637Displayライブラリを使えば、数値、16進数、セグメント、文字列を簡単に扱えます。

4.7(20)
32