CT.4: Control de LEDs - Obijuan/Cuadernos-tecnicos-FPGAs-libres GitHub Wiki
Descripción
La intensidad del brillo de los LEDs la podemos controlar de forma analógica, usando señales PWM. Mediante los nuevos bloques que se muestra en este cuadernos podremos cambiar el brillo y generar fácilmente efectos de fundido y desvanecimiento
Historial
- 2019-Mayo-24: Version inicial del cuaderno técnico
- 2024-Abril-06:
- Ejemplos adaptados a la nueva toolchain: apio-0.9.3. Eliminado el error en la verificación. Probados con icestudio 0.11.3wip (futura versión 0.12). Los pantallazos de los ejemplos no se han actualizado todavía
- Todos los bloques se han movido a la colección iceLEDs. Previamente estaban en la colección Jedi
Vídeo
- Fecha: 2019/Mayo/29
Haz click en la imagen para ver el vídeo en Youtube
Colecciones y ejemplos
- Colección iceLEDs: Colección para este cuaderno técnico. Descargar e instalar
- Todos los ejemplos están disponibles en este repositorio
Contenido
- Introducción
- Agrupando LEDs
- Estableciendo el brillo de los LEDs
- Variando el brillo en los LEDs: Desvanecimientos y fundidos
- Brillo y buses
- Conclusiones
- Descargas
- Autor
- Licencia
- Créditos y agradecimientos
- Enlaces
Introducción
Los LEDs los utilizamos muchísimo en electrónica digital para mostrar el estado de las señañes digitales de baja frecuencia. Cuando la señal está a 1, el LED se enciende, y cuando está a 0 se apaga. En el cuaderno técnico sobre PWM aprendimos a variar su intensidad
En este cuadernos vamos a aprender sobre bloques específicos para trabajar con los LEDs de manera "analógica", fijando su intensidad a valores constantes y haciéndola variar para conseguir efectos de desvanecimiento (fade out) o fundido (fade in)
Agrupando LEDs
Las pruebas las haremos con los 8 LEDs internos de la Alhambra II. Para apreciar mejor las intensidades del brillo, agruparemos LEDs adyacentes para construir un LED mayor
Ejemplo 1: Un LED brillando a su máxima intesidad
Comenzamos por lo que ya conocemos: encender un único LED a su máxima intesidad. El hola mundo de toda la vida :-)
Al cargarlo en la placa vemos que el LED0 permanece encendido, luciendo a su máxima intensidad
Ejemplo 2-1: Grupo de dos LEDs, a su máxima intesidad
Para crear un grupo de dos LEDs, no hay más que usar dos pines de salida para la conexión de los LEDs y un cable que se bifurque en dos. El control del grupo lo hacemos con un único bit, que llega a ambos LEDs. El estado del grupo lo define este bit
(Ejemplo-02-1-grupo-dos-leds.ice)
Lo cargamos y probamos. No hay nada espcial: Los dos LEDs, 0 y 1, se encienden con su máxima intensidad. Estos ejemplos ya los conocemos y hemos hecho muchos
Ejemplo 2-2: Grupo de dos LEDs, con bloque multiplicador de cables
Otra manera de agrupar los LEDs es utilizar salidas de bus, con el grupo de LEDs, y usar el bloque multiplicador de cables conectado a ese bus. Para obtener el grupo del ejemplo anterior, de dos LEDs, usamos el bloque copy-02, de la colección icewires
Es un circuito pasivo, en el que entra un cable y se sacan varios cable de salida a partir de él. Todos los cables de salida llevan la misma señal. Este es el mismo circuito del ejemplo 2-1 pero usando un bloque multiplicador de cables, de 2 bits
(Ejemplo-02-2-grupo-dos-leds.ice)
Ejemplo 3: Grupo de ocho LEDs, con bloque multiplicador de cables
Este es el mismo ejemplo, pero con un grupo de 8 LEDs. Se encienden todos los LEDs con su máxima intensidad, y se usa un bloque multiplicador de cables de 8 bits, con salida de bus. Disponible en Varios/Bus/8_bits/mult-1-8-bus
(Ejemplo-03-grupo-ocho-leds.ice)
Lo cargamos y lo probamos. Los 8 LEDs se encienden
Ejemplo 4: Parpadeo de un grupo de 8 LEDs
Si ahora queremos que parpadeen, colocamos un corazón para bombear los bits, exactamente igual que hacemo cuando hay sólo un LED. Las intensidades de los 8 LED varían entre la máxima y la mínima (apagados)
(Ejemplo-04-grupo-ocho-leds-parpadeo.ice)
Lo cargamos y lo probamos. En este vídeo se muestra el resultado. Los 8 LEDs parpadeando como si fuesen un único LED más grande
Estableciendo el brillo de los LEDs
Para establecer el nivel de brillo de un LED usamos el bloque brillo-LED que está disponible en el menú Varios/LED/Brillo. En la entrada especificamos el valor del brillo: 0 apagado, y 255 intensidad máxima. La salida se conecta directamente al LED (o grupo de LEDs)
La salida del bloque es una señal PWM, de frecuencia 46.9KHz. Estas señales ya las estudiamos. Se puede encontrar más información sobre ellas en el cuadérno técnico 1: Unidad de PWM de frecuencia aproximada
Ejemplo 5: Grupo de 8 LEDs con brillo bajo
En este ejemplo encendemos un grupo de 8 LEDs a la intensidad 20 de 255. Utilizamos un bloque constante de 8 bits para introducir el número 20 a la entrada del bloque brillo-LED, y su salida la enviamos al grupo de LEDs
(Ejemplo-05-grupo-ocho-leds-brillo-bajo.ice)
Lo cargamos y lo probamos. Podemos apreciar cómo efectivamente los LEDs lucen mucho menos, aunque en la foto no se aprecia tan bien como en vivo
Ejemplo 6: Dos grupo de 4 LEDs, a diferentes niveles
Ahora encendemos dos grupos de 4 LEDS, a diferentes intensidades para compararlos. Los 4 LEDs superiores los ponemos a 250 y los 4 inferiores a 40. Como estamos haciendo hardware, los circuitos de control de la intesidad funcionan en paralelo
(Ejemplo-06-grupo-ocho-leds-brillo-alto-bajo.ice)
Lo cargamos y lo probamos. Efectivamente se aprecia claramente la diferencia de intensidades. Y en vivo todavía más
Ejemplo 7: 4 grupos de 2 LEDs. Degradado
En este ejemplo colocamos 4 grupos de 2 LEDs para hacer un degradado de la intensidad, pasando desde la más alta a una baja con dos intensidades intermedias. Simplemente para apreciar esta diferencia en las intensidades
(Ejemplo-07-cuagro-grupo-2-leds-degradao-brillo.ice)
Lo cargamos y lo probamos. Ahí podemos ver nuestro degradado. Se aprecian perfectamente los 4 niveles de intesidad
Ejemplo 8: Degradado de intensidad en 8 LEDs
Repetimos el experimento pero aplicando 8 intensidades diferentes a los 8 LEDs, desde 255 hasta 32, en decrementos de 32 niveles. Tener 8 unidades de PWM en paralelo mola, y en hardware lo hacemos muy fácilmente, simplemente con copy & paste :-)
(Ejemplo-08-degradado-8-LEDs.ice)
Lo cargamos y lo probamos. ¡Ahí tenemos nuestro degradado! ¡Mola!
Ejemplo 9: Control del brillo desde el PC
Una forma muy rápida de probar los diferentes niveles de brillo es enviarlos desde el PC a través del puerto serie. En los ejemplos utilizaremos el terminal Script Communicator que permite enviar números en decinal. Lo aprendimos a menejar en el tutorial 30 sobre el puerto serie
Este circuito de ejemplo recibe un byte con el nivel de brillo desde PC por el puerto serie y lo deposita en la entrada del bloque Brillo-LED para establecer el brillo de un grupo de 8 LEDs
(Ejemplo-09-serie-grupo-8-LEDs.ice)
Desde el Script Communicator enviamos los distintos valores de la intensidad. Escribirmos los valores en decimal en la ventana de envío y pulsamos SEND. En la parte superior vemos los valores enviados previamente
Cargamos y probamos el circuito. En este vídeo lo vemos en funcionamiento. Se envían los valores 10, 20, 50, 100, 150, 255 y 0
Ejemplo 10: Control del brillo con un potenciómetro
Ahora vamos a conectar un potenciómetro para establecer el nivel de brillo con él. Este es el escenario
En el circuito de ejemplo colocamos el bloque ADC para leer el valor del potenciómetro conectado al canal 0 (A0) del conversor Analógico-digital y la muestra la usamos directamente para establecer el brillo con el bloque brillo-LED
(Ejemplo-10-Potenciometro-grupo-8-LEDs.ice)
Lo cargamos y lo probamos. En este vídeo lo vemos en funcionamiento. El brillo varía según cómo giramos el potenciómetro
Variando el brillo en los LEDs: Desvanecimientos y fundidos
Si enviamos continuamente diferentes valores de la intesidad de brillo, logramos los efectos de fundido y desvanecimiento. Con el primero el LED se va encendiendo progresivamente y con el segundo apagando. Aprenderemos a usar el bloque brillo-gradual
Bloque brillo-gradual
El bloque brillo-gradual genera una transición entre los dos niveles de brillo, máximo (Max) y mínimo (Min), cuya duración es de T milisegudos. Por la entrada se indica el nivel al que transitar: 1 para el máximom y 0 para el mínimo. Por la salida se genera la señal PWM que provoca esa transición en el brillo del LED
El valor del parámetro Max por defecto es de 255 (máxima intensidad) y el del parámetro Min de 0 (apagado). El bloque está disponible en el menú Varios/LED/Brillo-gradual. Haremos ejemplo de uso de este bloque para aprender a manejarlo
Inicialmente el bloque se encuentra en el nivel mínimo. Por su entrada estamos introduciendo la consigna 0. Si en un momento determinado metemos la consigna a 1, el nivel realiza una transición del brillo mínimo al máximo en un tiempo T. Lo vemos en este diagrama
Ejemplo 11: Encendido progresivo
En este ejemplo hacemos un encendido progresivo (fundido o fade-in) de un grupo de 8 LEDs. Se pasa de estar los LEDs apagados a su máxima luminosidad en un tiempo de 1 segundo, usando el bloque brillo-gradual. Para repetirlo hay que hacer un reset de la placa
(Ejemplo-11-encendido-prograsivo-grupo-8-LEDs.ice)
Lo cargamos y lo probamos. Vemos que el encendido es progresivo. Cada vez que apretamos reset se apagan lo LEDs y vuelven a encenderse progresivamente
Ejemplo 12: Fundido y desvanecimiento con pulsador
En este circuito hacemos un encendido progresivo y desvanecimiento según el estado del pulsador SW1. Al apretarlo se empieza a hacer el fundido. Al cabo de 2 segundos se habrá alcanzado el brillo máximo. Al solatarlo se produce el desvanecimiento
(Ejemplo-12-fundido-desvanecimiento-pulsador.ice)
En esta figura se muestra la señal de brillo de LED cuando se introduce una consiga que varía. Se parte del reposo, con el LED al brillo mínimo (0). En t0 la consigna es 1, por lo que empieza a incrementarse el brillo. Al cabo de un tiempo T se alcanza el máximo
El LED sigue con este brillo máximo hasta que en t1 la consigna pasa a 0, por lo que el LED empieza a desvanecerse. Pero en t2, antes de alcanzarse el brillo mínimo, la consigna se pone a 1 otra vez, por lo que se incremeta de nuevo hasta llegar otra vez al máximo. Finalmete en t3 la consigna es otra vez 0 y al cabo del tiempo T se apaga el LED
Lo cargamos y lo probamos. En este vídeo se muestra en funcionamiento. La consigna la controlamos con el pulsador SW1
Ejemplo 13: Fundido y desvanecimiento con pulsador con memoria
Repetimos el circuito anterior pero usando un pulsador de cambio, que recuerda su estado. Esto facilita las pruebas. Al apretar una vez, los LEDs se encienden progresivamente. Al apretar una segunda vez, se desvanecen
(Ejemplo-13-fundido-desvanecimiento-pulsador-cambio.ice)
Lo cargamos y lo probamos. Es una tontería, pero mola mucho 😀 No paro de jugar con el pulsador 😂😂😂
Ejemplo 14: Grupo de 8 LEDs pulsantes
Si conectamos un corazón a la entrada del bloque brillo-gradual, conseguimoms el efecto de LEDs pulsantes: un parpadeo de los LEDs donde el encendido y el apagado son progresivos
(Ejemplo-14-LEDs-pulsantes-grupo-8.ice)
La señal de consiga es la proveniente del corazón: una señal cuadrada con ciclo de trabajo del 50%, y periodo de 2 segundos. La señal verde es la evolución del brillo, que tarda 500ms en realizar la transición. En la figura se muestran dos periodos
Lo probamos en nuestra placa. Este es el resultado. Ahí están los LEDs latiendo...
Ejemplo 15: Dos grupos de 4 LEDs pulsantes
Vamos a hacer que dos grupos de 4 LEDs parpadeen alternativamente y de forma pulsante. Cada uno está controlado por su propio bloque brillo-gradual, con el mismo parámetro de tiempo, pero conectados a diferentes señales de consigna, provenientes del corazón: la directa y la negada
(Ejemplo-15-LEDs-pulsantes-2xgrupo-4.ice)
Lo cargamos y lo probamos. En este vídeo se muestra el resultado. Mientras cuatro LEDs se encienden progresivamente, los otros cuatro se desvanecen y viceversa
El bloque fade-out
El bloque fade-out funciona igual que el bloque brillo, pero el encendido es instantáneo. En cuanto la consigna es 1, el LED lucirá al nivel máximo al instante, y cuando sea 0, se decrementará hasta el nivel mínimo, progresivamente
En esta gráfica se muestra el funcionamiento. Cuando la consigna de brillo pasa de 0 a 1, el LED cambia inmediatamente a su máximo brillo. Cuando se pasa de 1 a 0, el LED comienza el desvanecimiento (fade-out), que dura un tiempo T. Es el tiempo de desvanecimiento que se pasa como parámetro
Este bloque de desvanecimiento (fade-out) nos permite hacer algunos efecto muy chulos, como el de los LEDs con estela, o los números binarios efímeros, que se muestran y poco a poco van desapareciendo. También es muy útil para visualizar los tics
Ejemplo 16: LEDs con estela
Probaremos los LEDs con estela. Conectamos dos bloques fade-out a los pulsadores SW1 y SW2. El primero conectado por tic, y el segundo por nivel. Al apretarlos se enciende el LED a su brillo máximo y luego se van desvaneciendo: vemos su estela
El pulsador SW2 va por nivel, por lo que el desvanecimiento sólo ocurre al soltarlo, mientras que el desvanecimiento del SW1 se produce al recibir el tic. Lo cargamos y lo probamos. Este es el resultado:
¡Los LEDs con estela molan mucho, mucho mucho! 😀
Brillo y buses
El control del brillo y las animaciones las podemos realizar sobre LEDs independientes, como los bloques vistos hasta ahora, o sobre números completos de un tamaño fijo. Haremos ejemplos con números de 8 y 7 bits, que mostraremos en los LEDs y en un display de 7 segmentos respectivamente
Control del brillo en números
El bloque brillo-8 nos permite establecer el brillo de un número de 8 bits que se muestra en los LEDs. Por una entrada se introduce el nivel de brillo (0-255) y por la otra el número a mostrar. La salida contiene las señales a mostrar en los LEDs. Se encuentra en el menú Varios/LED/08-bits/brillo-8
Ejemplo 17: Número con brillo constante
En este ejemplo se saca el número 0x55 por los LEDs, con un nivel de brillo muy bajo. Este número en binario es 01010101, por lo que sólo se encenderán 4 LEDs
(Ejemplo-17-Numero-brillo-constante.ice)
Lo cargamos y lo probamos. En los LEDs podemos ver nuestro número en binario, con baja intensidad
Ejemplo 18: Animación con brillo ajustable
Tanto el brillo como el número pueden variar. En este ejemplo se muestra una secuencia por los LEDs, enviándose alternativamente los números 0x55 y 0xAA. El brillo se ajusta mediante un potenciómetro, igual que como hicimos en el Ejemplo 10
(Ejemplo-18-animacion-brillo-ajustable.ice)
Lo cargamos y lo probamos. Este es el resultado. A la vez que tenemos la animación, podemos establecer el brillo con el potenciómeto
El bloque brillo-control
Para facilitar el control del brillo se ha implementado el bloque brillo-control, disponible en el menú Varios/LED/brillo-control. Permite subir y bajar el brillo usando dos pulsadores. El brillo cambia mientras algunos de los botones esté pulsado
El parámetro step por defecto es de 10ms. Indica el tiempo entre incrementos o decrementos del nivel cuando se aprieta el pulsador. Así, con un valor de 10ms, se tarda unos dos segundos y medio en alcanzar el nivel máximo desde 0
Ejemplo 19: Animación con brillo ajustable con pulsadores
Este ejemplo es similar al anterior, pero usando los dos pulsadores de la Alhambra II para establecer el nivel de brillo. Inicialmente comienza con su valor máximo. Los números se la animación se han cambiado también
(Ejemplo-19-animacion-brillo-ajustable-teclas.ice)
En este vídeo se muestra el circuito en funcionamiento. La actualización del brillo funciona por tiempo de pulsación. Cuando más tiempo pulsada la tecla, más se modifica el brillo
Ejemplo 20: Segundero con brillo ajustable
Un display de 7 segmentos no son más que 7 LEDs dispuestos en forma de dígito. Podemos controlar su nivel de brillo exactamente igual que los ejemplos anteriores. Este ejemplo es un segundero, cuya intensidad controlamos con el potenciómetro. Este es el escenario
Se emplea el bloque brillo-7, disponible en el menú Varios/LED/07-bits/brillo-7, cuya salida es un bus de 7 bits con la señal PWM para cada segmento del display. El brillo se podría controlar también con el bloque control-brillo, usando pulsadores en vez del potenciómetro
(Ejemplo-20-segundero-brillo-ajustable.ice)
Lo cargamos y lo probamos. Al natural se aprecia mucho mejor la variación del brillo que en este vídeo, pero al menos os hacéis una idea. ¡Ya podemos controlar digitalmente el brillo del display de 7 segmentos!
Bloque brillo-gradual-8
El bloque brillo-gradual-8 nos permite hacer transiciones entre números de 8 bits. Se encuentra accesible en el menú Varios/LED/08-bits/bloque-gradual-8. Al llegar un nuevo número, se realiza una transición en los bits que han cambiado: fundido al pasar de 0 a 1 y desvanecimiento de 1 a 0, por un tiempo de T ms
El brillo para los bits a 0 y 1 se indica en los parámetros Min y Max respectivamente. La transición entre ambos niveles se especifica con el parámetro T, en milisegundos. Con este bloque logramos hacer transiciones suaves entre los números
Ejemplo 21: Contador binario con transiciones suaves
El ejemplo más sencillo para mostrar estas transiciones es un segundero en binario, mostrado en los LEDs. Usamos un tiempo de transición de 400ms
(Ejemplo-21-contador-binario-gradual.ice)
Lo cargamos y lo probamos. La cuenta es muy orgánica. ¡Parece que está vivo! :-)
Ejemplo 22: Segundero en 7 segmentos con transiciones suaves
Y esto mismo se puede hacer con los números de un display de 7 segmentos. Usamos el bloque brillo-gradual-7, que trabaja con números de 7 bits. Las transiciones entre los dígitos son suaves, apareciendo y desapareciendo los segmentos en un tiempo de 400ms
(Ejemplo-22-segundero-gradual.ice)
En este vídeo lo vemos en acción. Igual que ocurría con los LEDs, al natural se ve muchísimo mejor que en el vídeo, y las transiciones molan más :-) Esto de tener un hardware específico para realizar estos efectos es una pasada
Bloque fade-out-8
El último bloque es el fade-out-8 que hace que los bits a 0 de un número de 8 bits se vayan desvaneciendo, mientras que los que están a 1 permanecen con el brillo máximo. Nos permite hacer los efectos de estela y números efímeros
Ejemplo 23: Animación del coche fantástico
Haremos un ejemplo clásico: la animación del coche fantástico. Con el bloque Kitt generamos la animación de un bit que va y viene. Este número se envía al bloque fade-out-8 para que aparezca la estela. La longitud de esta estela depende de los parámetros de tiempo usados
(Ejemplo-23-coche-fantastico.ice)
Lo cargamos y lo probamos. En el vídeo vemos el efecto knight rider. ¡Vamos Kitt! :-)
Ejemplo 24: Contador binario con números efímeros
Los números efímeros tienen un tiempo de vida corto, y se van desvaneciendo poco a poco. El tiempo de desvanecimiento lo establecemos como parámetro. En este ejemplo generamos números de 8 bits con un contador, a la velocidad de 1 por segundo. Al cabo de 400ms cada número desaparece
(Ejemplo-24-contador-binario-efimero.ice))
El efecto de desvanecimiento lo conseguimos con el bloque fade-out-8, al que le introducimos un número compuesto por 8 bits cuya duración es de sólo un periodo de reloj del sistema (8 tics). Lo obtenemos haciendo la operación AND entre el número del contador y el tic proveniente del corazón
Este número compuesto por tics dura tan poco que no se vería en los LEDs. Pero al usar el bloque fade-out vemos la estela que deja cada uno de ellos. El efecto se muestra en este vídeo
Ejemplo 25: Dígitos decimales efímeros
Como último ejemplo, hacemos el mismo contador anterior, pero mostrando los números en decimal en el display de 7 segmentos. Cada vez que aparece un número, sus segmentos se desvanecen. Al cabo de 400ms el número ha desaparecido
(Ejemplo-25-contador-decimal-efimero.ice)
Lo cargamos y lo probamos. En este vídeo lo vemos en acción
Conclusiones
Los LEDs son la base para entender la visualización y el vídeo. A partir de ellos aprenderemos conceptos más avanzados en el futuro. Hemos usado 3 bloques para controlar el brillo y hacer transiciones en un LEDs individuales, y 3 para hacerlo con números de varios bits
Con ellos podemos hacer animaciones como la del coche fantástico, números efímeros o transiciones suaves, y muchas más que se nos ocurran. Todo ello hecho sólo con hardware
Descargas
Todos los ejemplos se pueden descargar de este repositorio
Autor
- Juan González-Gómez (Obijuan)
Licencia
Créditos y agradecimientos
-
Dibujo del LED del bloque brillo-LED: Tomado del repositorio de Fritzing, disponible bajo licencia: Creative Commons Attribution-ShareALike 3.0 Unported
-
Icono de brillo. Icon made by Freepik from www.flaticon.com