PWM - Pulse Width Modulation

Neste artigo vamos aprender a usar o PWM no CircuitPython, uma técnica muito usada para controle de potência. Veja como é fácil aplicar.

PWM é abreviação para, Pulse Width Modulation – que significa – Modulação por Largura de Pulso. Essa é uma técnica onde, uma saída digital é usada para simular uma saída analógica. Isso acontece por meio de mudanças constantes de sinal, que são imperceptíveis e, dessa maneira o componente conectado a esse pino apenas tira uma média de quanto tempo está em estado alto e baixo. Quanto mais tempo ligado, maior o valor e, consequentemente, quando menor tempo ligado, menor o valor.

Neste exemplo, vamos aprender a usar PWM com CircuitPython na Franzininho WiFi.

Materiais necessários#

  • 1 Placa Franzininho WiFi com CircuitPython;
  • 1 Protoboard;
  • 1 LED;
  • 1 potenciômetro de 10 kΩ;
  • 1 resistor de 220 Ω ou 330 Ω;
  • Jumpers.

Circuito#

Para os nossos primeiros experimentos, realize a seguinte montagem:

franzininho-wifi-pwm Figura 1 – Circuito para teste de PWM com CircuitPython na Franzininho WiFi

Código para PWM com CircuitPython#

Para esse código, utilizaremos a biblioteca simpleio, que será necessária para realizarmos a conversão de valores. As bibliotecas do CircuitPython podem ser encontradas no seguinte endereço: https://circuitpython.org/libraries. Faça o download, de acordo com a versão do CircuitPython instalada na sua Franzininho WiFi.

franzininho-wifi-pwm

Após baixar o arquivo, copie a pasta desejada para a pasta de arquivos da Franzininho WiFi:

simpleio.mpy

Escreva o código abaixo no arquivo code.py, que está localizado no diretório da Franzininho:

import pwmio
import math
import simpleio
from analogio import AnalogIn
from time import sleep
potIn = board.IO2
pot = AnalogIn(potIn)
LED = board.IO4
led = pwmio.PWMOut(LED)
def converter(pin):
pinValue = pin.value
mapValue = math.trunc(simpleio.map_range
(pinValue, 536, 51355, 0, 65535))
print('Valor Original: ', pinValue,
'Valor Convertido: ', mapValue)
return mapValue
while True:
potValue = converter(pot)
led.duty_cycle = potValue
sleep(0.1)

Depois de finalizar a edição do código, salve. Execute o programa.

Utilizaremos o módulo board para acessarmos os pinos da Franzininho:

import board

E para configurarmos os pinos PWM, é necessário importarmos o pwmio:

import pwmio

Além disso, será necessário a biblioteca math, para “eliminar” as casas decimais:

import math

Como dito anteriormente, usaremos o módulo simpleio:

import simpleio

Ademais, importaremos a função AnalogIn do módulo analogio para, configuramos o potenciômetro como uma entrada analógica:

from analogio import AnalogIn

Também, iremos chamar a função sleep, da biblioteca time, pois precisaremos de intervalos de temporização:

from time import sleep

Agora, após importarmos todas os módulos que vamos utilizar, vamos configurar os pinos. Primeiro, vamos associar o GPIO2 a uma variável chamada potIn. Após isso, vamos criar um objeto chamado pot e configurá-lo como uma entrada analógica:

LED = board.IO4
led = pwmio.PWMOut(LED)

Configurações iniciais encerradas! Depois disso, vamos criar uma função chamada converte. Como parâmetro, essa função receberá o pino que estamos realizando a leitura:

def converter(pin):

Dentro da função, realizaremos a leitura do valor do potenciômetro, que será armazenada na variável pinValue:

pinValue = pin.value

Além disso, vamos converter o valor do potenciômetro para o valor aceito pelos pinos PWM. Para isso, vamos usar a função simpleio.map_range. Os parâmetros dessa função são: valor bruto (no caso, o valor recebido naquele instante), valor mínimo de entrada, valor máximo de entrada, valor mínimo de saída e valor máximo de saída. E, vamos precisar da função math.trunc, que eliminará as casas decimais. Todas essas informações ficarão armazenadas na variável mapValue:

mapValue = math.trunc(simpleio.map_range
(pinValue, 536, 51355, 0, 65535))

Colocaremos o print apenas para visualizarmos a conversão:

print('Valor Original: ', pinValue,
'Valor Convertido: ', mapValue)
return mapValue

E a função nos retornará o valor de mapValue:

return mapValue

E por fim, o loop. Dentro do while True, vamos associar o valor retornado pela função converte a variável potValue e mandar esse valor para o led. Para enviarmos um valor para o componente, utilizamos a função duty_cycle, que é o ciclo de trabalho, ou seja, quanto tempo o sinal estará ligado ou não. Também, colocaremos um delay:

while True:
potValue = converter(pot)
led.duty_cycle = potValue
sleep(0.1)

Conclusão#

Nesse exemplo, aprendemos a como usar os pinos PWM com CircuitPython e, como controlá-los através de um potenciômetro. Além disso, aprendemos a como mapear valores. No próximo exemplo, vamos aprender a como usar Servos Motores. Outros artigos da série.

AutorMateus Adriano Ventura Vieira
Data:09/05/2022