Una señal PWM es una señal generada por Modulación de Ancho de Pulso (Pulse Width Modulation), para más información puedes ir a nuestro artículo del blog. En resumidas cuentas, y como hemos mencionado en el apartado de pines, la modulación PWM es usada para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga. En esta ocasión nos ocuparemos de generar PWM, manejar entradas y cámaras desde el nivel Python.

 

Vamos a comenzar con un ejemplo simple con un diodo. Conéctalo a través de una resistencia de 1kΩ al pin número 12, tal y como hemos visto antes y como se muestra en el diagrama a continuación:

 

Ahora, abriremos un IDE para programar en Python, como por ejemplo Thonny Python IDE, en el cual abriremos un nuevo sketch y copiaremos el siguiente código:

 

import RPi.GPIO as GPIO

import time

 

GPIO.setmode(GPIO.BCM)

GPIO.setwarnings(False)

GPIO.setup(12, GPIO.OUT)

 

diodo = GPIO.PWM (12, 50) #Nueva instancia de PWM

duty = 0  # Ciclo de trabajo de la señal PWM

diodo.start (duty) # Activa la señal PWM

 

try:

                while True:

                                   duty+= 5

                                   if duty > 100:

                                                    duty = 0

                                 diodo.ChangeDutyCycle(duty) #Establece un nuevo valor para el relleno

                                 time.sleep(0.05)

except KeyboardInterrupt:

                print(‘Fin’)

 

diodo.stop()

GPIO.cleanup()

 

Vamos a explicar un poco cada línea. Como siempre, al principio del todo hay que importar las librerías correspondientes e iniciar las configuraciones, en nuestro caso las librerías de los pines GPIO y del tiempo y sus configuraciones.

Cuando queremos generar una señal PWM, tenemos que comenzar creando una instancia a la que asignaremos información sobre el pin y la frecuencia. Hacemos esto con la siguiente línea:

Nombre_instancia = GPIO.PWM (pin, frecuencia) #Nueva instancia de PWM

 

Recuerda que lo que haya después de un ‘#’ es un comentario y no afecta al código. En nuestro caso la línea queda: 

diodo = GPIO.PWM (12, 50) #Nueva instancia de PWM

 

Luego creamos una variable “relleno” llamada duty, que como su nombre indica, contendrá información sobre el llenado actual de la señal PWM (valores de 0 a 100 % sin signo), será el ciclo de trabajo de la señal. En resumidas cuentas, el porcentaje que la señal que está en estado alto, respecto al total de un ciclo.  Esta variable duty la inicializaremos a 0.

 

duty = 0  # Ciclo de trabajo de la señal PWM

 

El siguiente paso es iniciar PWM, como argumento de esta función damos la terminación esperada.

diodo.start (duty) # Activa la señal PWM

 

A partir de ahora, la señal PWM se generará en el pin 12. Su duty se puede cambiar todo el tiempo usando la siguiente instrucción:

               diodo.ChangeDutyCycle(duty)

 

Entonces, al juntar la información de las partes anteriores del curso, podemos crear un programa simple que cambiará el PWM completando un ciclo. En la práctica, esto significará una iluminación suave del LED.

 

Hay también un time.sleep(0.05) el cual hace una espera dentro del bucle while, aunque sea mínima, esto siempre es necesario. Al final del programa hay una línea más diodo.stop () , que probablemente no necesita explicarse. Por supuesto, es responsable de detener el "generador" PWM en un pin determinado. Mientras se ejecuta el programa, también podemos ajustar la frecuencia PWM. Para hacer esto, debemos introducir la siguiente instrucción: diodo.ChangeDutyCycle (XXX), donde dentro del paréntesis puedes poner un número del 0 al 100.

Como vemos, la tabulación de cada línea es importante, y debe quedar como la imagen anterior. Una vez lo tengamos de ese modo, podemos darle a Run para que se ejecute.

Verás como se va encendiendo el LED gradualmente hasta el máximo, entonces se apaga y repite el proceso. Para parar el programa puedes hacer CTRL+C o darle al botón Stop. Recuerda que si el LED se queda encendido, siempre puedes apagarlo manualmente con el terminal de comandos usando:

gpio -g write 12 0