Python × Pico 電子工作 | #07 7セグメントで数字を表示しよう

今回は 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セグメントで数字を表示しよう

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 の点灯例を見てみましょう。

7セグメント LED の a〜g 各セグメントの位置と、数字 0・3・8 の点灯例
左:a〜g の 7 本のセグメントの位置。右:点灯(赤)と消灯(グレー)の組み合わせで数字を作る。「0」は中央 g だけ消灯、「3」は左側 e・f が消灯、「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 が自動でやってくれます。

7セグメント LED を GP2〜GP8 に接続した実体配線図
配線:a→GP2、b→GP3、c→GP4、d→GP5、e→GP6、f→GP7、g→GP8。各セグメントの足には 220Ω 抵抗 を直列接続。コモン端子(裏面中央のピン)は GND に接続。(実体配線図は Fritzing の部品画像をもとに作図・CC BY-SA 3.0)
7セグメントに数字「3」を表示するブロック
ブロック構成:7セグ表示 数字 3 a:GP2 b:GP3 c:GP4 d:GP5 e:GP6 f:GP7 g:GP8。
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 を挟むと、電卓やストップウォッチのような カウントアップ表示 になります。

数字abcdefg点灯セグメント
01111110a,b,c,d,e,f
10110000b,c
21101101a,b,d,e,g
31111001a,b,c,d,g
40110011b,c,f,g
51011011a,c,d,f,g
61011111a,c,d,e,f,g
71110000a,b,c
81111111全部
91111011a,b,c,d,f,g
0〜9 までを 0.5 秒ずつ順番に表示するブロック
ブロック構成:10 個の「7セグ表示」ブロックを縦に積み、数字を 0 → 9 まで変化。間に 0.5 秒 wait。
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)

セグメントが暗いときは 抵抗値 を下げる(220Ω → 100Ω)か、明るすぎ・電流流れすぎ のときは抵抗値を上げる(220Ω → 470Ω)と調整できます。Pico の 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 秒(少し長め)表示します。ずっと繰り返す ブロックで囲んで、ループさせよう。ロケット発射前の カウントダウン のような効果が作れます。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

9 から 0 までカウントダウンするブロック(forever ループ内)
ブロック構成:ずっと → 7セグ表示 9 → 0.4秒 → 7セグ表示 8 → 0.4秒 → … → 7セグ表示 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 セグメントだけが点滅して見えるので、心臓の拍動 のような視覚効果が生まれます。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

「8」と「0」を 0.3 秒ずつ交互に表示してハートビート点滅
ブロック構成:ずっと → 7セグ表示 8 → 0.3秒 → 7セグ表示 0 → 0.3秒。
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) で済む驚きを体感してください。

トップへ戻る