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
- 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.
Então vamos ao índice:
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.
- 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
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:
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.
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 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:
Exemplos Práticos
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:
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:
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:
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
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:
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:
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:
Além disso, se você deseja aumentar ainda mais o alcance dos seus projetos que você divulgar no Instagram, comprar seguidores reais e segmentados pode ser uma estratégia interessante para impulsionar sua visibilidade na plataforma. Isso pode ajudar a atrair mais seguidores orgânicos e interessados, transformando seu perfil em uma referência na área de eletrônica e Arduino.
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:
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:
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:
IN1 | IN2 | Direçã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!
Olá gostaria de saber como é o circuito desse exemplo com o motor ?
Bom Dia.
Sou Vinícius e comessarei a lecionar aulas de robótica educacional.
Estou a procura de um profissional que me ajuda a entender as etapas de um projeto eletrônico (por onde começar, como começar).
Vi que você trabalha na área e gostaria de saber se você pode me auxiliar com isso? me diga o valor que você cobra ?
Atenciosamente.