4桁の7セグメントLEDは、数字や簡単な記号を見やすく表示できる便利な表示デバイスですが、各桁すべてを同時に点灯させるには多くのピンが必要になります。これを解決する方法が「ダイナミック点灯」です。
ダイナミック点灯では、1桁ずつ高速で切り替えながら表示を行うことで、あたかも全桁が同時に点灯しているように見せかけます。Raspberry Pi Pico WとMicroPythonを使って、GPIOを制御します。
ダイナミック点灯とは?
7セグメントLEDを複数桁使って数字を表示する場合、各桁のセグメント(A~G、DP)をすべて同時に制御しようとすると、多くのGPIOピンが必要になります。たとえば、4桁分すべてのセグメントを個別に制御すると、7セグメント × 4桁 = 28本のピンが必要になってしまいます。
これを解決する方法が「ダイナミック点灯(タイムマルチプレックス表示)」です。
■ 仕組み
ダイナミック点灯では、次のように1桁ずつ高速に切り替えて点灯させます:
-
1桁目だけを点灯し、その桁に表示したい数字のセグメントだけをON
-
数ミリ秒後、1桁目を消灯して2桁目だけを点灯、2桁目の数字を表示
-
同様に3桁目、4桁目と順に繰り返す
-
すべての桁を終えたらまた1桁目に戻る(このサイクルを繰り返す)
このサイクルを高速(数百Hz)で行うことで、人間の目にはすべての桁が同時に点灯しているように見えるのです(残像効果による)。
■ メリット
-
使用するGPIOピン数が 「セグメント数 + 桁数」 に減る(4桁なら 7+4 = 11本)
-
マイコンのリソースを効率よく使える
-
安価なLEDモジュールでも多桁表示が可能
■ 注意点
-
高速で切り替えるため、**タイマー処理や遅延処理(
utime.sleep_us
など)**が重要 -
遅すぎるとチラつき、速すぎるとCPU負荷が高くなるのでバランスが必要
回路図
1桁目表示:6番ピン
2桁目表示:8番ピン
3桁目表示:9番ピン
4桁目表示:12番ピン
ソースコード
🧠 プログラムの処理の流れ
🛠️ 1. モジュールのインポート
machine.Pin
を、時間待ち用に time
をインポート。🔌 2. ピンの初期設定
-
SEG_PINS
:7セグメントの A〜G に GP2〜GP8 を割り当て(出力モード)。 -
DIGIT_PINS
:桁制御に GP10〜GP13 を割り当て(出力モード)。
💡 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待つ |
コメント
コメントを投稿