注釈

こんにちは!SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Facebookコミュニティで、Raspberry Pi、Arduino、ESP32について深く学び、愛好者と交流しましょう。

なぜ参加するべきか?

  • 専門的なサポート: 購入後の問題や技術的な課題を、コミュニティやサポートチームと一緒に解決できます。

  • 学びと共有: ヒントやチュートリアルを交換し、スキルを向上させましょう。

  • 最新情報の先行公開: 新製品の発表やプレビューにいち早くアクセスできます。

  • 特別割引: 最新製品を特別価格で購入できます。

  • イベントやプレゼント企画: さまざまなキャンペーンやプレゼント企画に参加できます。

👉 さあ、一緒に学び、創造しましょう![こちら] をクリックして、今すぐ参加!

5.4 8x8 LEDマトリックスでのグラフィック表示

このレッスンでは、 Raspberry Pi Pico 274HC595シフトレジスタ2個 を使用して 8x8 LEDマトリックス を制御する方法を学びます。各LEDを個別にコントロールすることで、パターンや簡単なグラフィックを表示できるようになります。

必要なもの

このプロジェクトでは、以下のコンポーネントが必要です。

すべてを一括で揃えるのに便利なキットはこちら:

名称

キット内容

リンク

Newton Lab Kit

450点以上

Newton Lab Kit

個別に購入する場合は、以下のリンクを利用してください。

SN

コンポーネント

数量

リンク

1

Raspberry Pi Pico 2

1

購入

2

Micro USBケーブル

1

3

ブレッドボード

1

購入

4

ジャンパーワイヤー

数本

購入

5

LEDドットマトリックス

1

6

74HC595

2

購入

8x8 LEDマトリックスの概要

8x8 LEDマトリックスは、8行×8列に並んだ合計64個のLEDで構成されています。行と列に電圧を加えることで各LEDを個別に制御し、文字やパターンを表示できます。

このプロジェクトでは、 74HC595シフトレジスタ2個 を使用してLEDマトリックスの行と列を制御し、少ないGPIOピンで多くの出力を管理します。

回路図

sch_ledmatrix

8x8 LEDドットマトリックスは、 2つの74HC595シフトレジスタ によって制御されます。1つは行を、もう1つは列を制御します。これらのICは GP18、GP19、GP20 の3つのGPIOピンを共有し、PicoのI/Oポートを節約します。

Raspberry Pi Picoは一度に16ビットのバイナリデータを出力し、最初の8ビットが行、次の8ビットが列を制御する仕組みになっています。

Q7' (ピン9): 1つ目の74HC595のシリアルデータ出力ピンが、2つ目の74HC595の DS (ピン14) に接続されることで、シフトレジスタを連結できます。

配線手順

配線は少し複雑ですが、手順を追って進めましょう。

Step 1: まず、Pico、LEDドットマトリックス、および2つの74HC595チップをブレッド ボードに挿入します。Picoの 3.3V と GND をブレッドボードの両サイドの穴に接続 し、その後、2つの74HC595の ピン16 と ピン10 を VCC に、 ピン13 と ピン8 を GND に接続します。

注釈

上記のFritzing画像では、ラベルのある側が下側になります。

wiring_ledmatrix_4

ステップ2: 2つの74HC595の ピン11 を接続し、それをGP20に接続。続いて、ピン12をGP19に、 左側の74HC595の ピン14 をGP18に、ピン9を2つ目の74HC595のピン14に接続します。

wiring_ledmatrix_3

Step 3: 右側の74HC595は、LEDドットマトリックスの列を制御します。 対応関係は下表のとおりです。そのため、74HC595の*Q0-Q7 ピンは、 それぞれ ピン13、3、4、10、6、11、15、16 に対応しています。

74HC595

Q0

Q1

Q2

Q3

Q4

Q5

Q6

Q7

LED Dot Matrix

13

3

4

10

6

11

15

16

wiring_ledmatrix_2

Step 4: 次に、LEDドットマトリックスの ROW(行)を接続します。 左側の74HC595がLEDドットマトリックスの行を制御します。対応関係は下 表のとおりです。左側の74HC595のQ0-Q7ピンは、それぞれピン9、14、8、12、1、7、2、5に対応しています。

74HC595

Q0

Q1

Q2

Q3

Q4

Q5

Q6

Q7

LED Dot Matrix

9

14

8

12

1

7

2

5

wiring_ledmatrix_1

コードの記述

次に、MicroPythonでLEDマトリックスにパターンを表示するプログラムを作成します。

注釈

  • 5.4_8x8_pixel_graphics.pynewton-lab-kit/micropython から開くか、Thonnyにコードをコピーして「Run」をクリックするか、F5キーを押してください。

  • インタプリタが MicroPython (Raspberry Pi Pico) COMxx に設定されていることを確認してください。

import machine
import time

# 74HC595シフトレジスタに接続するピンの定義
sdi = machine.Pin(18, machine.Pin.OUT)   # シリアルデータ入力
rclk = machine.Pin(19, machine.Pin.OUT)  # ストレージレジスタクロック(RCLK)
srclk = machine.Pin(20, machine.Pin.OUT) # シフトレジスタクロック(SRCLK)

# LEDマトリックスに「X」を表示するためのパターンデータ
glyph = [0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E]

def hc595_in(dat):
    """
    Shifts 8 bits of data into the 74HC595 shift register.
    """
    for bit in range(7, -1, -1):
        srclk.low()
        sdi.value((dat >> bit) & 1)  # ビット単位でデータを出力
        srclk.high()
        time.sleep_us(1)  # 短い遅延を入れてタイミングを調整

def hc595_out():
    """
    Latches the data from the shift register to the storage register,
    updating the outputs.
    """
    rclk.high()
    rclk.low()

while True:
    for i in range(8):
        hc595_in(glyph[i])       # 現在の行のカラムデータを送信
        hc595_in(1 << i)         # 該当の行をアクティブ化
        hc595_out()              # ディスプレイを更新
        time.sleep_ms(1)         # 視覚的な残像効果のための遅延

このコードを実行すると、8x8 LEDマトリックスに「X」の形が表示されます。LEDが点灯し、マトリックス上に「X」のパターンを形成します。

コードの解説

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

    • machine: GPIOピン制御などのハードウェア関連機能を提供

    • time: タイミング制御のための遅延処理に使用

  2. ピンの定義:

    • sdi: シフトレジスタにシリアルデータを送信

    • rclk: シフトレジスタのデータを出力ピンにラッチ

    • srclk: 送信されたデータをシフトレジスタに移動

  3. 「X」パターンの定義:

    • 各要素がLEDマトリックスの1行に対応

    • 16進数値は、その行の点灯(0)・消灯(1)の状態を示す

    • これにより、対称的な「X」の形がマトリックス上に描画される

    glyph = [0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E]
    
  4. hc595_in(dat) 関数:

    • 8ビットのデータ( dat )をシフトレジスタに順次送信

    • 最上位ビット(MSB)から順に処理

    • srclk ピンをトグルして各ビットをレジスタにシフト

    • sdi ピンが現在のビットの値に応じてHIGHまたはLOWを設定

    def hc595_in(dat):
        """
        Shifts 8 bits of data into the 74HC595 shift register.
        """
        for bit in range(7, -1, -1):
            srclk.low()
            sdi.value((dat >> bit) & 1)  # ビットごとにデータを送信
            srclk.high()
            time.sleep_us(1)  # 適切なタイミング調整
    
  5. hc595_out() 関数:

    • シフトレジスタのデータをストレージレジスタにラッチ

    • rclk ピンの立ち上がりエッジでデータを出力ピンに適用

    def hc595_out():
    
        rclk.high()
        rclk.low()
    
  6. メインループ:

    • ループ内でディスプレイを高速に更新し、「X」パターンを維持

    • for ループで各行(0~7)を順番に処理

    • hc595_in(1 << i) により1行ずつアクティブ化

    • hc595_in(glyph[i]) で各行のカラムデータを送信

    • hc595_out() でラッチし、マトリックスを更新

    • time.sleep_ms(1) により各行を短時間表示し、視覚的に全体を同時点灯させる

    while True:
        for i in range(8):
            hc595_in(glyph[i])       # 現在の行のデータを送信
            hc595_in(1 << i)         # 行をアクティブにする
            hc595_out()              # LEDマトリックスを更新
            time.sleep_ms(1)         # 視覚的残像のための遅延
    

さらなる実験

  • パターンの変更

    以下のパターンデータに置き換えることで、異なるグラフィックを表示可能。 pattern_heart または pattern_smile をコード内で使用すると、異なる形状を描画できる。

    # ハート形
    pattern_heart = [
        0b11111111,
        0b10011001,
        0b00000000,
        0b00000000,
        0b00000000,
        0b10000001,
        0b11000011,
        0b11100111
    ]
    
    # スマイルフェイス
    pattern_smile = [
        0b11000011,  # 行0
        0b10111101,  # 行1
        0b01011010,  # 行2
        0b01111110,  # 行3
        0b01011010,  # 行4
        0b01100110,  # 行5
        0b10111101,  # 行6
        0b11000011   # 行7
    ]
    
  • Animating the Display

    複数のパターンを作成し、順番に切り替えてアニメーションを実現しましょう。

    import machine
    import time
    
    # 74HC595シフトレジスタに接続するピンを定義
    sdi = machine.Pin(18, machine.Pin.OUT)   # シリアルデータ入力
    rclk = machine.Pin(19, machine.Pin.OUT)  # レジスタクロック(ラッチ)
    srclk = machine.Pin(20, machine.Pin.OUT) # シフトレジスタクロック
    
    # ハートの形
    pattern_heart = [
        0b11111111,
        0b10011001,
        0b00000000,
        0b00000000,
        0b00000000,
        0b10000001,
        0b11000011,
        0b11100111
    ]
    
    # スマイルフェイス
    pattern_smile = [
        0b11000011,  # 行0
        0b10111101,  # 行1
        0b01011010,  # 行2
        0b01111110,  # 行3
        0b01011010,  # 行4
        0b01100110,  # 行5
        0b10111101,  # 行6
        0b11000011   # 行7
    ]
    
    def hc595_in(dat):
        """
        Shift 8 bits of data into the 74HC595 shift register.
        """
        for bit in range(7, -1, -1):
            srclk.low()                            # データのシフト準備
            sdi.value((dat >> bit) & 1)            # データビットをセット
            srclk.high()                           # データをシフトレジスタへ送信
            time.sleep_us(1)                       # 短い遅延でタイミング調整
    
    def hc595_out():
        """
        Latch the shifted data to the output pins of the 74HC595.
        """
        rclk.high()                               # データをラッチ(立ち上がりエッジ)
        rclk.low()                                # 次のデータ送信準備
    
    def display_pattern(pattern):
        """
        Display a given 8x8 pattern on the LED matrix.
        """
        for _ in range(500):                      # 一定時間パターンを表示
            for i in range(8):
                hc595_in(pattern[i])              # 現在の行のカラムデータを送信
                hc595_in(1 << i)                  # 該当の行をアクティブ化
                hc595_out()                       # 出力を更新
                time.sleep_ms(1)                  # 視覚的な持続効果のための遅延
    
    while True:
        display_pattern(pattern_heart)            # ハートの形を表示
        display_pattern(pattern_smile)            # スマイルフェイスを表示
    
  • Design Your Own Patterns

    各バイトはLEDマトリックスの1行を表し、ビットが0の箇所が点灯します。独自のパターンリストを作成して、オリジナルのデザインを作りましょう。

Conclusion

このレッスンでは、Raspberry Pi Pico 2と2つの74HC595シフトレジスタを使用して、8x8 LEDマトリックスを制御する方法を学びました。 ビット操作やシフトレジスタの活用方法を理解することで、マトリックス上にパターンやグラフィックを自由に表示できるようになります。