7セグメントディスプレイの使い方:Arduinoで数字を表示する、アノードコモンとカソードコモンの違い
7セグメントディスプレイはどう動くのか。セグメントの記号(a〜g、dp)、カソードコモンとアノードコモン、ピン配置と抵抗、0〜9を数えるコード、4桁ディスプレイとダイナミック点灯、TM1637モジュール、ESP32とPicoを解説します。
7セグメントディスプレイは、数字の「8」の形に並べた7本の棒状のLEDと小さな点でできたシンプルな表示器です。デジタル時計、電子レンジのタイマー、スコアボード、ガソリンスタンドの給油機などに使われています。安くてとても明るく、遠くからでも読みやすいのが特長です。Arduinoのプロジェクトでは、カウンター、サイコロ、ストップウォッチ、時計を作るための定番の出力部品のひとつです。

7セグメントディスプレイはどう動く?
セグメントにはアルファベットの名前が付いています。上のaから時計回りに、b(右上)、c(右下)、d(下)、e(左下)、f(左上)と続き、真ん中の棒がg、点がdpです。各セグメントは実際にはそれぞれ独立したLEDで、どれを点けるかによって違う数字ができます。たとえば「1」ではbとcだけが点き、「8」では7本すべてが点きます。
| 数字 | 点灯するセグメント |
|---|---|
| 0 | a, b, c, d, e, f |
| 1 | b, c |
| 2 | a, b, d, e, g |
| 3 | a, b, c, d, g |
| 4 | b, c, f, g |
| 5 | a, c, d, f, g |
| 6 | a, c, d, e, f, g |
| 7 | a, b, c |
| 8 | a, b, c, d, e, f, g |
| 9 | a, b, c, d, f, g |
カソードコモンかアノードコモンか?
RGB LEDと同じく、すべてのセグメントの片側は共通ピンにまとめられています。カソードコモンのディスプレイでは共通ピンをGNDにつなぎ、セグメントにHIGHを与えると点きます。アノードコモンのディスプレイでは共通ピンを5Vにつなぎ、セグメントにLOWを与えると点きます。外から見ると同じなので、どちらかを調べるには、共通ピンをGNDにつなぎ、セグメントのピンを220 Ωの抵抗を通して5Vに当ててみます。セグメントが点けばカソードコモンです。点かなければ、接続を逆にしてもう一度試してください。
| 項目 | カソードコモン(CC) | アノードコモン(CA) |
|---|---|---|
| 共通ピン(3と8) | GND | 5V |
| セグメントを点けるには | HIGH | LOW |
| コードでは | digitalWrite(pin, 点灯) | digitalWrite(pin, !点灯) |
ピン配置とArduinoへの配線
一般的な10ピンの1桁ディスプレイでは、表示面を手前に向けたとき、左下から反時計回りにピン番号が振られています。真ん中の2本のピン(3と8)が共通端子で、内部でつながっています。下の表は、ディスプレイのピンと、この記事のコードで使うArduinoのピンの両方を示しています。
| ディスプレイのピン | セグメント | Arduinoのピン |
|---|---|---|
| 7 | a | D2 |
| 6 | b | D3 |
| 4 | c | D4 |
| 2 | d | D5 |
| 1 | e | D6 |
| 9 | f | D7 |
| 10 | g | D8 |
| 5 | dp | D9 |
| 3と8 | 共通 | GND(カソードコモン)または5V(アノードコモン) |
Arduinoで0から9まで数える
各数字でどのセグメントを点けるかをビットとして配列に保存すると、コードが短くなります。下の例では、各バイトのいちばん左のビットがセグメントa、いちばん右のビットがセグメントgです。showDigit()関数はこれらのビットを1つずつ読み取ってピンに書き込みます。アノードコモンのディスプレイを使う場合は、COMMON_ANODEをtrueにするだけです。
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}4桁ディスプレイとダイナミック点灯

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

12本の配線と絶え間ないスキャンが大変そうなら、TM1637モジュールがおすすめです。ドライバチップがダイナミック点灯を自分で行い、ArduinoはCLKとDIOピンを通してどの数字を表示するかを伝えるだけです。ほとんどの製品には、時計を作るための真ん中のコロン(:)もあります。ライブラリマネージャからAvishay Orpaz作のTM1637ライブラリをインストールしてください。下のコードは、コロン付きで分と秒を表示します。
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にコピーするだけです。
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 LCD | OLED |
|---|---|---|---|
| 表示できるもの | 数字といくつかの文字 | 英字、数字、カスタム文字 | 文字、グラフィック、アイコン |
| 読みやすさ | とても明るく、遠くからでも読める | バックライトがあれば良好 | コントラストは高いが小さい |
| 必要なピン | 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を表示
エレベーターやデジタル時計で見慣れた数字を、自分で表示してみます。7本の小さな発光バーでできたディスプレイに、Arduinoが0から9までの数字を1秒に1つずつ表示し、最初から繰り返します。それぞれの数字がどのバーの点灯で作られるかを確かめ、カウンターや時計のプロジェクトに向けた基礎を学べます。

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

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

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

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

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

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

ESP32 TM1637 4桁7セグメントディスプレイ
TM1637ドライバーを搭載した4桁7セグメントディスプレイモジュールをESP32で制御します。2本のGPIOピン(CLKとDIO)だけで0~9999のカウンターを動かし、明るさを調整し、中央のコロン(:)を時計のように表示します。TM1637Displayライブラリを使えば、数値、16進数、セグメント、文字列を簡単に扱えます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

