.. note:: ¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprende y comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Vistas previas exclusivas**: Obtén acceso anticipado a anuncios de nuevos productos y avances. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones festivas y sorteos**: Participa en sorteos y promociones de temporada. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo! .. _1.1.6_js: 1.1.6 Módulo de Matriz de LED ===================================== Introducción ---------------- En este proyecto, aprenderás sobre el Módulo de Matriz de LED. Este módulo utiliza el controlador MAX7219 para manejar la Matriz de LED de 8 x 8. Componentes Necesarios --------------------------- En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list_dot.png Es definitivamente conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ELEMENTOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los enlaces a continuación. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :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| Diagrama Esquemático ------------------------- ================== ======== ======== ==== Nombre del T-Board físico wiringPi BCM SPIMOSI Pin 19 12 MOSI SPICE0 pin 24 10 CE0 SPISCLK Pin 23 14 SCLK ================== ======== ======== ==== .. image:: ../img/schematic_dot.png Procedimientos Experimentales --------------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/1.1.6fritzing.png .. note:: Activa el SPI antes de comenzar el experimento, consulta :ref:`spi_configuration` para más detalles. **Paso 2:** Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/nodejs/ **Paso 3:** Instala las dependencias. .. raw:: html .. code-block:: sudo npm install spi-device **Paso 4:** Ejecuta el código. .. raw:: html .. code-block:: sudo node max7219_led_matrix.js Después de ejecutar el código, la Matriz de LED muestra del 0 al 9 y de la A a la Z en secuencia. **Código** .. 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(); **Explicación del Código** .. code-block:: js const spi = require('spi-device'); Importar los módulos necesarios para la comunicación SPI. .. note:: Cuando tengas múltiples dispositivos que necesiten comunicación SPI, solo conecta los pines CS a diferentes pines. .. 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(); }) }) }) } Implementar una clase ``MAX7219_LED_MATRIX``, y la función ``write()`` encapsulada en ella puede iluminar la matriz. .. note:: La palabra clave ``async`` se usa para modificar la función y generalmente se combina con la palabra clave ``await``. La declaración modificada por la palabra clave ``await`` necesita esperar a que el código anterior termine de ejecutarse antes de continuar, logrando el efecto de bloqueo sincrónico. * `Función Asíncrona `_ .. code-block:: js lm = new MAX7219_LED_MATRIX(0, 0); Instanciar un objeto lm de la clase ``MAX7219_LED_MATRIX``, para que podamos llamar a la función ``write()`` encapsulada en su interior. .. 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); } } La función ``write(row, date)`` te permite mostrar caracteres especificados en la matriz de puntos LED. El primer parámetro selecciona la fila de la Matriz LED (un total de 8 filas). El segundo parámetro ingresa un número binario de 8 bits para controlar los 8 LEDs de la fila (0 significa apagado, 1 significa encendido). La variable ``j`` se usa para seleccionar el glifo, que es ``DISP[]``. Hay un total de 35 glifos, del 0 al 9 y de la A a la Z. Por ejemplo, cuando j=1, la Matriz LED debería mostrar la imagen **1**. La variable ``i`` se usa para escribir los 8 datos en el glifo ``DISP[]`` en la Matriz LED en orden. Después de completar el bucle, se puede generar un gráfico de 8x8. Por ejemplo, cuando j=1, i=1, se escribirá aquí el dato de ``DISP[1][1]``, que es ``0x18``, Esto hará que la segunda fila de la Matriz LED muestre la imagen ``00011000``. .. image:: ../img/led_not.png :width: 400 Imagen del Fenómeno ----------------------- .. image:: ../img/1.1.6led_dot_matrix.JPG