.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
.. _1.1.6_js:
1.1.6 LEDドットマトリックスモジュール
======================================
はじめに
--------------------
このプロジェクトでは、LEDマトリックスモジュールについて学びます。LEDマトリックスモジュールは、MAX7219ドライバを使用して8 x 8のLEDマトリックスを駆動します。
必要な部品
------------------------------
このプロジェクトには、以下の部品が必要です。
.. image:: ../img/list_dot.png
一式を購入するのは非常に便利です。リンクは以下の通りです:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - 名前
- このキットのアイテム
- リンク
* - Raphael Kit
- 337
- |link_Raphael_kit|
以下のリンクから別々に購入することもできます。
.. list-table::
:widths: 30 20
:header-rows: 1
* - コンポーネントの紹介
- 購入リンク
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_dot_matrix`
- |link_led_matrix_buy|
回路図
-----------------------
============ ======== ======== ====
T-Board Name physical wiringPi BCM
SPIMOSI Pin 19 12 MOSI
SPICE0 pin 24 10 CE0
SPISCLK Pin 23 14 SCLK
============ ======== ======== ====
.. image:: ../img/schematic_dot.png
実験手順
----------------------------
**ステップ1:** 回路を組み立てます。
.. image:: ../img/1.1.6fritzing.png
.. note::
実験を開始する前にSPIをオンにします。詳細は :ref:`spi_configuration` を参照してください。
**ステップ2:** コードのフォルダに移動します。
.. raw:: html
.. code-block::
cd ~/raphael-kit/nodejs/
**ステップ3:** 依存関係をインストールします。
.. raw:: html
.. code-block::
sudo npm install spi-device
**ステップ4:** コードを実行します。
.. raw:: html
.. code-block::
sudo node max7219_led_matrix.js
コードを実行すると、LEDドットマトリックスは順番に0から9、AからZまでを表示します。
**コード**
.. code-block:: js
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();
**コード説明**
.. code-block:: js
const spi = require('spi-device');
SPI通信に必要なモジュールをインポートします。
.. note::
SPI通信が必要な複数のデバイスがある場合、csピンを異なるピンに接続するだけです。
.. code-block:: js
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()`` 関数でマトリックスを点灯させることができます。
.. note::
``async`` キーワードは関数を修飾するために使用され、通常 ``await`` キーワードと組み合わせて使用されます。 ``await`` キーワードで修飾された文は、実行する前に前のコードが実行完了するのを待つ必要があり、同期的なブロッキングの効果を達成します。
* `非同期関数 `_
.. code-block:: js
lm = new MAX7219_LED_MATRIX(0, 0);
``MAX7219_LED_MATRIX`` クラスのオブジェクトlmをインスタンス化し、内部のカプセル化された ``write()`` 関数を呼び出すことができます。
.. code-block:: js
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`` の画像を表示します。
.. image:: ../img/led_not.png
:width: 400
現象の画像
-----------------------
.. image:: ../img/1.1.6led_dot_matrix.JPG