注釈
こんにちは、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+ |
これらの部品を別々に購入することもできます。リンクは下記にあります。
番号 |
コンポーネントの紹介 |
数量 |
購入リンク |
|---|---|---|---|
1 |
1 |
||
2 |
マイクロUSBケーブル |
1 |
|
3 |
1 |
||
4 |
数個 |
||
5 |
1 |
||
6 |
2 |
8x8 LEDマトリックスの理解
8x8 LEDマトリックスは、8行8列に配置された64個のLEDから成ります。各LEDは、行と列に電圧をかけることで個別に制御できます。各行と列のペアを制御することによって、文字やパターンを表示できます。
このセットアップでは、2つの74HC595シフトレジスタを使用してLEDマトリックスの行と列を制御し、Raspberry Pi Pico 2のGPIOピンを最小限に抑えながら出力を拡張します。
回路図
8x8 LEDドットマトリックスは、2つの 74HC595 シフトレジスタによって制御されます:1つは行を、もう1つは列を制御します。この2つのチップは、PicoのGPIOピン GP18 、 GP19 、 GP20 を共有して、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画像では、ラベルのある側が下に来ています。
ステップ2: 2つの74HC595のピン11を接続し、それをGP20に接続します。 次に、2つのチップのピン12を接続し、それをGP19に接続します。その後、 左側の74HC595のピン14をGP18に接続し、ピン9を2番目の74HC595のピン14に接続します。
ステップ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 |
ステップ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 |
コードの記述
注釈
ファイル
5.4_8x8_pixel_graphics.inoをpico-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」パターンを表示するはずです。 パターンが表示されない場合は、タイミングを調整するか、配線接続を確認してください。
コードの理解
ピン定義:
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)
データ配列(
datArray):各要素はLEDマトリックスの行を表します。
16進数の値は、各行で点灯すべきLED(0)またはオフ(1)を対応させています。
このパターンはマトリックス上に対称的な「X」形状を作り出します。
byte datArray[] = {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E};
setup関数:
シフトレジスタとの通信のために制御ピンを出力として初期化します。
void setup() { // ピンを出力として設定 pinMode(STcp, OUTPUT); pinMode(SHcp, OUTPUT); pinMode(DS, OUTPUT); }
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_heartやpattern_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マトリックス上に動的なパターンやグラフィックを作成できます。



