PWM con MicroPython - pensactius/Tutoriales GitHub Wiki

(Extraído de randomnerdtutorials.com)

Este tutorial muestra cómo generar señales PWM con las placas ESP32 y ESP8266 usando el firmware MicroPython. Como ejemplo, variaremos el brillo de un LED cambiando el ciclo de trabajo (duty cycle en inglés) a lo largo del tiempo.

PWM es una técnica en la que se ajusta la media del voltaje de entrada enviando una serie de pulsos ENCENDIDO / APAGADO.

La media del voltaje es proporcional al ancho de los pulsos, conocido como ciclo de trabajo (duty cycle en inglés).

Cuanto mayor sea el ciclo de trabajo, mayor será el voltaje aplicado al pin de salida PWM y cuanto menor sea el ciclo de trabajo, menor será el voltaje medio aplicado al pin de salida PWM.

La siguiente figura ilustra la técnica del PWM usando varios ciclos de trabajo y las medias de voltajes resultantes.

Prerrequisitos

Para seguir este tutorial, debes tener instalado el firmware MicroPython en la placas ESP32 o ESP8266. También necesitas un IDE para escribir y cargar el código a la placa. Sugerimos usar Thonny IDE como se explica en

Esquema

Para este ejemplo, conecta un LED a la placa ESP. Conectaremos el LED al GPIO 5 en ambas placas, pero puedes elegir otro pin PWM adecuado. Consulta los mejores pines para usar en la Guía de referencia de pines ESP32 o Guía de referencia de pines ESP8266 (TODO: Traducir).

Materiales necesarios

Aquí hay una lista de los materiales que necesitarás para construir el circuito:

  • ESP32 (ESP32-DEVKITC-32) o ESP8266 (NodeMCU, WeMos D1 Mini)
  • LED de 5 mm
  • Resistencia de 220 ó 330 ohmios
  • Protoboard
  • Cables de conexión

Esquema - ESP32

Sigue el siguiente diagrama esquemático si estás utilizando una placa ESP32:

ESP32 PWM con circuito MicroPython para atenuar LED

Esquema: ESP8266

Sigue el siguiente diagrama esquemático si estás utilizando una placa ESP8266:

ESP8266 PWM con circuito MicroPython para atenuar LED

Programa

Aquí está el script que cambia el brillo del LED con el tiempo aumentando el ciclo de trabajo. Este script funciona tanto con ESP32 como ESP8266.

#
# pwm-basic.py
#
#	Enciende progresivamente un LED usando PWM (Pulse Width Modulation)
#
# Código original https://RandomNerdTutorials.com
# Modificado Nov 2020 por Andrés Mata para PensActius
#

from machine import Pin, PWM
from time import sleep_ms

frequency = 5000
led = PWM(Pin(5), frequency)

while True:
  for duty_cycle in range(0, 1024):
    led.duty(duty_cycle)
    sleep_ms(5)

Cómo funciona el codigo

Para user un pin como PWM, importamos la clase PWM además de la clase Pin del módulo machine.

from machine import Pin, PWM

Luego, creamos un objeto PWM y lo asignamos a una variable que le hemos dado el nombre de led.

led = PWM(Pin(5), frequency)

Para crear un objeto PWM, debes pasar como parámetros, el pin al que está conectado, la frecuencia de la señal y el ciclo de trabajo.

  • Frecuencia : La frecuencia puede tener un valor entre 0 y 78125. Se puede usar una frecuencia de 5000 Hz para controlar el brillo del LED.

  • Ciclo de trabajo : El ciclo de trabajo puede tener un valor entre 0 y 1023. En el cual 1023 corresponde al 100% del ciclo de trabajo (máximo brillo) y 0 corresponde al 0% del ciclo de trabajo (LED apagado).

El ciclo de trabajo lo estableceremos más tarde en el bucle while, por lo que no necesitamos pasar el parámetro del ciclo de trabajo ahora. Si no se establece el ciclo de trabajo al crear una instancia del objeto PWM, será 0 por defecto.

Para configurar el ciclo de trabajo, utilizamos el método duty() en el objeto PWM y le pasamos el ciclo de trabajo como argumento:

led.duty(duty_cycle)

Dentro del bucle while, creamos un bucle for que aumenta el ciclo de trabajo en 1 en cada iteración del bucle con un intervalo de 5 ms entre cada cambio.

for duty_cycle in range(0, 1024):
    led.duty(duty_cycle)
    sleep_ms(5)

La función range() tiene la siguiente sintaxis:


range(start, stop, step)

  • Start : un número que especifica en qué posición comenzar. Queremos comenzar con un ciclo de trabajo 0;

  • Stop : un número que especifica en qué posición queremos detenernos, excluyendo ese valor. El ciclo de trabajo máximo es 1023, como estamos incrementando 1 en cada bucle, el último valor debe ser 1023 + 1. Por tanto, usaremos 1024.

  • Step : un número entero que especifica el incremento. De forma predeterminada, el incremento es 1.

En cada iteración del bucle for, configuramos el ciclo de trabajo del LED según el valor de la variable duty_cycle:

led.duty(duty_cycle)

La variable duty_cycle se incrementa en 1 automáticamente como parte del bucle for, ya que el incremento de range es 1 (al no haber escpecificado el parámetro step).

Demostración

Guarda el código en la placa ESP usando Thonny IDE. El LED conectado al GPIO 5 debería aumentar el brillo con el tiempo.