2025年8月12日火曜日

7 セグ 4 桁 ダイナミック 点灯

 4桁の7セグメントLEDは、数字や簡単な記号を見やすく表示できる便利な表示デバイスですが、各桁すべてを同時に点灯させるには多くのピンが必要になります。これを解決する方法が「ダイナミック点灯」です。

ダイナミック点灯では、1桁ずつ高速で切り替えながら表示を行うことで、あたかも全桁が同時に点灯しているように見せかけます。Raspberry Pi Pico WとMicroPythonを使って、GPIOを制御します。

ダイナミック点灯とは?

7セグメントLEDを複数桁使って数字を表示する場合、各桁のセグメント(A~G、DP)をすべて同時に制御しようとすると、多くのGPIOピンが必要になります。たとえば、4桁分すべてのセグメントを個別に制御すると、7セグメント × 4桁 = 28本のピンが必要になってしまいます。

これを解決する方法が「ダイナミック点灯(タイムマルチプレックス表示)」です。


■ 仕組み

ダイナミック点灯では、次のように1桁ずつ高速に切り替えて点灯させます:

  1. 1桁目だけを点灯し、その桁に表示したい数字のセグメントだけをON

  2. 数ミリ秒後、1桁目を消灯して2桁目だけを点灯、2桁目の数字を表示

  3. 同様に3桁目、4桁目と順に繰り返す

  4. すべての桁を終えたらまた1桁目に戻る(このサイクルを繰り返す)

このサイクルを高速(数百Hz)で行うことで、人間の目にはすべての桁が同時に点灯しているように見えるのです(残像効果による)。

■ メリット

  • 使用するGPIOピン数が 「セグメント数 + 桁数」 に減る(4桁なら 7+4 = 11本)

  • マイコンのリソースを効率よく使える

  • 安価なLEDモジュールでも多桁表示が可能

■ 注意点

  • 高速で切り替えるため、**タイマー処理や遅延処理(utime.sleep_usなど)**が重要

  • 遅すぎるとチラつき、速すぎるとCPU負荷が高くなるのでバランスが必要

回路図


ダイナミック接続4桁高輝度赤色7セグメントLED表示器 
アノードコモン アノード共通接続

[OSL40562-IR]
7seg.jpg

7seg_1.png

【7セグメントLEDピンの番号】

7seg_2.png

1桁目表示:6番ピン

2桁目表示:8番ピン

3桁目表示:9番ピン

4桁目表示:12番ピン

ソースコード

from machine import Pin
import time

# ==== 7セグメントの各セグメント(A〜G)に割り当てたGPIOピン ====
SEG_PINS = [Pin(i, Pin.OUT) for i in (2, 3, 4, 5, 6, 7, 8)]  # A〜G
DIGIT_PINS = [Pin(i, Pin.OUT) for i in (10, 11, 12, 13)]     # 桁(14

# ==== 数字0〜9に対応するセグメントのビット列(共通カソード用)====
DIGITS = [
    0b00111111,  # 0
    0b00000110,  # 1
    0b01011011,  # 2
    0b01001111,  # 3
    0b01100110,  # 4
    0b01101101,  # 5
    0b01111101,  # 6
    0b00000111,  # 7
    0b01111111,  # 8
    0b01101111,  # 9
]

TDELAY = 0.001  # 秒(1ms

# ==== セグメントの点灯制御 ====
def display_number(n):
    bits = DIGITS[n]
    for i in range(7):
        SEG_PINS[i].value(0 if (bits >> i) & 1 else 1)  # 1→LOWで点灯(共通カソード)

# ==== 桁制御 ====
def digit_disp(n):  # 14の桁を選択
    for i in range(4):
        DIGIT_PINS[i].value(1 if i == (n - 1) else 0)  # HIGHで選択(アノード)

# ==== 初期化 ====
def init():
    for pin in SEG_PINS + DIGIT_PINS:
        pin.value(1)  # 初期はすべて消灯(セグメント:HIGHで消灯、桁:LOWで非選択)

# ==== メインループ ====
def loop():
    while True:
        digit_disp(1)
        display_number(9)
        time.sleep(TDELAY)

        digit_disp(2)
        display_number(2)
        time.sleep(TDELAY)

        digit_disp(3)
        display_number(6)
        time.sleep(TDELAY)

        digit_disp(4)
        display_number(7)
        time.sleep(TDELAY)

# ==== 実行 ====
init()
loop()





🧠 プログラムの処理の流れ


🛠️ 1. モジュールのインポート

from machine import Pin  
import time

GPIO制御用に machine.Pin を、時間待ち用に time をインポート。

🔌 2. ピンの初期設定

  • SEG_PINS:7セグメントの A〜G に GP2〜GP8 を割り当て(出力モード)。

  • DIGIT_PINS:桁制御に GP10〜GP13 を割り当て(出力モード)。


🔢 3. 数字パターンの定義

DIGITS = [ 0b00111111, 0b00000110, ... ]

    各数字(0〜9)を 7セグのビット列として定義。

    共通カソード(LOWで点灯)用のビット列。

⏱️ 4. 表示遅延時間の設定

TDELAY = 0.001

ダイナミック点灯用に 1ミリ秒(0.001秒)を設定。

💡 5. セグメント表示関数 display_number(n)

  • 引数 n に応じたビット列で A〜G のLEDを点灯/消灯。

  • LOW(0)で点灯、HIGH(1)で消灯。

🔢 6. 桁選択関数 digit_disp(n)

  • 桁(1〜4)を指定して、対応する桁だけ HIGH(選択)、他は LOW(非選択)にする。

🧼 7. 初期化処理 init()

  • すべてのセグメントピン → HIGH(消灯)

  • すべての桁ピン → LOW(非選択)

🔁 8. メインループ loop()

  • 無限ループで以下を繰り返し、ダイナミック点灯を行う:

表示数字処理内容
1️⃣9桁1を選択 → 9を表示 → 1ms待つ
2️⃣2桁2を選択 → 2を表示 → 1ms待つ
3️⃣6桁3を選択 → 6を表示 → 1ms待つ
4️⃣7桁4を選択 → 7を表示 → 1ms待つ

これを高速で繰り返して「7629」と4桁表示を実現。「令和7年6月29日」

▶️ 9. 実行開始

init()
loop()

初期化を行い、無限ループに突入して表示を継続。

0 件のコメント:

コメントを投稿

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック