注釈

こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!仲間たちと一緒に、Raspberry Pi、Arduino、ESP32を深く学んでいきましょう。

参加する理由は?

  • 専門家サポート:販売後の問題や技術的な課題を、コミュニティやチームからのサポートで解決できます。

  • 学び&共有:スキル向上のために、ヒントやチュートリアルを交換しましょう。

  • 限定プレビュー:新製品の発表や先行情報をいち早く確認できます。

  • 特別割引:最新製品に対して、専用の割引を楽しめます。

  • 祝祭キャンペーンとプレゼント:プレゼントやホリデープロモーションに参加しましょう。

👉 私たちと一緒に探求し、創造しましょう![ここ]をクリックして、今すぐ参加!

5.4 8x8 ピクセルグラフィックス

このレッスンでは、Raspberry Pi Pico 2 Wと2つの 74HC595シフトレジスタ を使用して、 8x8 LEDマトリックス を制御する方法を学びます。個々のLEDを制御してパターンやシンプルなグラフィックスを表示します。

必要なコンポーネント

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

キットを購入するのが便利です。リンクはこちら:

名前

このキットのアイテム

リンク

Pico 2 W スターターキット

450+

Pico 2 W Kit

下記のリンクからも個別に購入できます。

SN

コンポーネント

数量

リンク

1

Pico 2 Wの概要

1

2

マイクロUSBケーブル

1

3

ブレッドボード

1

買う

4

ジャンパーワイヤー

複数

買う

5

LEDドットマトリックス

1

6

74HC595

2

買う

8x8 LEDマトリックスの理解

8x8 LEDドットマトリックスは、2つの 74HC595 シフトレジスタによって制御されます。1つは行を制御し、もう1つは列を制御します。これら2つのチップは、PicoのGPIOピン GP18GP19GP20 を共有しており、PicoのI/Oポートを大幅に節約できます。

Picoは1回で16ビットの2進数を出力します。最初の8ビットは行を制御する74HC595に送信され、最後の8ビットは列を制御する74HC595に送信されます。これにより、ドットマトリックスに特定のパターンを表示できます。

Q7' (ピン9): 最初の74HC595のこのシリアルデータ出力ピンは、2番目の74HC595の DS (ピン14) に接続されており、複数の74HC595チップを直列に接続できます。

回路図

sch_ledmatrix

8x8ドットマトリックスは2つの 74HC595 チップで制御され、1つは行を、もう1つは列を制御します。これら2つのチップは、G18〜G20を共有しており、Pico 2 WのI/Oポートを大幅に節約できます。

Pico 2 Wは1回で16ビットの2進数を出力し、最初の8ビットは行を制御する74HC595に、最後の8ビットは列を制御する75HC595に送信され、ドットマトリックスに特定のパターンを表示します。

Q7': シリアル出力ピン、次の74HC595のDSに接続して複数の74HC595を直列に接続します。

配線

回路を構築するのは複雑なので、順を追って説明します。

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

注釈

上のFritzing画像では、ラベルが下向きに配置されています。

wiring_ledmatrix_4

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

wiring_ledmatrix_3

ステップ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

ステップ4: 次に、LEDドットマトリックスのROWを接続します。 左側の74HC595はLEDドットマトリックスのROWを制御します。 以下の表でマッピングを確認してください。 左側の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マトリックスにパターンを表示します。

注釈

  • pico-2w-kit-main/micropython から 5.4_8x8_pixel_graphics.py を開くか、コードをThonnyにコピーして、「実行」をクリックするか、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)

# '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進数の値は、各行で点灯するべきLED(0)または消灯するLED(1)に対応します。

    • このパターンは、マトリックス全体に対して対称的な「X」の形を形成します。

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

    • この関数は、8ビットのデータ( dat )をシフトレジスタにシリアルで送信します。

    • 最上位ビットから最下位ビットへと繰り返します。

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

    • sdi ピンは、現在のビットに応じてデータラインを高または低に設定します。

    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 ピンの立ち上がりエッジでデータを出力ピンに転送し、LEDを更新します。

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

    • ループは、'X' の文字を持続的に表示するためにディスプレイを更新し続けます。

    • for ループは、0から7までの各行のインデックスを繰り返します。

    • hc595_in(1 << i) は1行をアクティブにし、単一のビットを高に設定します。

    • hc595_in(glyph[i]) は現在の行の列データを送信し、その行で点灯するべきLEDを決定します。

    • hc595_out() はデータをラッチし、LEDマトリックスディスプレイを更新します。

    • time.sleep_ms(1) は、各行が人間の目で見えるくらい十分な時間ディスプレイに表示されるように短い遅延を提供します。

    • この高速スキャンにより、'X' が同時に表示されているかのような錯覚が生まれます。

    while True:
        for i in range(8):
            hc595_in(glyph[i])       # 現在の行の列データを送信
            hc595_in(1 << i)         # 現在の行をアクティブに
            hc595_out()              # ディスプレイを更新
            time.sleep_ms(1)         # 視覚的な持続性のために遅延
    

さらに実験してみる

  • パターンの変更

    以下の配列を使用してパターンリストを置き換えると、異なるグラフィックを表示できます。コード内で pattern_heartpattern_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
    ]
    
  • ディスプレイのアニメーション

    複数のパターンを作成し、それらを循環させてアニメーションを作成します。

    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)            # スマイルの顔を表示
    
  • オリジナルパターンのデザイン

    各バイトは1行を表します。0に設定されたビットは、その列のLEDを点灯させます。パターンリストを定義することでカスタムパターンを作成できます。

結論

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