.. note::
¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.
**¿Por qué unirte?**
- **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.
- **Preestrenos Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: 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_c:
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í tienes 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 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:** Construir el circuito.
.. image:: ../img/1.1.6fritzing.png
**Paso 2:** Activa el SPI antes de comenzar el experimento, consulta :ref:`spi_configuration` para más detalles.
**Paso 3:** Ve a la carpeta del código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/1.1.6/
**Paso 4:** Compila el código.
.. raw:: html
.. code-block::
make
**Paso 5:** Ejecuta el archivo ejecutable.
.. raw:: html
.. code-block::
sudo ./1.1.6_LedMatrix
Después de ejecutar el código, la matriz de LED muestra en secuencia un cuadrado, un corazón y los números del 0 al 9.
.. note::
Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", por favor consulta :ref:`install_wiringpi`.
**Código**
.. code-block:: c
#include
#include
#include
#define SPI_CHANNEL 0 // Define SPI channel (0 or 1)
#define SPI_SPEED 1000000 // SPI speed set to 1 MHz
// Function to write data to a MAX7219 register
void max7219_write(unsigned char address, unsigned char data) {
unsigned char buffer[2];
buffer[0] = address; // Register address to write to
buffer[1] = data; // Data to write into the register
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2); // Send data via SPI
}
// Function to initialize the MAX7219 display module
void max7219_init() {
max7219_write(0x09, 0x00); // Decode Mode: No decoding for digits (useful for 7-segment displays)
max7219_write(0x0A, 0x03); // Intensity: Set brightness level (0x00 to 0x0F)
max7219_write(0x0B, 0x07); // Scan Limit: Display digits 0-7 (all 8 digits)
max7219_write(0x0C, 0x01); // Shutdown Register: Normal operation (not in shutdown mode)
max7219_write(0x0F, 0x00); // Display Test: Normal operation (no test mode)
// Clear all digits on the display
for (int i = 1; i <= 8; i++) {
max7219_write(i, 0x00); // Write 0 to each digit register
}
}
// Function to display a pattern on the MAX7219
void max7219_display(unsigned char *data) {
for (int i = 1; i <= 8; i++) {
max7219_write(i, data[i - 1]); // Write each row of the pattern to the display
}
}
// Function to display a pattern for a specified duration
void display_pattern(const unsigned char pattern[8], int delay_ms) {
max7219_display((unsigned char *)pattern); // Display the pattern
delay(delay_ms); // Wait for the specified time in milliseconds
}
// Array of patterns to display
const unsigned char patterns[][8] = {
// Square pattern
{
0b11111111, // Row 1
0b10000001, // Row 2
0b10000001, // Row 3
0b10000001, // Row 4
0b10000001, // Row 5
0b10000001, // Row 6
0b10000001, // Row 7
0b11111111 // Row 8
},
// Heart pattern
{
0b01100110, // Row 1
0b11111111, // Row 2
0b11111111, // Row 3
0b11111111, // Row 4
0b01111110, // Row 5
0b00111100, // Row 6
0b00011000, // Row 7
0b00000000 // Row 8
},
// Number 0
{
0b00111100, // Row 1
0b01100110, // Row 2
0b11000011, // Row 3
0b11000011, // Row 4
0b11000011, // Row 5
0b11000011, // Row 6
0b01100110, // Row 7
0b00111100 // Row 8
},
// Number 1
{
0b00011000, // Row 1
0b00111000, // Row 2
0b01111000, // Row 3
0b00011000, // Row 4
0b00011000, // Row 5
0b00011000, // Row 6
0b01111110, // Row 7
0b01111110 // Row 8
},
// Number 2
{
0b01111110, // Row 1
0b11000011, // Row 2
0b00000011, // Row 3
0b00001110, // Row 4
0b00110000, // Row 5
0b11000000, // Row 6
0b11111111, // Row 7
0b00000000 // Row 8
},
// Number 3
{
0b01111110, // Row 1
0b11000011, // Row 2
0b00000011, // Row 3
0b00111110, // Row 4
0b00000011, // Row 5
0b11000011, // Row 6
0b01111110, // Row 7
0b00000000 // Row 8
},
// Number 4
{
0b00001110, // Row 1
0b00011110, // Row 2
0b00110110, // Row 3
0b01100110, // Row 4
0b11111111, // Row 5
0b00000110, // Row 6
0b00000110, // Row 7
0b00000000 // Row 8
},
// Number 5
{
0b11111111, // Row 1
0b11000000, // Row 2
0b11111110, // Row 3
0b00000011, // Row 4
0b00000011, // Row 5
0b11000011, // Row 6
0b01111110, // Row 7
0b00000000 // Row 8
},
// Number 6
{
0b00111110, // Row 1
0b01100000, // Row 2
0b11000000, // Row 3
0b11111110, // Row 4
0b11000011, // Row 5
0b11000011, // Row 6
0b01111110, // Row 7
0b00000000 // Row 8
},
// Number 7
{
0b11111111, // Row 1
0b11000011, // Row 2
0b00000110, // Row 3
0b00001100, // Row 4
0b00011000, // Row 5
0b00110000, // Row 6
0b00110000, // Row 7
0b00000000 // Row 8
},
// Number 8
{
0b01111110, // Row 1
0b11000011, // Row 2
0b11000011, // Row 3
0b01111110, // Row 4
0b11000011, // Row 5
0b11000011, // Row 6
0b01111110, // Row 7
0b00000000 // Row 8
},
// Number 9
{
0b01111110, // Row 1
0b11000011, // Row 2
0b11000011, // Row 3
0b01111111, // Row 4
0b00000011, // Row 5
0b00000110, // Row 6
0b01111100, // Row 7
0b00000000 // Row 8
},
};
int main() {
if (wiringPiSetup() == -1) {
printf("Failed to initialize WiringPi\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Failed to initialize SPI\n");
return 1;
}
max7219_init(); // Initialize the MAX7219 module
// Display patterns in a loop
while (1) {
// Display the square pattern
display_pattern(patterns[0], 1000); // Display for 1000 milliseconds
// Display the heart pattern
display_pattern(patterns[1], 1000);
// Display numbers 0-9
for (int i = 2; i <= 11; i++) {
display_pattern(patterns[i], 1000);
}
}
return 0;
}
**Análisis de Código**
#. Archivos de Cabecera:
* ``wiringPi.h``: Proporciona funciones para el control de GPIO.
* ``wiringPiSPI.h``: Proporciona funciones para la comunicación SPI.
* ``stdio.h``: Biblioteca estándar de entrada/salida para funciones como printf.
#. Definiciones:
* ``SPI_CHANNEL``: Especifica el canal SPI (0 o 1) utilizado para la comunicación.
* ``SPI_SPEED``: Establece la velocidad de comunicación SPI a 1 MHz.
.. code-block:: c
#define SPI_CHANNEL 0 // Define el canal SPI (0 o 1)
#define SPI_SPEED 1000000 // Velocidad SPI establecida en 1 MHz
#. Función ``max7219_write``: Envía datos a un registro específico del controlador de pantalla MAX7219.
* ``address``: La dirección del registro a escribir.
* ``data``: Los datos a escribir en el registro.
* Crea un buffer que contiene la dirección y los datos.
* Usa ``wiringPiSPIDataRW`` para enviar el buffer por SPI.
.. code-block:: c
void max7219_write(unsigned char address, unsigned char data) {
unsigned char buffer[2];
buffer[0] = address; // Dirección del registro para escribir
buffer[1] = data; // Datos para escribir en el registro
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 2); // Enviar datos vía SPI
}
#. Función ``max7219_init``: Inicializa el módulo de pantalla MAX7219 con configuraciones necesarias.
* Configura el modo de decodificación a "sin decodificación" ya que estamos controlando los LEDs directamente.
* Ajusta la intensidad (brillo) a un nivel moderado (0x03).
* Establece el límite de escaneo en 7 para habilitar los 8 dígitos (filas) de la pantalla.
* Sale del modo de apagado para encender la pantalla.
* Desactiva el modo de prueba de pantalla.
* Limpia la pantalla escribiendo 0x00 en todos los registros de dígitos.
.. code-block:: c
void max7219_init() {
max7219_write(0x09, 0x00); // Modo de decodificación: Sin decodificación para dígitos (útil para pantallas de 7 segmentos)
max7219_write(0x0A, 0x03); // Intensidad: Establecer nivel de brillo (0x00 a 0x0F)
max7219_write(0x0B, 0x07); // Límite de escaneo: Mostrar dígitos 0-7 (todos los 8 dígitos)
max7219_write(0x0C, 0x01); // Registro de apagado: Operación normal (no en modo de apagado)
max7219_write(0x0F, 0x00); // Prueba de pantalla: Operación normal (sin modo de prueba)
// Limpiar todos los dígitos en la pantalla
for (int i = 1; i <= 8; i++) {
max7219_write(i, 0x00); // Escribir 0 en cada registro de dígito
}
}
#. Función ``max7219_display``: Actualiza la pantalla con un patrón de 8 bytes dado.
* ``data``: Un arreglo que contiene el patrón a mostrar.
* Itera a través de cada una de las 8 filas (dígitos) y escribe los datos correspondientes.
.. code-block:: c
void max7219_display(unsigned char *data) {
for (int i = 1; i <= 8; i++) {
max7219_write(i, data[i - 1]); // Escribir cada fila del patrón en la pantalla
}
}
#. Función ``display_pattern``: Muestra un patrón durante un tiempo específico.
* ``pattern``: El patrón a mostrar (arreglo de 8 bytes).
* ``delay_ms``: Duración para mostrar el patrón en milisegundos.
* Llama a ``max7219_display`` para mostrar el patrón.
* Usa ``delay`` para esperar durante la duración especificada.
.. code-block:: c
void display_pattern(const unsigned char pattern[8], int delay_ms) {
max7219_display((unsigned char *)pattern); // Mostrar el patrón
delay(delay_ms); // Esperar el tiempo especificado en milisegundos
}
#. Patrones de Arreglos:
* Contiene patrones predefinidos para el cuadrado, corazón y números del 0 al 9.
* Cada patrón es un arreglo de 8 bytes, representando 8 filas de la matriz LED de 8x8.
* Cada byte usa notación binaria donde cada bit representa un LED (1 para encendido, 0 para apagado).
.. code-block:: c
const unsigned char patterns[][8] = {
// Patrón cuadrado
{
0b11111111, // Fila 1
0b10000001, // Fila 2
0b10000001, // Fila 3
0b10000001, // Fila 4
0b10000001, // Fila 5
0b10000001, // Fila 6
0b10000001, // Fila 7
0b11111111 // Fila 8
},
...
// Número 9
{
...
},
};
#. Función main:
* Inicializa ``WiringPi`` y la interfaz ``SPI``.
.. code-block:: c
if (wiringPiSetup() == -1) {
printf("Error al inicializar WiringPi\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("Error al inicializar SPI\n");
return 1;
}
* Llama a ``max7219_init`` para configurar el módulo MAX7219.
.. code-block:: c
max7219_init(); // Inicializar el módulo MAX7219
* Entra en un bucle infinito para mostrar los patrones continuamente. Muestra cada patrón durante 1 segundo antes de pasar al siguiente.
.. code-block:: c
while (1) {
// Mostrar el patrón cuadrado
display_pattern(patterns[0], 1000); // Mostrar durante 1000 milisegundos
// Mostrar el patrón de corazón
display_pattern(patterns[1], 1000);
// Mostrar números del 0 al 9
for (int i = 2; i <= 11; i++) {
display_pattern(patterns[i], 1000);
}
}
**Comprensión de los Patrones**
* Representación Binaria:
* Cada patrón se define usando literales binarios (prefijo 0b).
* Cada byte corresponde a una fila en la matriz LED de 8x8.
* Cada bit dentro del byte representa una columna (LED) en esa fila.
* El bit más significativo (a la izquierda) corresponde al primer LED a la izquierda.
* Creación de Patrones Personalizados:
* Puedes crear nuevos patrones definiendo nuevos arreglos de 8 bytes.
* Cada patrón puede añadirse al arreglo de patrones.
* Actualiza el bucle de visualización en main para incluir tus nuevos patrones.
**Ajustes y Personalización**
* Cambiar el Brillo: Modifica el nivel de intensidad en ``max7219_init``:
.. code-block:: c
max7219_write(0x0A, brightness_level); // brillo entre 0x00 y 0x0F
* Modificar el Tiempo de Visualización: Cambia el parámetro ``delay_ms`` en las llamadas a ``display_pattern`` para ajustar el tiempo de visualización de cada patrón.
Imagen del Fenómeno
-----------------------
.. image:: ../img/1.1.6led_dot_matrix.JPG