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

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Ω の抵抗を直列に入れて過電流を防止





コメント

このブログの人気の投稿

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 : ...