スキップしてメイン コンテンツに移動

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()

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


コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...