Autor Tema: Librería Matríz de LEDs Universal[compilador CCS]  (Leído 13396 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Librería Matríz de LEDs Universal[compilador CCS]
« en: 14 de Mayo de 2010, 15:29:21 »
Empiezo con lo que intento, espero y anhelo será una librería universal y básica para realizar matrices de LEDs. Debido a la gran variedad de configuraciones posibles para realizar una matriz, he optado por dotarla de cierta flexibilidad, aunque no absoluta, espero sea suficiente para la mayoría de los proyectos requeridos de este tipo.

Dudas y comentarios sobre la librería: Librería Matríz de LEDs Universal[compilador CCS](Aportes y Comentarios)

Alcances de la librería:
[incompleto]

Rangos máximos de configuración de la librería:
Mínimas Filas de la matriz: 7
Máximas Filas de la matriz: 16
Máximas Columnas de la matriz: 255 (con posibilidades de ser expandida)

Arranco un repositorio que irá versionando y organizando un poco los avances. Empezaré desde lo más básico que será el hardware mínimo y mostrar algo estático en mi matriz modelo(que será de 7x80) pero motivo a que otros generen y prueben otras configuraciones.

Dirección del repositorio: http://github.com/brunof/LED-Matrix-Library
Descarga la ultima versión en zip o en tar

También se adjuntará un archivo de proteus para poder simular el funcionamiento.

Es posible que el repositorio se divida(surjan branches) para poder abarcar otros tipos de displays u otras configuraciones.

Estén bienvenidos a aportar su granito de código. Puede ser desde cosas sencillas como comentar líneas de código para que queden mejor explicadas hasta agregar nuevas ideas, módulos, efectos, configuraciones, optimizaciones, código en general, cambios de hardware y demás.

Arrancando, entonces.

Explicación del hardware utilizado:

FILAS comandando los ánodos(+) de los LEDs y COLUMNAS comandando los CATODOS(-);
* Si su lógica es distinta, pueden cambiar la configuración correspondiente en el archivo config.h y al recompilar la libreria esta debería funcionar adecuamente.
Mi matriz de ejemplo será de 7 FILAS y 80 COLUMNAS;

Esquemático:[incompleto]


Principio de funcionamiento:[incompleto]

Log de versiones:
v0.2.0 Primera versión funcional. Grafico estático. Sólo para familiarizarse con el funcionamiento. Explicación Pendiente.
« Última modificación: 15 de Mayo de 2010, 13:43:50 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Librería Matríz de LEDs Universal[compilador CCS]
« Respuesta #1 en: 15 de Mayo de 2010, 13:14:51 »
Hardware utilizado:

Mi matriz modelo dispone de 8 Filas y 80 Columnas. Esto significa que tengo un total de 640 LEDs a comandar.
Debido a la gran cantidad de pines que requeriría comandar uno por uno, se opta por multiplexar los mísmos.

La multiplexación implica que cada LED compartirá,en mi caso, su pin positivo(ánodo) con los otros 79 LEDs ubicados en la mísma fila y su pin negativo(cátodo) con los otros 7 LEDs ubicados en su mísma columna. Esto permitirá que sea posible comandar cada LED individualmente. Pero todo tiene su precio. El precio que debemos pagar por la multiplexación es que también multiplexamos el tiempo que estos LEDs permanecerán encendidos. Al igual que una TV CRT, se hará un refresco, fila a fila, que irá formando la imágen completa ayudado por una velocidad de refresco suficiente como para engañar al ojo humano y que el mísmo la vea en su totalidad debido al efecto de persistencia de la visión.

Si queremos ver más de cerca cómo se va produciendo el refresco fila a fila, podemos ir al archivo de simulación y haciendo click derecho en las propiedades del uC(que en mi caso es el 18F2550) bajar la velocidad del clock a 100Khz. Esto permitirá poder visualizar mejor el refresco.


Aún multiplexando, la matriz modelo lograda posee 8 lineas de control de filas y 80 de columnas. Por lo que necesita un total de 88 líneas individuales de control. Si bien existen uCs que tienen esta o más capacidad, podemos apoyarnos en registros de desplazamiento(shift registers) para dotar de más salidas a un uC que no posea las suficientes. La teoría de los registros de desplazamiento ha sido explicada de manera vasta y abundante aquí y en otros sitios por lo que será prácticamente obviada y quedará de tarea para quien todavía no está familarizado con su funcionamiento.
El control lógico de las filas también es comandado por un registro de desplazamiento por lo que utilizando registros de desplazamiento lograremos reducir la cantidad inicial de 88 líneas a sólo 3: una línea de DATOS, una de CLOCK y una de STROBE.

Ahora, necesitamos analizar cómo se realiza el refresco algorítmicamente. Este creo que es un tema que ha provocado dolores de cabeza a más de uno. Vamos con el código entonces.
Básicamente disponemos de
1) Un buffer, que será un arreglo que se contiene la información a mostrar. Un bit por LED en este caso de matriz monocromática y sin niveles de grises. El tamaño del búffer estará determinado por dos constantes configurables en tiempo de compilación: FILAS y COLUMNAS. Ellas son las que generarán el buffer adecuado según los valores que les otorgue a estas dos constantes.


buffer[0].0buffer[1].0buffer[2].0buffer[3].0buffer[4].0buffer[5].0buffer[6].0buffer[7].0buffer[8].0buffer[...].0buffer[...].0buffer[COLUMNAS-1].0
buffer[0].1buffer[1].1buffer[2].1buffer[3].1buffer[4].1buffer[5].1buffer[6].1buffer[7].1buffer[8].1buffer[...].1buffer[...].1buffer[COLUMNAS-1].1
buffer[0].2buffer[1].2buffer[2].2buffer[3].2buffer[4].2buffer[5].2buffer[6].2buffer[7].2buffer[8].2buffer[...].2buffer[...].2buffer[COLUMNAS-1].2
buffer[0].3buffer[1].3buffer[2].3buffer[3].3buffer[4].3buffer[5].3buffer[6].3buffer[7].3buffer[8].3buffer[...].3buffer[...].3buffer[COLUMNAS-1].3
buffer[0].4buffer[1].4buffer[2].4buffer[3].4buffer[4].4buffer[5].4buffer[6].4buffer[7].4buffer[8].4buffer[...].4buffer[...].4buffer[COLUMNAS-1].4
buffer[0].5buffer[1].5buffer[2].5buffer[3].5buffer[4].5buffer[5].5buffer[6].5buffer[7].5buffer[8].5buffer[...].5buffer[...].5buffer[COLUMNAS-1].5
buffer[0].6buffer[1].6buffer[2].6buffer[3].6buffer[4].6buffer[5].6buffer[6].6buffer[7].6buffer[8].6buffer[...].6buffer[...].6buffer[COLUMNAS-1].6
buffer[0].7buffer[1].7buffer[2].7buffer[3].7buffer[4].7buffer[5].7buffer[6].7buffer[7].7buffer[8].7buffer[...].7buffer[...].7buffer[COLUMNAS-1].7

Tómese 2,10 y más minutos para analizar esta tabla. Fíjese como cada LED de la matriz se asocia según su posición a un determinado bit del arreglo "buffer". Es imprescindible que usted logre asociar esto para poder comprender el funcionamiento de la matriz. Un bit puede poseer dos estados: 0 o 1. El LED también puede tener dos estados: Apagado o Encendido.
Entonces he generado una relación entre cada LED y un bit del arreglo, según su ubicación dentro de ella.



Pausa hasta continuación...
« Última modificación: 15 de Mayo de 2010, 13:29:06 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything