注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

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

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

1.1.6 LEDドットマトリックスモジュール

はじめに

このプロジェクトでは、LEDマトリックスモジュールについて学びます。LEDマトリックスモジュールは、MAX7219ドライバを使用して8 x 8のLEDマトリックスを駆動します。

必要な部品

このプロジェクトには、以下の部品が必要です。

../_images/list_dot.png

一式を購入するのは非常に便利です。リンクは以下の通りです:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

以下のリンクから別々に購入することもできます。

コンポーネントの紹介

購入リンク

GPIO拡張ボード

購入

ブレッドボード

購入

ジャンパーワイヤー

購入

LEDマトリクスモジュール

購入

回路図

T-Board Name

physical

wiringPi

BCM

SPIMOSI

Pin 19

12

MOSI

SPICE0

pin 24

10

CE0

SPISCLK

Pin 23

14

SCLK

../_images/schematic_dot.png

実験手順

ステップ1: 回路を組み立てます。

../_images/1.1.6fritzing.png

注釈

実験を開始する前にSPIをオンにします。詳細は SPI 設定 を参照してください。

ステップ2: コードのフォルダに移動します。

cd ~/raphael-kit/nodejs/

ステップ3: 依存関係をインストールします。

sudo npm install spi-device

ステップ4: コードを実行します。

sudo node max7219_led_matrix.js

コードを実行すると、LEDドットマトリックスは順番に0から9、AからZまでを表示します。

コード

const Gpio = require('pigpio').Gpio;
const spi = require('spi-device');

class MAX7219_LED_MATRIX {
    constructor(bus, device) {
        this.bus = bus;
        this.device = device;
    }
    delay(ms) {
        return new Promise((resolve, reject) => {setTimeout(resolve, ms)});
    }

    async write(addr, data) {
        return new Promise((resolve, reject)=>{
            const max7219 = spi.open(this.bus, this.device, (err)=>{
                if (err) reject(err);

                const message = [{
                    sendBuffer: Buffer.from([addr, data]),
                    receiveBuffer: Buffer.alloc(2),
                    byteLength: 2,
                    speedHz: 20000
                }];

                max7219.transfer(message, (err, message)=>{
                    if (err) reject(err);
                    else resolve();
                })
            })
        })
    }
    async init() {
        await this.write(0x09, 0x00);
        await this.write(0x0a, 0x03);
        await this.write(0x0b, 0x07);
        await this.write(0x0c, 0x01);
        await this.write(0x0f, 0x00);
    }
}

const DISP=[
    [0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C],//0
    [0x08,0x18,0x28,0x08,0x08,0x08,0x08,0x08],//1
    [0x7E,0x2,0x2,0x7E,0x40,0x40,0x40,0x7E],//2
    [0x3E,0x2,0x2,0x3E,0x2,0x2,0x3E,0x0],//3
    [0x8,0x18,0x28,0x48,0xFE,0x8,0x8,0x8],//4
    [0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C,0x0],//5
    [0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C,0x0],//6
    [0x3E,0x22,0x4,0x8,0x8,0x8,0x8,0x8],//7
    [0x0,0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E],//8
    [0x3E,0x22,0x22,0x3E,0x2,0x2,0x2,0x3E],//9
    [0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22],//A
    [0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0],//B
    [0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0],//C
    [0x7C,0x42,0x42,0x42,0x42,0x42,0x7C,0x0],//D
    [0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C],//E
    [0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x40],//F
    [0x3C,0x40,0x40,0x40,0x40,0x44,0x44,0x3C],//G
    [0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44],//H
    [0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x7C],//I
    [0x3C,0x8,0x8,0x8,0x8,0x8,0x48,0x30],//J
    [0x0,0x24,0x28,0x30,0x20,0x30,0x28,0x24],//K
    [0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C],//L
    [0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81],//M
    [0x0,0x42,0x62,0x52,0x4A,0x46,0x42,0x0],//N
    [0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C],//O
    [0x3C,0x22,0x22,0x22,0x3C,0x20,0x20,0x20],//P
    [0x1C,0x22,0x22,0x22,0x22,0x26,0x22,0x1D],//Q
    [0x3C,0x22,0x22,0x22,0x3C,0x24,0x22,0x21],//R
    [0x0,0x1E,0x20,0x20,0x3E,0x2,0x2,0x3C],//S
    [0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x8],//T
    [0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1C],//U
    [0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18],//V
    [0x0,0x49,0x49,0x49,0x49,0x2A,0x1C,0x0],//W
    [0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41],//X
    [0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8],//Y
    [0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F],//Z
];

lm = new MAX7219_LED_MATRIX(0, 0);

async function main(){
    lm.init();
    while(1){
        for(let j=0;j<36;j++){
            for(let i=1;i<9;i++){
                lm.write(i, DISP[j][i-1]);
            }
            await lm.delay(1000);
        }
    }
}
main();

コード説明

const spi = require('spi-device');

SPI通信に必要なモジュールをインポートします。

注釈

SPI通信が必要な複数のデバイスがある場合、csピンを異なるピンに接続するだけです。

class MAX7219_LED_MATRIX {
    constructor(bus, device) {
        this.bus = bus;
        this.device = device;
    }
    delay(ms) {
        return new Promise((resolve, reject) => {setTimeout(resolve, ms)});
    }

    async write(addr, data) {
        return new Promise((resolve, reject)=>{
            const max7219 = spi.open(this.bus, this.device, (err)=>{
                if (err) reject(err);

                const message = [{
                    sendBuffer: Buffer.from([addr, data]),
                    receiveBuffer: Buffer.alloc(2),
                    byteLength: 2,
                    speedHz: 20000
                }];

                max7219.transfer(message, (err, message)=>{
                    if (err) reject(err);
                    else resolve();
                })
            })
        })
    }

MAX7219_LED_MATRIX クラスを実装し、それにカプセル化された write() 関数でマトリックスを点灯させることができます。

注釈

async キーワードは関数を修飾するために使用され、通常 await キーワードと組み合わせて使用されます。 await キーワードで修飾された文は、実行する前に前のコードが実行完了するのを待つ必要があり、同期的なブロッキングの効果を達成します。

lm = new MAX7219_LED_MATRIX(0, 0);

MAX7219_LED_MATRIX クラスのオブジェクトlmをインスタンス化し、内部のカプセル化された write() 関数を呼び出すことができます。

while(1){
    for(let j=0;j<36;j++){
        for(let i=0;i<8;i++){
            lm.write(i, DISP[j][i]);
        }
        await lm.delay(1000);
    }
}

write(row,date) 関数を使用すると、LEDドットマトリックスに指定した文字を表示できます。 第一引数はLEDマトリックスの行を選択します(合計8行)。 第二引数は、行の8つのLEDを制御する8ビットの2進数を入力します(0はオフ、1はオンを意味します)。

変数 j は、グリフを選択するために使用され、それは DISP[] です。合計35のグリフがあり、0~9およびA~Zがあります。

例えば、j=1の場合、LEDマトリックスは 1 の画像を表示する必要があります。

変数 i は、 DISP[] グリフの8つのデータを順番にLEDマトリックスに書き込むために使用されます。ループが完了すると、8x8のグラフィックが生成されます。

例えば、j=1、i=1の場合、 DISP[1][1] のデータがここに書き込まれます、つまり 0x18 です。 これにより、LEDマトリックスの2行目は 00011000 の画像を表示します。

../_images/led_not.png

現象の画像

../_images/1.1.6led_dot_matrix.JPG