CajuínaCode
Voltar ao blog
ArduinoRobóticaProgramaçãoTecnologiaTutorial

Arduino para Iniciantes (Parte 4): O que é PWM e Servomotores

Simule saídas analógicas com o Arduino. Entenda o que é PWM, controle o brilho de um LED e movimente servomotores usando a biblioteca Servo.

CC

Cajuina Code

·3 min de leitura

Na terceira parte da nossa jornada, aprendemos a ler variações graduais de luz do ambiente utilizando as portas de entrada analógica. Caso precise recapitular essa etapa de sensores, acesse o post: Arduino para Iniciantes (Parte 3): Portas Analógicas e Sensores LDR.

Agora, vamos enfrentar o desafio oposto: como fazer o Arduino enviar saídas graduais? Por exemplo, como fazer um motor girar mais devagar ou um LED brilhar com apenas metade da sua intensidade, se os pinos digitais só sabem enviar 0V ou 5V? A resposta está em uma técnica fundamental da eletrônica chamada **PWM**. Nesta Parte 4, aprenderemos o que é PWM e como usá-lo para controlar **servomotores**.

TL;DR: O PWM (Pulse Width Modulation) simula tensões analógicas variando a proporção de tempo que um pino digital fica ligado (5V) e desligado (0V) em altíssima velocidade.

O que é PWM e Ciclo de Trabalho (Duty Cycle)?

O Arduino Uno não consegue diminuir a sua saída de tensão física de 5V para 2.5V de forma direta. Em vez disso, ele liga e desliga a porta digital milhares de vezes por segundo. Se a porta ficar ligada durante 50% do tempo e desligada nos outros 50%, a tensão média resultante percebida pelo componente conectado será de exatamente 2.5V.

Essa proporção de tempo em que o sinal fica ativado é chamada de **Ciclo de Trabalho (Duty Cycle)**. No Arduino Uno, os pinos que possuem essa capacidade são identificados com o caractere til **~** impresso na placa (pinos 3, 5, 6, 9, 10 e 11).

Duty Cycle (%)Tempo Ligado (5V) vs Desligado (0V)Tensão Média ResultanteValor no Código (0 a 255)
0%Sempre desligado0 Volts0
25%1/4 ligado, 3/4 desligado1.25 Volts64
50%Metade ligado, metade desligado2.5 Volts127
75%3/4 ligado, 1/4 desligado3.75 Volts191
100%Sempre ligado5 Volts255

A função analogWrite()

Diferente de `digitalWrite()`, que só aceita HIGH e LOW, a função **analogWrite(pino, valor)** nos permite gravar um sinal de PWM. O parâmetro de valor aceita números inteiros de **0 (0% de duty cycle) a 255 (100% de duty cycle)**. É um recurso muito usado para controlar o brilho de lâmpadas ou a velocidade de motores de corrente contínua (DC).

Controlando Servomotores

Um **Servomotor** (como o famoso micro servo SG90) é um motor elétrico acoplado a um circuito de controle e engrenagens que permite girar o seu eixo para uma posição angular exata (geralmente entre 0° e 180°).

O controle do servo é feito por pulsos de PWM enviados pelo Arduino. Para não precisarmos calcular o tempo dos pulsos manualmente no código, utilizamos a biblioteca nativa **Servo.h**, que converte graus (0 a 180) em pulsos elétricos de forma automática.

Circuito e Código Prático: Movimento de Varredura do Servo

Servomotores possuem 3 fios de conexão: Vermelho (5V), Marrom/Preto (GND) e Laranja/Amarelo (Sinal de Controle). Conecte o fio de sinal do servo ao **pino digital 9** do Arduino (pino PWM).

Digite o seguinte código na sua IDE:

#include <Servo.h> // Importa a biblioteca oficial de controle de servos

Servo meuServo;      // Cria um objeto servo para controle
int angulo = 0;      // Variavel que armazena a posicao angular (0 a 180)

void setup() {
  meuServo.attach(9); // Associa o objeto servo ao pino digital 9
}

void loop() {
  // Varredura de 0 a 180 graus
  for (angulo = 0; angulo <= 180; angulo += 1) {
    meuServo.write(angulo); // Envia o angulo para o servo
    delay(15);              // Aguarda 15 milissegundos para o motor alcancar a posicao
  }
  
  // Varredura de retorno de 180 a 0 graus
  for (angulo = 180; angulo >= 0; angulo -= 1) {
    meuServo.write(angulo);
    delay(15);
  }
}

Explicando as novas funções e bibliotecas

O uso de bibliotecas amplia muito as capacidades do Arduino:

  • #include <Servo.h>: Comando do compilador que inclui as funções prontas de controle de motor no seu programa.
  • meuServo.attach(9): Informa ao programa em qual pino físico da placa o cabo de sinal do motor está conectado.
  • meuServo.write(angulo): Move o motor diretamente para o ângulo especificado em graus (de 0 a 180).

Perguntas Frequentes

Por que o motor faz um ruído fino quando está ligado?

O sinal de PWM atua em uma frequência de onda (cerca de 490Hz no Uno). Essa oscilação elétrica rápida pode vibrar de forma sutil as engrenagens do motor, gerando esse ruído característico de posicionamento, o que é perfeitamente normal.

Posso alimentar vários servomotores direto no pino 5V do Arduino?

Não. O pino 5V do Arduino fornece corrente limitada (cerca de 400mA se alimentado pelo USB). Motores sob carga exigem muita corrente e podem travar a placa ou queimá-la. Para projetos com múltiplos servos, use uma fonte de energia externa de 5V dedicada para os motores, unindo apenas o GND deles com o GND do Arduino.

Qual a diferença de analogRead() e analogWrite()?

Apesar dos nomes parecidos, elas operam de formas diferentes: analogRead() lê sinais analógicos nos pinos dedicados **A0-A5** (resolução de 10 bits: 0 a 1023), enquanto analogWrite() gera ondas de PWM em pinos digitais específicos marcados com **~** (resolução de 8 bits: 0 a 255).

Próximos Passos

Você aprendeu a simular saídas graduais e a controlar motores! Chegamos ao final da parte teórica de base. Na próxima e última postagem da nossa trilha (Parte 5), vamos integrar tudo o que aprendemos criando um **Projeto Completo de Sensor de Ré de Estacionamento** usando sensores de distância ultrassônicos e buzinas buzzer!

Newsletter

Receba as notas de desenvolvimento

Enviamos atualizações técnicas e bastidores de código sem spam direto no seu e-mail.

Leia também