注釈

こんにちは、SunFounderのRaspberry Pi、Arduino、ESP32愛好者コミュニティへようこそ! Raspberry Pi、Arduino、ESP32について、他の愛好者と一緒にさらに深く学んでいきましょう。

なぜ参加するべきか?

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

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

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

  • 特別割引:最新製品に対する限定割引を楽しめます。

  • フェスティブプロモーションとプレゼント企画:プレゼント企画や祝祭プロモーションに参加しましょう。

👉 一緒に探求し、創造してみませんか? [ここ] をクリックして今すぐ参加しましょう!

5.4 8x8 LEDマトリックスにグラフィックを表示する

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

必要なコンポーネント

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

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

名前

キット内容

購入リンク

Pico 2 Wスターターキット

450+

Pico 2 W Kit

これらの部品を別々に購入することもできます。リンクは下記にあります。

番号

コンポーネントの紹介

数量

購入リンク

1

Pico 2 Wの概要

1

2

マイクロUSBケーブル

1

3

ブレッドボード

1

買う

4

ジャンパーワイヤー

数個

買う

5

LEDドットマトリックス

1

6

74HC595

2

買う

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

8x8 LEDマトリックスは、8行8列に配置された64個のLEDから成ります。各LEDは、行と列に電圧をかけることで個別に制御できます。各行と列のペアを制御することによって、文字やパターンを表示できます。

このセットアップでは、2つの74HC595シフトレジスタを使用してLEDマトリックスの行と列を制御し、Raspberry Pi Pico 2のGPIOピンを最小限に抑えながら出力を拡張します。

回路図

sch_ledmatrix

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

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

Q7'(ピン9): 最初の74HC595のシリアルデータ出力ピンは、2番目の74HC595の DS(ピン14) に接続され、複数の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ドットマトリックスの行を接続します。左側の74HC595はLEDドッ トマトリックスの行を制御します。以下の表でマッピングを確認できます。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

コードの記述

注釈

  • ファイル 5.4_8x8_pixel_graphics.inopico-2w-kit-main/arduino/5.4_8x8_pixel_graphics のパスで開くことができます。

  • または、このコードを Arduino IDE にコピーして使用してください。

  • アップロード ボタンをクリックする前に、ボード(Raspberry Pi Pico)と正しいポートを選択することを忘れないでください。

const int STcp = 19;  // 74HC595のST_CP(ラッチピン)に接続されたピン
const int SHcp = 20;  // 74HC595のSH_CP(クロックピン)に接続されたピン
const int DS = 18;    // 74HC595のDS(データピン)に接続されたピン

// 8x8 LEDマトリックスでの「X」形状を表すデータ配列
byte datArray[] = {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E};

void setup() {
  // ピンを出力として設定
  pinMode(STcp, OUTPUT);
  pinMode(SHcp, OUTPUT);
  pinMode(DS, OUTPUT);
}

void loop()
{
  for(int num = 0; num <8; num++)
  {
    digitalWrite(STcp,LOW); // データの送信中、ST_CPをLOWに保つ
    shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
    shiftOut(DS,SHcp,MSBFIRST,0x80>>num);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
  }
}

コードをアップロードした後、LEDマトリックスは適切なLEDを点灯させて「X」パターンを表示するはずです。 パターンが表示されない場合は、タイミングを調整するか、配線接続を確認してください。

コードの理解

  1. ピン定義:

    • STcp (ST_CP): シフトレジスタにシフトされたデータをラッチするために使用

    • SHcp (SH_CP): 各クロックの立ち上がりでデータをシフトレジスタにシフト

    • DS: シフトレジスタへのシリアルデータ入力

    const int STcp = 19;  // 74HC595のラッチピン(ST_CP)
    const int SHcp = 20;  // 74HC595のクロックピン(SH_CP)
    const int DS = 18;    // 74HC595のデータピン(DS)
    
  2. データ配列( datArray ):

    • 各要素はLEDマトリックスの行を表します。

    • 16進数の値は、各行で点灯すべきLED(0)またはオフ(1)を対応させています。

    • このパターンはマトリックス上に対称的な「X」形状を作り出します。

    byte datArray[] = {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E};
    
  3. setup関数:

    シフトレジスタとの通信のために制御ピンを出力として初期化します。

    void setup() {
      // ピンを出力として設定
      pinMode(STcp, OUTPUT);
      pinMode(SHcp, OUTPUT);
      pinMode(DS, OUTPUT);
    }
    
  4. loop関数:

    • num は0から7まで、LEDマトリックスの各行を表します。

    • 0x80>>num で1行ずつアクティブにします。

    • shiftOut() で列データと行データをシフトレジスタに送信し、最上位ビット( MSBFIRST )から送信します。

    • STcp をトグルしてデータを出力ピンにラッチします。

    void loop()
    {
      for(int num = 0; num <8; num++)
      {
        digitalWrite(STcp,LOW); // データの送信中、ST_CPをLOWに保つ
        shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
        shiftOut(DS,SHcp,MSBFIRST,0x80>>num);
        //return the latch pin high to signal chip that it
        //no longer needs to listen for information
        digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
      }
    }
    

トラブルシューティング

  • 点灯しないドット:

    • すべての電源接続を確認してください。

    • シフトレジスタがPicoに正しく接続されていることを確認してください。

  • 不正なパターン:

    • パターン配列を再確認してください。

    • 行と列がシフトレジスタに正しく配線されていることを確認してください。

  • 点滅や不安定な表示:

    • ループ内の遅延値を調整して、パフォーマンスと視覚的安定性のバランスを取ってください。

    • 電源供給が安定しており、使用しているLEDの数に十分な電力が供給されていることを確認してください。

さらなる実験

  • パターンの変更

    以下の配列を使って異なるグラフィックを表示するために、パターンリストを変更してみましょう。コード内で pattern_heartpattern_smile を使用して異なる画像を表示できます。

    // ハート形パターン
    byte pattern_heart[] = {
      0xFF, // 11111111
      0x99, // 10011001
      0x00, // 00000000
      0x00, // 00000000
      0x00, // 00000000
      0x81, // 10000001
      0xC3, // 11000011
      0xE7  // 11100111
    };
    
    // 笑顔のパターン
    byte pattern_smile[] = {
      0xC3, // 11000011
      0xBD, // 10111101
      0x5A, // 01011010
      0x7E, // 01111110
      0x5A, // 01011010
      0x66, // 01100110
      0xBD, // 10111101
      0xC3  // 11000011
    };
    
  • ディスプレイのアニメーション

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

    const int STcp = 19;  // 74HC595のST_CP(ラッチピン)に接続されたピン
    const int SHcp = 20;  // 74HC595のSH_CP(クロックピン)に接続されたピン
    const int DS = 18;    // 74HC595のDS(データピン)に接続されたピン
    
    // ハート形パターン
    byte pattern_heart[] = { 0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7 };
    
    // 笑顔のパターン
    byte pattern_smile[] = { 0xC3, 0xBD, 0x5A, 0x7E, 0x5A, 0x66, 0xBD, 0xC3 };
    
    void setup() {
      // ピンを出力として設定
      pinMode(STcp, OUTPUT);
      pinMode(SHcp, OUTPUT);
      pinMode(DS, OUTPUT);
    }
    
    void latchData() {
      // シフトレジスタにシフトされたデータを出力ピンにラッチ
      digitalWrite(STcp, HIGH);  // データをラッチ
      digitalWrite(STcp, LOW);   // 次のデータ送信の準備
    }
    
    void displayPattern(byte pattern[]) {
      for (int repeat = 0; repeat < 500; repeat++) {  // パターンを一定期間表示
        for (int row = 0; row < 8; row++) {
          // データ送信開始
          digitalWrite(STcp, LOW);  // データ送信準備
    
          // 列データ(現在の行のパターン)をシフトアウト
          shiftOut(DS, SHcp, MSBFIRST, pattern[row]);
    
          // 行データ(1行ずつアクティブに)をシフトアウト
          shiftOut(DS, SHcp, MSBFIRST, 1 << row);
    
          // データをラッチして表示
          latchData();
    
          // 視覚的な安定性のための短い遅延
          delay(1);
        }
      }
    }
    
    void loop() {
      // ハートと笑顔のパターンを交互に表示
      displayPattern(pattern_heart);  // ハート形を表示
      displayPattern(pattern_smile);  // 笑顔を表示
    }
    

結論

このレッスンでは、Raspberry Pi Picoと2つの74HC595シフトレジスタを使用して8x8 LEDマトリックスを制御する方法を学びました。シフトレジスタを活用することで、GPIOの使用を最小限に抑えつつ、複数のLEDを効率的に管理し、より複雑でインタラクティブなプロジェクトが可能になります。シリアルデータを送信し、それをパラレル出力にラッチする方法を理解することで、LEDマトリックス上に動的なパターンやグラフィックを作成できます。