Conceitos básicos do PWM
O sinal PWM (Pulse Width Modulation) é utilizado em diversos dispositivos embarcados, fonte chaveadas e até em circuitos de cargas de potência, como no caso da Ponte H para controle de velocidade dos motores DC. Observando os pinos digitais da placa Arduino, alguns deles podem gerar sinais PWM para controle de servo motores, LEDs com efeitos de Fade In e Out para iluminação, mas como funciona este sinal?
A principal característica do PWM é a variação da largura da onda quadrada, sem interferir em sua frequência. Com esta variação de largura de pulso e o período da frequência obtemos a famosa porcentagem de Duty Cycle. Utilizando métodos matemáticos conseguimos encontrar valores importantes para uma aplicação correta de PWM. Por exemplo, uma onda quadrada que oscila na frequência de 40Hz e possui uma largura de pulso de 15ms, onde o tempo em nível zero também é de 15ms, então somando estes valores temos 30ms, assim encontramos o período da frequência conforme a imagem abaixo.
Com estes valores podemos aplicar a fórmula para a porcentagem de Duty Cycle que pode variar entre 0% até 100%, então:
Conforme o cálculo temos um Duty Cycle de 50%, isso quer dizer que a tensão aplicada no PWM também é alterada, para isso podemos realizar o cálculo da tensão média utilizando o Duty Cycle. Como este artigo é focado na plataforma Raspberry Pi, então a tensão de referência será aproximadamente de 3.3V de suas GPIOs em nível HIGH, então temos:
Com um Duty Cycle de 50% a tensão média é de 1,65V presente na GPIO, se o Duty alcançar 100% sua tensão média será de 3.3V, simples assim!
Materiais e montagem
Entendo os conceitos de PWM e Duty Cycle podemos fazer inúmeros projetos, e um deles pode ser o efeito de Fade In e Out utilizando LEDs e a plataforma Raspberry Pi. Separamos uma lista de materiais para este projeto, e também desenvolvemos ele na prática para você prestigiar!
- 1 Raspberry Pi 3 B+ com fonte de alimentação 5V de 3A
- 1 Protoboard
- 1 Resistor de 220R
- 1 LED
- Fios
- Kit de prototipagem para Raspberry Pi 3 (Opcional)
Utilizando como referência BCM para as GPIOs, ligamos o LED com seu resistor limitador de corrente no modo current source na GPIO 20 conforme o esquema abaixo.
Software gráfico com Guizero
Com a montagem pronta podemos ligar o Raspberry Pi e acessar o sistema operacional, que no caso é o Raspbian. No artigo sobre adaptação de relés de Arduino no Raspberry Pi, foi desenvolvido uma aplicação gráfica utilizando Python e a biblioteca nativa Tkinter. Agora vamos ver uma alternativa bastante interessante, a biblioteca Guizero. Ela foi projetada especialmente para iniciantes em GUI (Graphical User Interface), então sua estrutura é de fácil acesso e entendimento.
Para desfrutar desta biblioteca no Python 3 (IDLE) presente em seu OS, devemos utilizar o comando para instalação de módulos do Python 3 chamado de pip3, então abra o LXTerminal e digite os seguintes comandos:
sudo apt update
sudo pip3 install guizero
Instalando o pacote Guizero em seu OS, crie na área de trabalho um arquivo chamado "gui_pwm.py" e abra com o programa Python 3 (IDLE), o código está para download no fim deste artigo. No mesmo artigo sobre Tkinter, os conceitos de GUI explicados (Container, Widgets e Eventos) servem para aplicações em Guizero, qualquer dúvida consulte sua documentação oficial.
Para utilizar o sinal PWM no Python devemos importar a biblioteca RPi.GPIO, a mesma para acessar as GPIOs do Raspberry Pi. Depois é necessário instanciar o objeto do PWM que possui a GPIO correspondente e a frequência da onda quadrada, então objeto_pwm = GPIO.PWM(pino_pwm, freq), para este projeto foi utilizado a frequência de 100Hz. Com o objeto conseguimos iniciar o sinal do PWM com a porcentagem inicial do duty cycle com o método objeto_pwm.start(duty), com este tipo de aplicação é interessante iniciar o duty cycle em 0%. Para modificar o valor do duty cycle durante a execução utiliza-se o método objeto_pwm.ChangeDutyCycle(duty). Uma boa prática é finalizar o sinal PWM quando o programa é fechado, para isso utilize o método objeto_pwm.stop(), outra dica para evitar o aparecimento de warnings no console do Python é limpar as GPIOs utilizadas no programa, então utilize o objeto instanciado da GPIO e o método objeto_gpio.cleanup().
O código desenvolvido para este artigo possui uma calibragem de tensão da GPIO do Raspberry Pi, utilize um multímetro de sua preferência para obter o valor aproximado da tensão média. Para este software foi utilizado o widget Slider do Guizero para realizar a variação do Duty Cycle de 0% até 100%, onde podemos observar o efeito de Fade In e Out no LED conectado na GPIO 20, além disso com a mudança de Duty visualizamos o valor da tensão média com um widget Text.
Cole este código abaixo e execute pressionando F5.
#
# Efeito de Fade In e Out com PWM e Raspberry Pi
# Data: 30/04/2019
# --------------------------------------------------------------------
import RPi.GPIO as GPIO
from guizero import App, Slider, Text
# Configuração da GPIO
pino_pwm = 20
# Calibragem da tensão GPIO nível HIGH (utilizar multímetro)
tensao_gpio = 3.3
freq = 100 # Hz
duty = 0 # %
GPIO.setmode(GPIO.BCM)
GPIO.setup(pino_pwm, GPIO.OUT)
pwm = GPIO.PWM(pino_pwm, freq)
pwm.start(duty)
def pwm_led(valor_slider):
duty = int(valor_slider)
pwm.ChangeDutyCycle(duty)
tensao_media = (tensao_gpio * duty) / 100
t_tensao.value = tensao_media
app = App(title="PWM LED | Fade", bg="#f5f5f5", height=150, width=400)
Text(app, text="Duty Cycle (%)", font="Arial", size=15, color="#000000")
Slider(app, command=pwm_led, start=0, end=100, width=200, height=50)
Text(app, text="Tensão média GPIO (V)", font="Arial", size=15, color="#000000",)
t_tensao = Text(app, text="0.0", font="Arial", size=13, color="#000000", )
try:
app.display()
except KeyboardInterrupt:
pass
pwm.stop()
GPIO.cleanup()
Referências
- MALVINO, A; BATES, D; Eletrônica: volume 2. 8 ed. AMGH Editora, 2016.