Control de Intensidad LED con PWM en ESP32

Materiales necesarios

  • Placa ESP32

  • Potenciómetro de 10kΩ

  • Protoboard

  • Cables de conexión

  • LED (opcional, aunque usaremos el integrado)

Esquema de conexiones

text
Potenciometro:
  Patilla izquierda → 3.3V del ESP32
  Patilla derecha → GND del ESP32
  Patilla central → GPIO34 (ADC1_CH6)

LED integrado → GPIO2 (no necesita conexión externa)

Explicación del PWM

PWM (Modulación por Ancho de Pulso) es una técnica que permite controlar la cantidad de energía entregada a un dispositivo sin variar el voltaje, sino modulando el tiempo durante el cual el voltaje está encendido (HIGH) o apagado (LOW).

El ESP32 tiene un ADC (Convertidor Analógico-Digital) de 12 bits, que lee valores entre 0 y 4095 del potenciómetro. Convertimos este valor a un rango de 0-255 para el PWM.

Código para Arduino IDE

cpp
// Pines
const int potPin = 34;    // Pin del potenciómetro (ADC)
const int ledPin = 2;     // Pin del LED integrado

// Configuración PWM
const int freq = 5000;    // Frecuencia PWM (5kHz)
const int resolution = 8; // Resolución de 8 bits (0-255)
const int pwmChannel = 0; // Canal PWM (0-15)

void setup() {
  // Inicializar comunicación serial
  Serial.begin(115200);
  
  // Configurar el canal PWM
  ledcSetup(pwmChannel, freq, resolution);
  
  // Adjuntar el pin al canal PWM
  ledcAttachPin(ledPin, pwmChannel);
  
  // El pin del potenciómetro es entrada, no necesita configuración adicional
  
  Serial.println("Practica PWM: Control de intensidad LED con potenciometro");
  Serial.println("Gira el potenciometro para controlar la intensidad del LED");
}

void loop() {
  // Leer valor del potenciómetro (0-4095)
  int potValue = analogRead(potPin);
  
  // Mapear a valor PWM (0-255)
  int pwmValue = map(potValue, 0, 4095, 0, 255);
  
  // Escribir valor PWM al LED
  ledcWrite(pwmChannel, pwmValue);
  
  // Calcular el ciclo de trabajo en porcentaje
  int dutyCycle = (pwmValue * 100) / 255;
  
  // Mostrar valores por el monitor serial
  Serial.print("Valor potenciometro: ");
  Serial.print(potValue);
  Serial.print(" | Valor PWM: ");
  Serial.print(pwmValue);
  Serial.print(" | Ciclo de trabajo: ");
  Serial.print(dutyCycle);
  Serial.println("%");
  
  // Pequeña pausa para estabilidad
  delay(100);
}

Explicación del código

  1. Configuración de pines: Definimos los pines para el potenciómetro (entrada analógica) y el LED (salida PWM).

  2. Configuración PWM:

    • Frecuencia de 5000Hz (adecuada para control de LEDs)

    • Resolución de 8 bits (valores entre 0-255)

    • Usamos el canal PWM 0

  3. Función setup():

    • Inicializa la comunicación serial

    • Configura el canal PWM

    • Asocia el pin del LED al canal PWM

  4. Función loop():

    • Lee el valor del potenciómetro (0-4095)

    • Convierte este valor a rango PWM (0-255)

    • Aplica el valor PWM al LED

    • Muestra los valores por el monitor serial

    • Espera 100ms antes de repetir

Procedimiento paso a paso

  1. Conecta el potenciómetro al ESP32 como se indicó anteriormente

  2. Abre el Arduino IDE y asegúrate de tener instalado el soporte para ESP32

  3. Copia y pega el código en el IDE

  4. Conecta el ESP32 al ordenador

  5. Selecciona la placa correcta y el puerto COM

  6. Sube el código a la placa

  7. Abre el monitor serial (115200 baudios)

  8. Gira el potenciómetro y observa cómo cambia la intensidad del LED

  9. Verifica los valores en el monitor serial

Resultados esperados

Al girar el potenciómetro, deberías observar:

  • El LED integrado en el pin 2 cambiará su intensidad

  • En el monitor serial verás los valores del potenciómetro, PWM y ciclo de trabajo

  • Cuando el potenciómetro está en 0Ω (GND), el LED estará apagado

  • Cuando el potenciómetro está en 10kΩ (3.3V), el LED estará a máxima intensidad

Conceptos aprendidos

  • Cómo funciona la modulación por ancho de pulso (PWM)

  • Cómo leer valores analógicos con el ESP32

  • Cómo configurar el hardware PWM del ESP32

  • Conversión de valores entre diferentes rangos (mapeo)

  • Control de intensidad de un LED mediante PWM

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *