PWM Arduino: Tutorial Completo (+2 Exemplos Práticos)

Flávio Babos
Escrito por Flávio Babos
Atualizado em:

Neste artigo você irá aprender o que é PWM Arduino e como essa técnica de controle de tensão funciona nas placas Arduino UNO, Arduino Mega e Arduino Nano.

Além disso, separei 2 projetos bem detalhados para você aplicar na prática o PWM (Pulse Width Modulation) no Arduino UNO, que são:

  • Projeto 1: como controlar cores em um LED RGB, e;
  • Projeto 2: como usar um potenciômetro para controlar a Velocidade de um Motor DC através do PWM e variar a intensidade de um LED ao mesmo tempo.

Mas, se você é novo na plataforma Arduino, recomendo fortemente ler nosso artigo mais completo sobre esse universo open-source.

👨‍💻 Comprar Agora – Kit Iniciante Arduino com Tutorial e + 20 Projetos

Então vamos ao índice:

O que é PWM Arduino?

O que é PWM Arduino

 O PWM é utilizado nas placas Arduino com a finalidade de fornecer diferentes níves de tensão para:

  • Variar o brilho de LED’s;
  • Fornecer o controle da rotação de motores DC;
  • Fornecer uma saída analógica variável; se a saída digital for filtrada, ela fornecerá uma tensão analógica entre 0% e 100%;
  • Gerar um sinal modulado, por exemplo, para acionar um LED infravermelho de um controle remoto;
  • Emissão de sinais de áudio;
  • Efetuar o controle de servo motores e dentre outros componentes.

De forma geral, o PWM se baseia em fixar a frequência de uma onda quadrada, sem mudá-la, alterando apenas o intervalo de tempo que o sinal fica em nível lógico alto, ou seja, o tempo que ele fica em ON. Esse tempo em que o sinal fica ativo é chamado de duty cicle.

O diagrama abaixo mostra a modulação de um dos pinos PWM no Arduino.

PWM e frequencia com duty cicle
  • Tempo em ON – duração do sinal em HIGH;
  • Tempo em OFF – duração do sinal em LOW;
  • Período – é a soma dos tempos do sinal em ON e OFF do sinal PWM;
  • Duty Cicle – é a porcentagem de tempo em que o sinal está em HIGH durante o período.

Por exemplo, um pino digital do Arduino fornece 5V quando ligado em HIGH ou 0V quando em estado de LOW onde a saída é dada por uma onda quadrada.

Sendo assim, se quisermos diminuir o brilho de um LED, não podemos obter a tensão entre 0 e 5 V do pino digital, mas podemos alterar o tempo de permanência de HIGH e LOW do sinal.

Se mudarmos o tempo de HIGH e LOW rápido o suficiente, o brilho do LED será alterado, concorda?

Sendo assim, em 50% em que o duty cicle estiver em HIGH e com uma frequência de 1 Hz, o LED ou qualquer outro componente ficará ativo por 1/2 segundo e ficará desligado no outro 1/2 segundo.

Dessa forma, se aumentarmos a frequência para 50 Hz (50 vezes LIGADO e DESLIGADO por segundo), o LED será visto aceso com metade do seu brilho.

Isso também se aplica aos motores de corrente contínua. A velocidade de giro desse tipo de componente elétrico (o RPM), é controlado de acordo com a amplificação dos sinais PWM de HIGH e de LOW, onde se tem a seguinte relação:

  • Duty Cicle em 0% – significa que o motor não irá movimentar;
  • Duty Cicle em 50% – significa que a tensão média aplicada irá proporcionar ao motor desempenhar a metade de sua potência;
  • Duty Cicle em 100% – significa que a tensão de alimentação permitirá ao motor atuar na sua potência máxima.

Função analogWrite Arduino para PWM

Função analogWrite Arduino

Você aprendeu até aqui como funciona o PWM Arduino e para que ele serve, agora é importante saber como fazer esse controle de tensão.

Para isso, existem diversas formas do Pulse Width Modulation ser implementado no Arduino, diria por sinal, bem mais complexas do que a forma que irei te mostrar neste artigo.

Portanto, a maneira mais simples para controle dessa técnica é a utilização da função analogWrite() que a plataforma Arduino possui dentro da sua IDE.

Essa função pode ser utilizada para gerar um sinal PWM em que a frequência desses sinais, na maioria das vezes, está próxima de 490Hz.

Já o que você deve fornecer como primeiro argumento para a função é o pino da porta que deseja controlar e, o segunto argumento deve ser um valor entre 0 – 255 que representa a faixa de atuação do PWM.

Essa faixa é equivalente a tensão que a porta digital do Arduino irá fornecer ao circuito.

Veja só:

  • analogWrite(PINO, 0) significa um sinal de 0% do duty cycle e tensão de 0V;
  • analogWrite(PINO, 127) significa um sinal de 50% do duty cycle e tensão de 2,5V;
  • analogWrite(PINO, 255) significa um sinal de 100% do duty cycle e tensão de 5V.

Essa analogia fica mais clara de acordo com o diagrama abaixo:

PWM e analogWrite Arduino

Arduino Nano PWM

O Arduino Nano possui 6 pinos PWM assim como o Arduino UNO. Eles estão localizados nas portas digitais D3, D5, D6, D9, D10 e D11.

Essas portas proporcionam uma saída de PWM de 8 bits quando a função analogWrite() é utilizada e, de acordo com a documentação oficial do Arduino, elas fornecem uma frequência de 980 Hz nos pinos 4 e 13 e 490 Hz no restante das portas.

Arduino Nano PWM

PWM Arduino Mega

Já o Arduino Mega possui um total de 54 pinos digitais I/O e de todos eles, 15 podem ser utilizados como saídas PWM que são os pinos 2 ao 13 e 44 ao 46.

A frequência nos pinos PWM 4 e 13 é de 980 Hz e nos pinos restantes é de 490 Hz.

Além disso, você irá notar que, em alguns modelos de Arduino que for usar, as portas terão o sinal de ~ na frente como indicação de uma porta PWM.

PWM Arduino Mega

PWM Arduino UNO

Por fim, no Arduino UNO, as portas PWM são iguais ao Arduino Nano, igual mencionei anteriormente, inclusive as frequências de saída em cada porta.

Ou seja, o UNO terá PWM nos pinos digitais D3, D5, D6, D9, D10 e D11. Novamente, para encontrar esses pinos basta identificar o símbolo ~ em cada porta. Observe:

PWM Arduino UNO

Exemplos Práticos

LED PWM Arduino

LED PWM Arduino

Para este exemplo iremos utilizar um Módulo LED RGB com o PWM do Arduino para fornecer diferentes níveis de tensão para o LED emitir as cores desejadas.

Portanto, os componentes necessários são:

  • 1x Módulo ou LED RGB;
  • 3x Resistores de 330 Ω ou se preferir de 220 Ω também serve;
  • 1x Arduino UNO;
  • 1x Protoboard;
  • Alguns fios/jumpers.

A montagem dos componentes fica da seguinte forma, veja:

LED PWM Arduino

O LED RGB é um componente que ao misturar 3 cores primárias (vermelho, verde e azul) é capaz de gerar dezenas de outras cores.

Sendo assim, para este exemplo, o módulo separa 3 pinos para esses 3 LED’s enquanto que o 4º pino é o ground do circuito.

Caso você estiver usando um LED RGB propriamente dito, sua pinagem fica da seguinte forma:

LED RGB

Código utilizado

Na primeira parte do código é necessário definir cada LED à cada porta PWM do Arduino:

  • LED Vermelho = Digital 9;
  • LED Verde = Digital 10;
  • LED Azul = Digital 11;

Já no void setup() usamos um método para declarar esses pinos como OUTPUT que é um laço de repetição for().

E, no void loop() chamamos uma função, que é declarada no final do código e inserimos os valores entre 0 – 255 que representa as cores que desejamos serem exibidas.

Para entender essa questão melhor, veja a relação abaixo:

Tabela de cores analogWrite Arduino

Por exemplo, na programação do Arduino você terá uma função void definirCor() que possui 3 argumentos referentes aos valores PWM das cores dos LED’s.

Esses argumentos combinados podem formar a cor vermelha (255, 0, 0), a cor azul (0, 0, 255), a cor amarela (255, 255, 0) e por aí vai.

Veja o código abaixo:

/*   Código do Exemplo Prático LED RGB com USO do PWM ARDUINO
    
     Monte seus próprios projetos sem dificuldade com programação! 
     ACESSE: https://flaviobabos.com.br/
*/

// Variáveis relacionadas a cada pino do LED
int pinoVermelho = 9;
int pinoVerde = 10;
int pinoAzul = 11;

void setup() {

  // Use um laço for para declarar os pinos como saída
  for(int i = 9; i < 12; i++){
    pinMode(i, OUTPUT);
    }
}

void loop() {

  // Chamada de função responsável por exibir a cor desejada
  definirCor(255, 0, 0); // Cor Vermelha
  delay(1000);
  definirCor(0, 255, 0); // Cor Verde
  delay(1000);
  definirCor(0, 0, 255); // Cor Azul
  delay(1000);
  definirCor(255, 255, 255); // Cor Branca
  delay(1000);
  definirCor(170, 0, 255); // Cor Roxa
  delay(1000);
}

// Função com 3 argumentos que são os valores PWM
void definirCor(int valorVermelho, int valorVerde, int valorAzul) {

  // Aqui não se esqueça de inserir o pino do LED e a variável do argumento
  analogWrite(pinoVermelho, valorVermelho);
  analogWrite(pinoVerde, valorVerde);
  analogWrite(pinoAzul, valorAzul);
}

Com tudo pronto e código rodando no Arduino, você terá algo parecido com o vídeo abaixo:

Controle de velocidade Motor DC PWM

Controle de velocidade Motor DC PWM

Para este outro exemplo prático, utilizaremos um Motor DC comum e vamos utilizar um LED verde para visualizar melhor a atuação do PWM. Este LED é opcional na montagem deste projeto.

Os componentes necessários são:

  • 1x Motor DC;
  • 1x LED Verde (opcional);
  • 1x Resistor de 330 Ω ou 220 Ω se preferir (opcional);
  • 1x Potenciômetro de 10k Ω;
  • 1x Ponte-H L293D (CI);
  • 1x Arduino UNO;
  • 1x Protoboard;
  • Alguns fios/jumpers.

Você deve ter notado que iremos utilizar a Ponte-H L293D no formato de Circuito Integrado.

Sendo assim, para realizar as conexões neste componente, primeiro precisamos entender onde cada pino vai ligado no Arduino:

Pinagem Ponte H L293D Circuito Integrado

Você deve conectar o motor DC nos pinos 3 (OUT1) e 6 (OUT2).

Já o LED, você deve conectar o polo positivo no pino 6 e negativo no pino 3 da Ponte H.

Creio que você não terá muita dificuldade depois de ver a montagem final abaixo:

Montagem projeto controle de velocidade Motor DC com PWM

O motor irá se movimentar com um pequeno intervalo de tempo após os pulsos tiverem sido gerados pelo Arduino UNO.

Por causa disso, independente se o sinal PWM tiver picos de duty cicle, o Motor DC deverá rotacionar sem muitas oscilações e transtornos. Essa estabilidade também se dá devido à energia que fica armazenada nas bobinas do componente.

Se você quiser utilizar mais um motor e executar o controle de sua rotação também, é possível, pois o CI L293D suporta o controle de dois componentes:

Ponte H Controle de 2 Motores DC

Código utilizado

Para executar o controle de velocidade do Motor DC via PWM, utilizaremos o seguinte código:

 /*  Código Para Controle De Motor DC Via PWM Arduino
    
    Monte seus próprios projetos sem dificuldade com programação! 
    ACESSE: https://flaviobabos.com.br/
*/

// Define as variáveis utilizadas
#define pinovelocidade 3
#define pinoPonteH1 2
#define pinoPonteH2 7
#define potenciometro A0
   
void setup()  
{  
  // Define os pinos como saida  
  pinMode(3, OUTPUT);  
  pinMode(2, OUTPUT);  
  pinMode(7, OUTPUT); 

  // Define o pino do potenciômetro como entrada
  pinMode(A0, INPUT); 
  }  
   
void loop(){  
  
  // Faz a leitura do Potenciômetro 
  int velocidade = analogRead(potenciometro)/4;  

  // Define a velocidade de rotacao do motor 
  analogWrite(pinovelocidade, velocidade);   

  // Aciona o motor  
  digitalWrite(pinoPonteH1, LOW);  
  digitalWrite(pinoPonteH2, HIGH);    
}  

O pino digital 3 do Arduino envia os pulsos PWM para o pino 1 da Ponte H:

Ponte H controle de velocidade Motor DC Arduino

No entanto, para gerar os pulsos PWM precisamos converter o que é lido na porta analógica A0 (potenciômetro) em valores de PWM.

Mas como fazemos isso?

É simples!

Basta obter o valor analógico com a função analogRead(potenciometro), de acordo com o código acima, e dividir esse valor por 4, assim:

(valor analógico) 1024/4 = 256 (valor PWM)

Depois disso, é só inserir em analogWrite(pinovelocidade, velocidade) que o controle de velocidade estará definido.

Ao final, para fazer o motor rotacionar de fato, é preciso acionar os pinos INPUT do CI. No caso, apenas os pinos 2 e 7, mas se estiver controlando mais de um motor, acione os pinos 10 e 15 também:

Ponte H acionamento Motor DC

Saiba que você pode controlar a direção de giro de um motor aplicando-se a lógica HIGH (5 Volts) ou LOW (GND) a esses pinos.

Veja a tabela abaixo que mostra como isso é feito:

IN1IN2Direção de rotação
LOW(0)LOW(0)Motor desligado
HIGH(1)LOW(0)Para frente
LOW(0)HIGH(1)Para trás
HIGH(1)HIGH(1)Motor desligado

Veja o vídeo abaixo como o potenciômetro controla o motor DC via PWM e observe a variação de brilho no LED conforme o motor acelera/diminui:

Chegamos ao fim de mais um artigo, e você, o que achou de tudo o que aprendeu aqui?

Me deixe saber nos comentários.

Abraços!


Foto escritor

Flávio Babos

Flávio é especialista em tecnologia, empreendedor e estudante de Engenharia Mecatrônica pela Universidade Federal de Uberlândia (UFU). Já desenvolveu diversos projetos de elétrica, eletrônica e atualmente dedica seu tempo em escolher os melhores produtos de tecnologia para ajudar sua audiência no processo de decisão de compra na internet.


1 Comentários

Foto escritor

Teresa Gabriella

Olá gostaria de saber como é o circuito desse exemplo com o motor ?

Deixar comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Comentário