今回は 7セグメント LED で数字 0〜9 を表示します。デジタル時計・電子レンジ・電卓などで見慣れた「四角い形の数字」は、実は 7 本の小さな LED を組み合わせて作られています。ブロック 1 つで数字を表示できますが、内側では a〜g の 7 ピン同時制御 が動いています。
- 7セグメントの a〜g 各セグメントの位置と役割
- カソードコモン/アノードコモンの違いと選び方
pico_7seg_showブロックで数字を表示- 0〜9 のカウントアップ・カウントダウン・点滅などの応用
PycoBlocks(MicroPythonモード) を開き、左カテゴリ「Pico 電子工作 / 表示」の「7セグ表示」ブロックが今回の主役です。7セグメント LED は 8 本の足(a〜g の 7 本 + コモン 1 本)を持つので、配線は今までで一番大変ですが、表示が点灯した瞬間の達成感は格別です。

7セグメント LED の仕組み:a〜g 7本の LED で数字を作る
7セグメント LED は 「8」の形に並んだ 7 本の細長い LED です。各 LED には a・b・c・d・e・f・g という名前が付いており、どの LED を光らせるか で数字 0〜9 を表現します。下の図で、各セグメントの位置と数字 0・3・8 の点灯例を見てみましょう。

| セグメント | 位置 | 説明 |
|---|---|---|
a | 上 | 上辺の横棒 |
b | 右上 | 右上の縦棒 |
c | 右下 | 右下の縦棒 |
d | 下 | 下辺の横棒 |
e | 左下 | 左下の縦棒 |
f | 左上 | 左上の縦棒 |
g | 中央 | 中央の横棒 |
たとえば数字 「0」 は a・b・c・d・e・f を点灯(g 消灯)、「7」 は a・b・c だけ点灯、「8」 は 全部点灯 で表現します。
カソードコモンとアノードコモン:どちらを使う?
7セグメント LED には 2 種類 あり、共通端子(コモン)の繋ぎ方が逆になっています。見た目はそっくりですが、配線と制御信号が 正反対 なので注意が必要です。
| カソードコモン | アノードコモン | |
|---|---|---|
| コモン端子 | GND(−) に接続 | 3.3V(+) に接続 |
| 各セグメント | 抵抗 → GPIO(出力 HIGH で点灯) | 抵抗 → GPIO(出力 LOW で点灯) |
| 制御の考え方 | 1 で点灯/0 で消灯 | 0 で点灯/1 で消灯(反転) |
| 本記事で使う | ✓ こちらを使用 | — |
本記事では カソードコモン を使います(ELEGOO スターターキットの 7 セグはカソードコモン)。もしアノードコモンを使う場合は、pico_7seg_show の出力は 逆論理 になり、セグメントを LOW(0) にしたときに点灯します。
💡 カソードかアノードか見分けるには
5611AS・5161AS など末尾 S はカソードコモン(Single cathode)、5611AH・5161AH など末尾 H はアノードコモン(High common)が多いです。実機ではテスターのダイオードモードで確認できます。ステップ1:数字「3」を表示してみよう
まずは 数字「3」 を表示してみましょう。「3」は a・b・c・d・g を点灯、e・f は消灯します。ブロックには「数字 3」と書くだけで、内側のパターン計算は pico_7seg_show が自動でやってくれます。


from machine import Pin
_SEG_PAT = [[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]]
_seg_pins = [Pin(p, Pin.OUT) for p in [2,3,4,5,6,7,8]]
for _i, _v in enumerate(_SEG_PAT[3]):
_seg_pins[_i].value(_v)
_SEG_PAT は 0〜9 の点灯パターン表(10 行 × 7 列のリスト)。_SEG_PAT[3] で「3」のパターン [1,1,1,1,0,0,1] を取り出し、enumerate + for ループで 7 本のピンに順番に出力する仕組みです。数字を変えるには _SEG_PAT[3] の 3 を 0〜9 に書き換えるだけ。
💡 試してみよう
0・1・2… と変えて、それぞれの形を確かめてみよう。「1」は b・c だけ、「7」は a・b・c だけ点灯するシンプルな形です。ステップ2:0〜9 のカウントアップ
7セグブロックを 0 → 9 まで縦に並べ、間に 0.5 秒 の wait を挟むと、電卓やストップウォッチのような カウントアップ表示 になります。
| 数字 | a | b | c | d | e | f | g | 点灯セグメント |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | a,b,c,d,e,f |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | b,c |
| 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | a,b,d,e,g |
| 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | a,b,c,d,g |
| 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | b,c,f,g |
| 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | a,c,d,f,g |
| 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | a,c,d,e,f,g |
| 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | a,b,c |
| 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 全部 |
| 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | a,b,c,d,f,g |

from machine import Pin
import utime
_SEG_PAT = [[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]]
_seg_pins = [Pin(p, Pin.OUT) for p in [2,3,4,5,6,7,8]]
for n in range(10):
for _i, _v in enumerate(_SEG_PAT[n]):
_seg_pins[_i].value(_v)
utime.sleep(0.5)
Python コードの工夫:ブロック版では 10 個のブロックを縦に並べる必要がありましたが、Python では for n in range(10): で 10 行を 3 行 に圧縮できます。range(10) は 0〜9 を順に取り出すので、それぞれの数字パターンを 0.5 秒ずつ表示します。
⚠️ 抵抗は必ず入れる(GPIO は最大 12mA)
ステップ3(コラム):ビットパターンと多桁表示への発展
ステップ2 で見た _SEG_PAT は 10 行 × 7 列 の二次元リストです。各行が 1 つの数字に対応し、7 列が a〜g の点灯状態(1=点灯/0=消灯)を表します。このリストを ビットパターン または ルックアップテーブル と呼びます。
なぜルックアップ方式を使うのか:数字ごとに if 文で分岐するより、表を引くだけ のほうが 速くてシンプル です。「3 を表示したいなら表の 3 行目を見る」という発想で、10 個の数字を 共通のコード で扱えます。これは データ駆動プログラミング の典型的なパターンで、ゲームの敵キャラ性能・キャラクター画像差分・経路探索の隣接表など、応用範囲はとても広いです。
多桁の数字を表示するには:本記事では 1 桁の 7 セグを 1 個だけ使っていますが、4 桁の 7 セグ表示器(共通陰極の 12 ピン品など)も市販されています。ただし 4 桁すべてを 同時に光らせる と GPIO が足りなくなるため、実際には 「ダイナミック点灯」(高速に桁を切り替えて、目の残像で同時表示に見せる)という技法を使います。これは応用編で扱います。
16 進数表示(A〜F):7セグでは 0〜9 だけでなく、A〜F まで表示 できます。A=a,b,c,e,f,g、b=c,d,e,f,g(小文字)、C=a,d,e,f、d=b,c,d,e,g(小文字)、E=a,d,e,f,g、F=a,e,f,g。プログラミングでは 16 進数(0〜F) がよく使われるので、デバッグ表示や色設定の表示に使うと便利です。
DP(小数点)セグメント:実は 7セグ LED の右下には 8 番目のセグメント DP(Decimal Point) もあり、小数点を点灯できます。本記事のブロックは a〜g の 7 本のみ扱いますが、もう 1 本余分にピンを繋げば 3.・0. のような表示も可能です。
演習課題
課題3-7-1:数字「6」と「9」のビットパターンを書いてみよう
ステップ2 の 0〜9 ビットパターン表 を参考にせず、頭の中で 「6」と「9」の形 を思い浮かべて、a〜g それぞれが点灯(1)か消灯(0)かを書き出してみよう。
ヒント:「6」は左下の縦棒(e)が 「5」と違う 部分。「9」は左下の縦棒(e)が 「8」と違う 部分。
▶ 模範解答と解説を見る
# 答え:
# 「6」のパターン(a, b, c, d, e, f, g の順)
# a:1, b:0, c:1, d:1, e:1, f:1, g:1
# → [1, 0, 1, 1, 1, 1, 1]
# 点灯セグメント: a, c, d, e, f, g(b だけ消灯)
#
# 「9」のパターン(a, b, c, d, e, f, g の順)
# a:1, b:1, c:1, d:1, e:0, f:1, g:1
# → [1, 1, 1, 1, 0, 1, 1]
# 点灯セグメント: a, b, c, d, f, g(e だけ消灯)
#
# 確認: ステップ2 のビットパターン表と一致するか?
# 「6」は a,c,d,e,f,g(5 + e セグメント)
# 「9」は a,b,c,d,f,g(8 - e セグメント)
解説: 解説:「6」と「9」は 上下反転 の関係に近い形をしています。「6」は 左下(e)が点灯、右上(b)が消灯。「9」は逆に 右上(b)が点灯、左下(e)が消灯。発展:「6」は 「5」に e セグメントを足した、「9」は 「8」から e セグメントを引いた と考えると、他の数字パターンも頭の中で組み立てやすくなります。
課題3-7-2:9 から 0 までカウントダウンしよう
数字を 9 → 8 → 7 → … → 1 → 0 の順で 0.4 秒ずつ表示し、最後の 「0」だけ 0.8 秒(少し長め)表示します。ずっと繰り返す ブロックで囲んで、ループさせよう。ロケット発射前の カウントダウン のような効果が作れます。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin
import utime
_SEG_PAT = [[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]]
_seg_pins = [Pin(p, Pin.OUT) for p in [2,3,4,5,6,7,8]]
def show(n, dur):
for _i, _v in enumerate(_SEG_PAT[n]):
_seg_pins[_i].value(_v)
utime.sleep(dur)
while True:
for n in range(9, 0, -1):
show(n, 0.4)
show(0, 0.8)
解説: Python の工夫:range(9, 0, -1) は 9 → 1 まで逆順 に取り出します(0 は含まれない)。show(0, 0.8) で最後の「0」だけ別に長めに表示するのがポイント。while True で囲むと 無限ループでカウントダウンが繰り返し されます。発展:
- カウントダウン中に ブザー(#06)を組み合わせて、「0」になった瞬間にビープ音を鳴らすロケット発射演出。
- ボタン(#03)を押したらカウントダウン開始、もう一度押したら停止する制御。
- 可変抵抗(#05)でカウントダウンの速度を変える。
課題3-7-3:「8」と「0」で心拍点滅を作ろう
「8」(全セグメント点灯) と 「0」(外周のみ・中央 g 消灯) を0.3 秒ずつ交互に表示してループさせよう。中央の g セグメントだけが点滅して見えるので、心臓の拍動 のような視覚効果が生まれます。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin
import utime
_SEG_PAT = [[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]]
_seg_pins = [Pin(p, Pin.OUT) for p in [2,3,4,5,6,7,8]]
while True:
for _i, _v in enumerate(_SEG_PAT[8]):
_seg_pins[_i].value(_v)
utime.sleep(0.3)
for _i, _v in enumerate(_SEG_PAT[0]):
_seg_pins[_i].value(_v)
utime.sleep(0.3)
解説: 「8」と「0」の 違いは中央 g セグメントだけ なので、g セグメントが 点滅して見える 視覚効果が生まれます。他の 6 セグメント(a,b,c,d,e,f)は常に点灯しているように見えます。発展:
- 「8」と「8」を 0.5 秒ずつ:何も変わらない(点滅しない)。同じパターンだから。
- 「1」と「7」を交互:上の a セグメントだけが点滅して見える。
- 「2」と「3」を交互:e と c のセグメントが入れ替わり点滅。目を凝らすとちょっと不思議な錯視効果。
まとめ
- 7セグメント LED は a〜g の 7 本の細長い LED を組み合わせて 0〜9 の数字を表現する。
- カソードコモンはコモンを GND に接続し、HIGH 出力(1)で点灯。アノードコモンは逆論理(LOW=点灯)。
pico_7seg_showは a〜g 各セグメントに 7 つのピンを割り当て、数字 0〜9 を選ぶだけで内側の ビットパターン表 を自動展開する。- 0〜9 の ビットパターン は 10 行 × 7 列のリスト。数字ごとに分岐するより、表を引くほうが速くてシンプル。
- 各セグメントには必ず 抵抗(220Ω 推奨) を直列接続。Pico の GPIO は最大 12mA。
次の記事は #08「LCD に文字を表示しよう」。I2C 通信を使って 16 文字 × 2 行 の液晶ディスプレイに文字列を表示します。今回 7 本も使った GPIO が、I2C なら たった 2 本(SDA・SCL) で済む驚きを体感してください。