.. note::
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a 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.
- **Avances Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.
- **Descuentos Especiales**: Aprovecha descuentos exclusivos en nuestros productos más recientes.
- **Promociones Festivas y Sorteos**: Participa en sorteos y promociones especiales.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo.
.. _1.1.6_py_pi5:
1.1.6 Matriz de Puntos LED
=============================
Introducción
------------------
Como sugiere el nombre, una matriz de puntos LED es una matriz compuesta por LEDs.
El encendido y apagado de los LEDs permite formar diferentes caracteres y patrones.
Componentes Necesarios
--------------------------
Para este proyecto, necesitamos los siguientes componentes.
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_list.png
:width: 800
:align: center
.. raw:: html
Principio
--------------
**Matriz de Puntos LED**
En general, las matrices de puntos LED pueden categorizarse en dos tipos:
cátodo común (CC) y ánodo común (CA). Su aspecto es similar, pero internamente
presentan diferencias. Puedes distinguirlas realizando una prueba. En este kit
utilizamos una de tipo CA. Puedes ver que está etiquetada con 788BS en el lateral.
Observa la figura a continuación. Los pines están dispuestos en ambos extremos de
la parte posterior. Usando la etiqueta lateral como referencia: los pines en este
extremo son del 1 al 8, y en el otro extremo del 9 al 16.
Vista externa:
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_1.png
:width: 400
:align: center
En las siguientes figuras se muestra su estructura interna. Puedes ver que en
una matriz de puntos LED CA, la fila (ROW) representa el ánodo del LED y la
columna (COL) el cátodo; en una CC es al contrario. Un punto en común para ambos
tipos: en ambos casos, los pines 13, 3, 4, 10, 6, 11, 15 y 16 corresponden a COL,
mientras que los pines 9, 14, 8, 12, 1, 7, 2 y 5 corresponden a ROW. Si deseas
encender el primer LED en la esquina superior izquierda, para una matriz LED CA
solo debes configurar el pin 9 en alto y el pin 13 en bajo; para una matriz CC,
configura el pin 13 en alto y el pin 9 en bajo. Si deseas iluminar toda la primera
columna, en una CA, configura el pin 13 en bajo y los pines de ROW 9, 14, 8, 12, 1, 7, 2 y 5
en alto; en una CC, configura el pin 13 en alto y los de ROW en bajo. Consulta las siguientes
figuras para una mejor comprensión.
Vista interna:
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_2.png
:width: 400
:align: center
Numeración de pines correspondiente a las filas y columnas anteriores:
=========== ====== ====== ===== ====== ===== ====== ====== ======
**COL** **1** **2** **3** **4** **5** **6** **7** **8**
**Pin No.** **13** **3** **4** **10** **6** **11** **15** **16**
**ROW** **1** **2** **3** **4** **5** **6** **7** **8**
**Pin No.** **9** **14** **8** **12** **1** **7** **2** **5**
=========== ====== ====== ===== ====== ===== ====== ====== ======
Además, aquí se utilizan dos chips 74HC595. Uno controla las filas de la
matriz de puntos LED mientras que el otro controla las columnas.
Diagrama de Conexiones
---------------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
============ ======== ======== ===
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_schematic.png
:width: 800
Procedimientos del Experimento
----------------------------------
**Paso 1:** Construye el circuito. Dado que el cableado es complejo, haremos
el proceso paso a paso. Primero, inserta el T-Cobbler, la matriz de puntos LED
y los dos chips 74HC595 en la protoboard. Conecta el pin 3.3V y el GND del
T-Cobbler a los agujeros en los dos lados de la placa, luego conecta los pines
16 y 10 de los dos chips 74HC595 a VCC, y los pines 13 y 8 a GND.
.. note::
En la imagen Fritzing anterior, el lado con la etiqueta está en la parte inferior.
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_1.png
:width: 800
**Paso 2:** Conecta el pin 11 de los dos chips 74HC595 entre sí y luego a GPIO27;
luego el pin 12 de ambos chips a GPIO18; después, el pin 14 del 74HC595 en el lado
izquierdo a GPIO17 y el pin 9 al pin 14 del segundo 74HC595.
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_2.png
:width: 800
**Paso 3:** El 74HC595 en el lado derecho controla las columnas de la matriz de puntos LED.
Consulta la tabla a continuación para el mapeo. Por lo tanto, los pines Q0-Q7 del 74HC595
están mapeados con los pines 13, 3, 4, 10, 6, 11, 15 y 16 respectivamente.
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **74HC595** | **Q0** | **Q1** | **Q2** | **Q3** | **Q4** | **Q5** | **Q6** | **Q7** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **LED Dot Matrix** | **13** | **3** | **4** | **10** | **6** | **11** | **15** | **16** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_3.png
:width: 800
**Paso 4:** Ahora conecta las filas (ROW) de la matriz de puntos LED. El 74HC595
en el lado izquierdo controla ROW de la matriz LED. Consulta la tabla a continuación
para el mapeo. Como se observa, los pines Q0-Q7 del 74HC595 en el lado izquierdo están
mapeados con los pines 9, 14, 8, 12, 1, 7, 2 y 5 respectivamente.
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **74HC595** | **Q0** | **Q1** | **Q2** | **Q3** | **Q4** | **Q5** | **Q6** | **Q7** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **LED Dot Matrix** | **9** | **14** | **8** | **12** | **1** | **7** | **2** | **5** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_4.png
:width: 800
**Paso 5:** Abre el archivo de código.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Paso 6:** Ejecuta.
.. raw:: html
.. code-block::
sudo python3 1.1.6_led_dot_matrix.py
Al ejecutar el código, la matriz de puntos LED se encenderá y apagará fila por fila y columna por columna.
.. warning::
Si aparece el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc`
**Código**
.. note::
Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, debes ir a la ruta del código fuente como ``davinci-kit-for-raspberry-pi/python-pi5``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
# Definir los pines GPIO conectados al registro de desplazamiento 74HC595
SDI = OutputDevice(17) # Entrada de Datos en Serie
RCLK = OutputDevice(18) # Reloj de Registro
SRCLK = OutputDevice(27) # Reloj de Registro de Desplazamiento
# Definir patrones para mostrar en la matriz; ROWs son ánodos (+), COLs son cátodos (-)
# Patrón para ROWs (señales de ánodo)
code_H = [0x01, 0xff, 0x80, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
# Patrón para COLs (señales de cátodo)
code_L = [0x00, 0x7f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f]
# Desplazar datos al 74HC595
def hc595_shift(dat):
""" Shift data to the 74HC595 shift register for displaying on the matrix. """
for i in range(8):
# Configurar valor de SDI y activar reloj de registro de desplazamiento
SDI.value = 0x80 & (dat << i)
SRCLK.on()
SRCLK.off()
# Activar reloj de registro para actualizar la pantalla
RCLK.on()
sleep(0.001)
RCLK.off()
def main():
""" Main loop for cycling through display patterns. """
while True:
# Recorrer patrones en orden ascendente
for i in range(len(code_H)):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# Recorrer patrones en orden descendente
for i in range(len(code_H)-1, -1, -1):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# Ejecutar bucle principal, manejar interrupción de teclado de forma segura
try:
main()
except KeyboardInterrupt:
pass
**Explicación del Código**
#. Este fragmento importa las clases necesarias para el proyecto. ``OutputDevice`` de ``gpiozero`` se utiliza para controlar los componentes de hardware conectados a los pines GPIO, y ``sleep`` de ``time`` para agregar demoras.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
#. Esta sección inicializa los pines GPIO conectados al registro de desplazamiento 74HC595. ``SDI`` es la Entrada de Datos en Serie, ``RCLK`` es el Reloj de Registro, y ``SRCLK`` es el Reloj de Registro de Desplazamiento. Estos pines se usan para desplazar datos en el registro y controlar la visualización de la matriz LED.
.. code-block:: python
# Definir pines GPIO conectados al registro de desplazamiento 74HC595
SDI = OutputDevice(17) # Entrada de Datos en Serie
RCLK = OutputDevice(18) # Reloj de Registro
SRCLK = OutputDevice(27) # Reloj de Registro de Desplazamiento
#. ``code_H`` y ``code_L`` definen patrones binarios para controlar las filas (ánodos) y columnas (cátodos) de la matriz LED, respectivamente. Cada elemento en estos arrays representa un patrón binario que controla qué LEDs se encienden o apagan en la matriz.
.. code-block:: python
# Definir patrones para mostrar en la matriz; ROWs son ánodos (+), COLs son cátodos (-)
# Patrón para ROWs (señales de ánodo)
code_H = [0x01, 0xff, 0x80, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
# Patrón para COLs (señales de cátodo)
code_L = [0x00, 0x7f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f]
#. Esta función desplaza un byte de datos (``dat``) en el registro de desplazamiento 74HC595. Itera sobre cada bit del byte, configurando el pin ``SDI`` en alto o bajo según el valor del bit y activa el pin ``SRCLK`` para desplazar el bit en el registro. Después de desplazar todos los bits, activa el pin ``RCLK`` para actualizar la visualización de la matriz LED.
.. code-block:: python
# Desplazar datos al 74HC595
def hc595_shift(dat):
""" Shift data to the 74HC595 shift register for displaying on the matrix. """
for i in range(8):
# Configurar valor de SDI y activar reloj de registro de desplazamiento
SDI.value = 0x80 & (dat << i)
SRCLK.on()
SRCLK.off()
# Activar reloj de registro para actualizar la pantalla
RCLK.on()
sleep(0.001)
RCLK.off()
#. La función principal contiene un bucle infinito que recorre patrones predefinidos para la matriz LED. Utiliza la función ``hc595_shift`` para enviar patrones de filas y columnas (``code_H`` y ``code_L``) al registro de desplazamiento, primero en orden ascendente y luego en descendente, creando una visualización dinámica.
.. code-block:: python
def main():
""" Main loop for cycling through display patterns. """
while True:
# Recorrer patrones en orden ascendente
for i in range(len(code_H)):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# Recorrer patrones en orden descendente
for i in range(len(code_H)-1, -1, -1):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
#. Este segmento asegura que el programa pueda interrumpirse usando una interrupción de teclado (Ctrl+C). Sale del bucle principal sin interrupciones abruptas o fugas de recursos.
.. code-block:: python
# Ejecutar bucle principal, manejar interrupción de teclado de forma segura
try:
main()
except KeyboardInterrupt:
pass