En este tutorial aprenderás cómo ajustar el brillo de un LED utilizando modulación por ancho de pulso, también conocida como PWM. Verás por qué modificar la tensión directamente no es una solución fiable, cómo funciona la técnica de encendido y apagado rápido, y cómo usar potenciómetros, rampas y corrección gamma para lograr transiciones suaves. Al final, te proponemos dos ejercicios prácticos: uno con LED automático y potenciómetro, y otro con un efecto ola animado con varios LEDs.
1 x Placa Arduino UNO R4 Wifi – Ver en Amazon
1 x Pack de resistencias surtidas 1/4 W – Ver en Amazon
1 x Pack de diodos LED – Ver en Amazon
1 x Pack de potenciómetros de 100Ω - 2MΩ – Ver en Amazon
1 x Protoboard y cables de conexión – Ver en Amazon
La función gamma permite ajustar el valor de salida PWM de forma que el ojo humano perciba el cambio de brillo de manera lineal. Sin esta corrección, el cambio puede parecer brusco o poco natural.
uint8_t gammaCorrect(uint8_t value) { // Definimos el valor de gamma. Un valor típico es 2.2 float gamma = 2.2; // Normalizamos el valor de entrada (de 0 a 255) al rango 0.0–1.0 float normalized = value / 255.0; // Aplicamos la corrección gamma: elevamos a la potencia de gamma float corrected = pow(normalized, gamma); // Reescalamos el valor corregido de vuelta a 0–255 y lo devolvemos como entero return uint8_t(corrected * 255); }
En este primer ejercicio te proponemos crear una animación suave que simule una respiración luminosa. Conectarás un LED a una salida PWM y utilizarás una rampa de subida, un mantenimiento de brillo máximo, una rampa de bajada y un periodo de apagado.
const int ledPWM = 5; // Pin PWM al que está conectado el LED void setup() { pinMode(ledPWM, OUTPUT); // Configuramos el pin como salida } void loop() { // Subida de brillo (2 segundos) for (int i = 0; i <= 255; i++) { int pwmValue = gammaCorrect(i); // Aplicamos la corrección gamma analogWrite(ledPWM, pwmValue); // Enviamos señal PWM al LED delay(8); // 8 ms * 256 = ~2 segundos } // Mantener encendido (1 segundo) analogWrite(ledPWM, 255); delay(1000); // Bajada de brillo (2 segundos) for (int i = 255; i >= 0; i--) { int pwmValue = gammaCorrect(i); analogWrite(ledPWM, pwmValue); delay(8); } // Apagado (1 segundo) analogWrite(ledPWM, 0); delay(1000); } // Función para aplicar corrección gamma uint8_t gammaCorrect(uint8_t value) { float gamma = 2.2; float normalized = value / 255.0; float corrected = pow(normalized, gamma); return uint8_t(corrected * 255); }
En este segundo ejercicio te proponemos crear un efecto ola con seis LEDs conectados a salidas PWM. Cada LED debe encenderse secuencialmente y seguir una rampa de brillo tipo sierra. También usarás un potenciómetro para ajustar la velocidad de la ola.