Como controlar la Intensidad de un LED con PWM y Arduino

En el capítulo anterior (CLICK AQUÍ), aprendimos los principios de la Automatización en Arduino con una breve introducción. Aprendimos además a encender y apagar un LED. En este capítulo, aprenderemos a controlar uno o más LEDs no solo encendiéndolo o apagándolo, si no variando su intensidad. En este capítulo encontrarás cómo controlar la intensidad de un LED utilizando PWM y Arduino.

Una de las maneras más sencillas de variar la intensidad del LED es utilizando una modulación por ancho de pulso (PWM), antes de adentrarnos en el proyecto, aprenderemos que es PWM.


Modulación por Ancho de Pulsos PWM

Hasta ahora sabemos que para encender el LED necesitamos escribir en el puerto de salida un estado en alto o 1 y para apagarlo un estado bajo o 0.

Sin embargo, existe una posibilidad de ajustar la intensidad del nivel de salida indicándole al Arduino la cantidad de tiempo que la señal estará en 1 o en 0, dentro de un periodo de tiempo, por lo que la señal final será mas intensa o menos intensa. Con esto podremos incluso variar la velocidad de un motor.

PWM proviene del inglés Pulse Width Modulation, variando la duración del ciclo de trabajo (tiempo donde la señal digital está en 1), obtendremos en promedio un valor de voltaje. Cabe mencionar que la señal enviada por el puerto PWM será repetida cada periodo; es decir, con cierta frecuencia. Esta señal se podrá considerar como una señal analógica.

Ciclo útil de señales PWM.
Ciclo útil de señales PWM.

Para utilizar la salida PWM, tendremos que utilizar los pines indicados con un ~. En la tarjeta Arduino Uno®, los pines son: 3, 5, 6, 9, 10 y 11. La frecuencia de salida es de 490 Hz, excepto para los pines 5 y 6 que es de 980 Hz. No se preocupen por la frecuencia, igual nos funcionará.

Tenemos que indicarle a la tarjeta Arduino que ancho de pulso queremos enviarle, para el caso del Arduino UNO, contamos con 8 bits para enviarle el valor deseado a través de la función analogWrite(pin, valor), donde pin es el número del pin físico a utilizar y valor será un valor entre 0 y 255, donde 0 representa un ciclo útil de 0% y 255 un ciclo útil de 100%, por lo que un valor de 127 representará un ciclo útil del 50%, un valor de 64 representará un ciclo útil del 25% y un valor… bueno creo que ya se entendió.

Ejemplo Controlando la Intensidad de un LED

Para nuestro ejemplo utilizaremos los siguientes materiales:

  • 1 LED de cualquier color
  • 1 resistencia de 470 Ω
  • Protoboard
  • Cables para realizar las conexiones
  • Tarjeta Arduino

Utilizaremos el pin 3 de nuestra tarjeta como salida analógica, como lo muestra el siguiente esquema:

Diagrama PWM LED Arduino.
Diagrama LED.

El código que utilizaremos para modificar la intensidad del LED es el que se muestra a continuación:

Si observas, en la primer línea de código hemos definido una variable. Esta variable será del tipo entero (int), para indicarle que la variable de tipo int y de nombre LED será reemplazada con el valor numérico 3. Por lo que cada vez que se mencione en el programa la variable LED, estaremos realmente mencionando el valor numérico 3. Esto nos ayuda al momento de decidir cambiar el valor tel puerto que necesitaremos, no tendremos que cambiar cada lugar en el código, sólo modificando el valor numérico en la línea uno. Si deseamos por ejemplo, cambiar el puerto PWM a utilizar con el LED físico, por el puerto 5, solo cambiamos: int LED = 3; por int LED = 5;. Útil no?

Lo siguiente que encontramos en el texto es muy similar al ejemplo del capítulo anterior. Ahora utilizaremos la función analogWrite() y le daremos valores de 50, 100, 150, 200 y 250 con un retardo de 1 segundo entre cada cambio. Lo que esperamos ver es que el LED vaya aumentando su intensidad cada segundo, luego vuelva a iniciar. Experimentemos un poco más.

Video intensidad LED 1.

Ahora modificaremos el programa para que el LED alcance la intensidad máxima, vaya disminuyendo a la mínima y luego se repita. Modificaremos el código como sigue:

Cómo puedes observar, agregamos un bloque de código donde estamos disminuyendo la intensidad de 50 en 50, hasta llegar a 0; es decir, que el LED se apague. Cuando el programa se repita, iniciará con la intensidad de 50.

Video intensidad LED 2.

Optimizando el código

Imagina que quieres aumentar la intensidad del LED de 5 en 5 hasta llegar al máximo. Ya sabes como modificar el código, pero sería muy largo. Para hacerlo de una manera mas eficiente, recurriremos a utilizar la función bucle for.

El bloque for nos sirve para ingresar un bloque de código que necesitamos que se repita por determinado número de veces y luego el programa continúe. La sintaxis es la siguiente:

Todo lo que se encuentre entre los {...} será el bloque de código que se ejecutará una y otra vez hasta llegar a la condición de fin.

El parámetro de inicio será ejecutado la primera vez que inicia el bucle for, y solo se ejecutará una vez. El parámetro condición_de_fin, se probará cada vez que el bucle for se ejecute, si el resultado es true (verdadero), el bucle for se ejecutará de nuevo. Si por el contrario, es false (falso), el bucle terminará de ejecutarse y continuará el programa, si es que resta código fuera del bucle for. El parámetro incremento, será ejecutado cuando la condición de fin sea verdadera.

Vamos a ver un ejemplo con el LED:

Este código incrementará la intensidad del LED de 1 en 1, con un retardo de 25 milisegundo… algo práctico, para no esperar un segundo cada cambio y poder observar cómo va incrementando de una manera más amable. Imagina realizar esto con la forma que vimos al inicio del post, sería tardadísimo de escribir.

Video del bucle for.

Lo que hace el bucle for es, primeramente declarar una variable de tipo entero y con valor de 1, posteriormente evaluar la condición de fin: i es menor a 255?, si la respuesta es verdadera, ejecutará las dos líneas de código, escribir en la salida 3 el valor actual de i, que para este primer caso será igual a 1. Aplica un retardo de 25 milisegundos y luego evalúa el parámetro de incremento, para este caso es i, que se traduce en sumarle 1 a i: i=i+1;, por lo que i será igual a 2.

En la siguiente ejecución del bucle for, i es igual a 2, por lo que la condición de fin seguirá siendo verdadera, se ejecuta el bucle escribiendo en el puerto 3 el valor de 2 y el final se incrementa la variable i. Se repite el bucle pero ahora i es igual a 3… y así sucesivamente hasta llegar al valor de 255. Una vez alcanzado este valor, el ciclo for termina.

Lo has probado en tu placa Arduino?

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Precauciones con el bucle for

Hay que tener mucho cuidado al utilizar el bucle for, ya que mientras el programa ejecuta el bucle, el resto del código no es ejecutado. Si por descuido no cuidamos que en algún determinado momento el ciclo for cumpla su condición de fin, el programa en el Arduino estará en un ciclo infinito; es decir, el programa se quedará pausado, hasta que hagamos un reset.

Siempre hay que evaluar el bucle for, y asegurarnos que la condición de fin, sea alcanzada cuando nosotros lo deseemos. Para nuestro ejemplo anterior, debería de salir en un tiempo de 6,375 milisegundos (6.3 segundos, aproximadamente).

¿Cómo modificarías el programa para que el ciclo incremente la intensidad del LED y luego la decremente de uno en uno hasta cero?

Controlando el LED con un potenciómetro

Hasta este momento hemos controlado la intensidad de un LED de manera automática, por medio del código. ¿Cómo podemos controlarla sin modificar el código? Bueno, una manera es variando de manera mecánica una referencia.

Para hacer el ejemplo, utilizaremos un potenciómetro. Un potenciómetro es una resistencia que varia su magnitud a través del giro mecánico por medio de una perilla, sí, precisamente es un botón que gira como esos que ajustan el volumen.

Para nuestro ejemplo, utilizaremos un potenciómetro de 1 KΩ. El diagrama que utilizaremos en este ejemplo es el siguiente:

Diagrama de LED con potenciómetro.
Diagrama de LED con potenciómetro.

Conectaremos un extremo del potenciómetro a la salida de 5V del Arduino, el pin central del potenciómetro lo conectaremos al puerto A0, que es un puerto de entrada analógica del Arduino y el tercer pin del potenciómetro será conectado a la terminal de GND. La entrada analógica de la placa Arduino UNO, lee y convierte los voltajes de entrada entre 0V y el voltaje de operación, en nuestro caso 5V. El valor al cual convierte esta referencia es de 0-1,023, con incrementos de 0.0049 V. Bastante bueno. El Arduino UNO toma 100 microsegundos en leer el puerto analógico; en otras palabras, 10,000 veces por segundo.

Nuestro potenciómetro será quien regule el voltaje de entrada al puerto analógico y estaremos leyendo este valor para decidir que intensidad asignarle al LED. Hay que tomar en cuenta que el rango del puerto analógico es de 0-1,023 y el del PWM es de 0-255. Por esto hay que dividir el rango entre 4 y lo tendremos entre 0 y 255.

El código a utilizar para este ejemplo es el siguiente:

Cabe mencionar que las líneas de configuración utilizadas en el PWM y en las entradas analógicas pueden omitirse, ya que por default el Arduino las configurará como salida para el uso de analogWrite y como entrada para el uso de analogRead. Sin embargo, por costumbre las declaro.

Nuestro código a ejecutar ahora será muy corto, solo una línea donde mandamos a escribir al puerto PWM el valor leído por analogRead(A0), es el valor de voltaje leído en el puerto A0, y luego se divide entre 4. El valor resultante deberá estar entre 0 y 255, valor que se le asigna al PWM y finalmente a la intensidad del LED.

Video intensidad LED con potenciómetro.

¿Qué te ha parecido este episodio? Te reto ha agregar distintos más LEDS en diferentes puertos y crear una secuencia de iluminación, mándame tus resultados en un comentario o en un correo. Déjame tus comentarios y sugerencias.

Recuerda visitar nuestras redes sociales

Deja un comentario