2025年8月12日火曜日

OSL641501-ARA 赤色ドットマトリックスのダイナミック点灯

 は、Raspberry Pi Pico Wを使って「OSL641501-ARA」という8×8の赤色ドットマトリクスLEDの基本的な仕組みと接続方法を学びました。

今回はその応用として、**ダイナミック点灯(スキャン方式)**によって、アルファベットの A~G を順番に表示させてみましょう。

💡 ダイナミック点灯とは?

8×8のマトリクスLEDには64個のLEDが搭載されていますが、すべてを同時に点灯させると、電流の負荷が大きくなり回路にも悪影響を及ぼします。
そこで活躍するのが「ダイナミック点灯」という方法です。

これは、1行(または1列)ずつ高速に点灯させていくことで、人間の目にはすべてが同時に光って見えるようにする仕組みです。
実際には、LEDは1行ずつ順番にON/OFFを繰り返しており、目の錯覚(残像効果)を利用しています。

🅰️~🅶 表示のしくみ

今回のプログラムでは、各文字(A~G)を 8×8のビットマップ配列として定義し、それぞれの配列に応じてアノード(列)とカソード(行)のGPIOを制御します。
各文字は約1秒ごとに切り替わり、ループしながら順に表示されます。

これにより、まるで小さなLEDディスプレイに文字が浮かび上がるような視覚効果が得られます。

⚠️ 注意点

LEDを直接GPIOピンに接続する際は、**必ず電流制限抵抗(470Ω〜1kΩ)**を アノード側またはカソード側のどちらか一方に入れるようにしてください。
これを怠ると、LEDやRaspberry Pi Pico W本体の破損につながるおそれがあります。

OSL641501‑ARA 8×8 ドットマトリクス

ソースコード

# Raspberry Pi Pico W 8×8 ドットマトリクス表示(MicroPython版)
#  アノード: GP2–GP9 カソード: GP10–GP17
#  ※アノード/カソードのどちらか一方に 470 Ω〜1 kΩ の抵抗を必ず直列に入れてください

from machine import Pin
import time

# ───────────────────────────────────────────────
# GPIO 配列
# ───────────────────────────────────────────────
anode   = [Pin(i, Pin.OUT) for i in range(2, 10)]   # GP2–GP9
cathode = [Pin(i, Pin.OUT) for i in range(10, 18)]  # GP10–GP17

# 初期状態:アノード LOW、カソード HIGH
for a in anode:
    a.value(0)
for c in cathode:
    c.value(1)

# ───────────────────────────────────────────────
# 文字パターン(0=消灯, 1=点灯)
# ───────────────────────────────────────────────
A = [
    [0,0,0,0,0,0,0,0],
    [0,0,1,1,1,0,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,1,1,1,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
]

B = [
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,1,0,0],
    [0,1,0,0,0,0,1,0],
    [0,1,0,0,0,0,1,0],
    [0,1,1,1,1,1,0,0],
    [0,1,0,0,0,0,1,0],
    [0,1,0,0,0,0,1,0],
    [0,1,1,1,1,1,0,0],
]

C = [
    [0,0,0,0,0,0,0,0],
    [0,0,1,1,1,0,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,1,0,0],
    [0,0,1,1,1,0,0,0],
]

D = [
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,0,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,1,1,1,0,0,0],
]

E = [
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,1,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,1,1,1,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,1,1,1,1,0,0],
]

F = [
    [0,0,0,0,0,0,0,0],
    [0,1,1,1,1,1,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,1,1,1,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,0,0,0,0,0],
]

G = [
    [0,0,0,0,0,0,0,0],
    [0,0,1,1,1,0,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,0,0,0],
    [0,1,0,1,1,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,1,0,0,0,1,0,0],
    [0,0,1,1,1,0,0,0],
]

patterns = [A, B, C, D, E, F, G]  # インデックス 06

# ───────────────────────────────────────────────
# 1 フレーム描画(行スキャン)
# ───────────────────────────────────────────────
def draw_matrix(disp):
    """disp は 8×8 の 0/1 リスト"""
    for y in range(8):
        cathode[y].value(0)          # 行を有効 (LOW)
        for x in range(8):
            anode[x].value(disp[y][x])  # 列データを出力
        time.sleep_us(100)           # 点灯時間(μs)
        for x in range(8):
            anode[x].value(0)        # 列 OFF
        cathode[y].value(1)          # 行を無効 (HIGH)

# ───────────────────────────────────────────────
# メインループ
# ───────────────────────────────────────────────
x_counter = 0
change    = 0   # 06

while True:
    if x_counter > 1000:
        change = (change + 1) % 7   # A→B→…→G→A
        x_counter = 0
    x_counter += 1

    draw_matrix(patterns[change])
    print("change:", change + 1)    # Arduino の 17 表記に合わせておく


プログラムの処理フロー 🚦

  • 🛠️ GPIO 準備

    • アノード (GP2‑GP9) を出力に設定し LOW で初期化

    • カソード (GP10‑GP17) を出力に設定し HIGH で初期化

  • 📑 文字パターン登録

    • アルファベット A〜G を 8 × 8 の 0/1 ビットマップとしてリスト patterns に格納

  • 🎨 draw_matrix():1フレーム描画

    • 8 行を上から順にループ

      1. 対象行の カソードを LOW(行を有効化)

      2. 列ごとにアノードへ パターンの 0/1 を書き込む

      3. 100 µs ウェイトで点灯保持

      4. 全アノードを LOW、行カソードを HIGH に戻す(行無効化)

  • 🔄 メインループ

    • 変数 x_counter をインクリメントし続け、1000 回ごと

      • change を次のパターン番号へ更新(0→1→…→6→0)

      • x_counter をリセット

    • 毎ループで draw_matrix(patterns[change]) を呼び出し、現パターンを表示

    • デバッグ用に change 値をシリアル出力

  • ⚠️ 保護抵抗必須

    • アノード側またはカソード側のどちらか一方に 470 Ω〜1 kΩ の抵抗を直列に入れて過電流を防止



0 件のコメント:

コメントを投稿

Google Spread Sheetの利用

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