Conteúdo detalhado
🔄 Motor DC, servo ou passo: qual usar
Quase todo movimento de robô de bancada sai de três tipos de motor. O motor DC gira sem parar enquanto recebe energia: é a roda do rover. O servo vai até um ângulo e fica lá: é o "pescoço" que vira o sensor. O motor de passo anda em passos pequenos e exatos: é o eixo da impressora 3D. A pergunta certa não é "qual é melhor", e sim "que movimento a tarefa pede".
🌱 Novo aqui?
Torque é a força de giro: o quanto o motor consegue empurrar o robô morro acima. RPM é a velocidade, em rotações por minuto. A caixa de redução (as engrenagens amarelas do motor TT) troca velocidade por torque: o eixo gira mais devagar, mas com mais força. Sem redução, um motor DC pequeno gira rápido e não move nem o próprio peso.
Como ler: a seta contínua do motor DC indica giro livre; o arco tracejado do servo mostra que ele só se move dentro de uma faixa (0° a 180°); os tracinhos do motor de passo são as posições fixas em que ele para. Os dois cartões verdes giram sem limite; o ciano trabalha por posição.
| Motor | Use para | Precisa de |
|---|---|---|
| DC com redução (TT, N20) | rodas do rover, esteira, ventoinha | ponte H (driver) e PWM; encoder se quiser medir a volta (Trilha 2) |
| Servo (SG90, MG90S) | virar o sensor, garra, leme, braço pequeno | um pino de sinal e 5 V com corrente sobrando |
| Passo (28BYJ-48, NEMA 17) | posição exata: plotter, impressora, mesa giratória | driver próprio (ULN2003, A4988, TMC2209) e mais energia parada |
💡 Servo de rotação contínua
Existe servo "360°" que gira sem parar: o ângulo vira velocidade (90 = parado, 0 e 180 = máxima em cada sentido). Ele dispensa a ponte H e é uma boa saída para um rover bem simples. O preço é menos força e menos controle fino de velocidade que um motor TT com driver.
Por que aprender
Motor errado deixa o robô fraco, lento ou impreciso, e nenhum código corrige isso. Escolher pelo tipo de movimento também decide o resto: que driver comprar, quanta corrente a bateria precisa entregar e quantos pinos do ESP32 vão ser usados.
Conceitos-chave
🔀 Ponte H: TB6612FNG e DRV8833
Um pino do ESP32 entrega poucos miliampères a 3,3 V; um motor TT puxa centenas de miliampères e mais de 1 A no arranque. Ligar o motor direto no pino queima o pino. Entre os dois vai um driver de motor: o ESP32 manda só o sinal, e o driver abre o caminho da corrente que vem da bateria.
🌱 Novo aqui?
A ponte H é um conjunto de quatro chaves eletrônicas em volta do motor, desenhado como a letra H. Fechando duas chaves em diagonal, a corrente passa pelo motor num sentido; fechando as outras duas, passa no sentido contrário. É assim que o mesmo motor vai para a frente e para trás. O TB6612FNG e o DRV8833 são chips com duas pontes H cada: um chip controla as duas rodas.
Como ler: siga a seta verde: entra pela S1, atravessa o motor da esquerda para a direita e sai pela S4. A seta ciano tracejada faz o caminho espelhado (S2, motor ao contrário, S3). Fechar S1 e S3 juntas ligaria a bateria direto ao GND, um curto; o chip do driver existe justamente para que os pinos IN1/IN2 nunca permitam isso.
| Pino do driver | TB6612FNG | DRV8833 |
|---|---|---|
| Força dos motores | VM (da bateria) | VM / VCC do módulo (da bateria) |
| Lógica | VCC = 3V3 do ESP32 | não tem: lê 3,3 V direto |
| Sentido | AIN1, AIN2 (digitais) | AIN1, AIN2 (os dois recebem PWM) |
| Velocidade | PWMA (pino próprio) | PWM no próprio AIN1 ou AIN2 |
| Ligar o chip | STBY em nível alto | nSLEEP (ou EEP) em alto; muitos módulos já vêm ligados |
| Saída para o motor | AO1/AO2 e BO1/BO2 | AOUT1/AOUT2 e BOUT1/BOUT2 |
✓ Faça
- ✓Use TB6612FNG ou DRV8833: transistores MOSFET, pouca perda, aceitam lógica de 3,3 V.
- ✓Confira no datasheet a corrente contínua e de pico do seu módulo e compare com o motor.
- ✓Ligue o GND do driver, da bateria e do ESP32 no mesmo ponto.
✗ Evite
- ✗L298N: ainda vendido, mas ineficiente; perde cerca de 2 V em calor e o motor fica fraco.
- ✗Motor ligado direto no pino do ESP32, mesmo "só para testar".
- ✗Mexer nos fios do driver com a bateria ligada.
Por que aprender
O driver é a ponte entre o código e a força. Entender os pinos dele (força, lógica, sentido, velocidade, liga/desliga) faz a fiação do rover da 1.6 deixar de ser receita decorada: você sabe por que cada fio está ali e consegue trocar de driver sem medo.
Conceitos-chave
🎚️ Velocidade e sentido com PWM
O sentido vem dos pinos IN1/IN2. A velocidade vem do PWM, que você já usou no módulo 1.3 para o brilho do LED: o driver liga e desliga a bateria no motor milhares de vezes por segundo, e o motor responde à média. Quanto maior a fração "ligada" de cada ciclo, o duty cycle, mais rápido ele gira.
Como ler: as três ondas têm a mesma altura (a tensão da bateria) e o mesmo ritmo; o que muda é a largura do trecho alto. Com 25% o motor TT costuma só zumbir: a força média não vence o atrito da caixa de redução. Essa faixa inútil é a zona morta, e o código abaixo pula por cima dela.
🌱 Novo aqui?
A rampa sobe a velocidade aos poucos em vez de saltar de 0 para 100%: o robô não dá tranco e a bateria não sofre uma queda brusca. A frequência do PWM é quantos ciclos por segundo; usamos 20 kHz (20 mil), acima do que o ouvido percebe, para o motor não "apitar". Na API 3.x, ledcAttach(pino, 20000, 8) prepara o pino e ledcWrite(pino, 0..255) define a velocidade.
Objetivo: criar os "verbos" do rover (frente, ré, girar, parar e rampa) com um TB6612FNG e ver cada um no Serial Monitor. Os pinos são os mesmos do projeto 1.6: motor esquerdo em PWMA 25, AIN1 26, AIN2 27; direito em PWMB 33, BIN1 32, BIN2 4; STBY no 13.
// Teste dos motores com TB6612FNG (ESP32, pacote esp32 3.x)
// Frente, re, giro e parada, com rampa de aceleracao.
// Na primeira vez, deixe o robo SUSPENSO (rodas no ar).
const int PINO_PWMA = 25, PINO_AIN1 = 26, PINO_AIN2 = 27; // motor esquerdo
const int PINO_PWMB = 33, PINO_BIN1 = 32, PINO_BIN2 = 4; // motor direito
const int PINO_STBY = 13;
const int PWM_FREQ = 20000; // 20 kHz: fora da faixa que o ouvido escuta
const int PWM_BITS = 8; // velocidade de 0 a 255
const int VEL_MIN = 90; // abaixo disso o motor TT zumbe e nao gira
// vel de -255 (re) a 255 (frente); 0 = parado
void motor(int in1, int in2, int pinoPwm, int vel) {
vel = constrain(vel, -255, 255);
int forca = abs(vel);
if (forca > 0 && forca < VEL_MIN) forca = VEL_MIN; // pula a zona morta
digitalWrite(in1, vel > 0 ? HIGH : LOW);
digitalWrite(in2, vel < 0 ? HIGH : LOW);
ledcWrite(pinoPwm, forca); // API 3.x: recebe o PINO
}
void andar(int esq, int dir) {
motor(PINO_AIN1, PINO_AIN2, PINO_PWMA, esq);
motor(PINO_BIN1, PINO_BIN2, PINO_PWMB, dir);
}
void frente(int v) { andar(v, v); }
void re(int v) { andar(-v, -v); }
void girarDireita(int v) { andar(v, -v); } // rodas em sentidos opostos
void parar() { andar(0, 0); }
// sobe (ou desce) a velocidade de 5 em 5: sem tranco
void rampa(int de, int ate, int passoMs) {
int passo = (ate > de) ? 5 : -5;
for (int v = de; (passo > 0) ? (v < ate) : (v > ate); v += passo) { frente(v); delay(passoMs); }
frente(ate);
}
void setup() {
Serial.begin(115200);
pinMode(PINO_AIN1, OUTPUT); pinMode(PINO_AIN2, OUTPUT);
pinMode(PINO_BIN1, OUTPUT); pinMode(PINO_BIN2, OUTPUT);
pinMode(PINO_STBY, OUTPUT);
ledcAttach(PINO_PWMA, PWM_FREQ, PWM_BITS); // canal escolhido sozinho
ledcAttach(PINO_PWMB, PWM_FREQ, PWM_BITS);
digitalWrite(PINO_STBY, HIGH); // tira o driver da espera
parar();
Serial.println("Teste de motores: frente, re, giro, parar");
delay(2000);
}
void loop() {
Serial.println("rampa ate frente 200"); rampa(0, 200, 20); delay(1000);
Serial.println("parar"); parar(); delay(800);
Serial.println("re 160"); re(160); delay(1000);
Serial.println("parar"); parar(); delay(800);
Serial.println("girar para a direita"); girarDireita(160); delay(700);
Serial.println("parar"); parar(); delay(2000);
}
Como verificar
- ✓Com o robô suspenso, as duas rodas aceleram juntas para a frente, param, giram para trás e depois em sentidos opostos.
- ✓O Serial Monitor (115200) mostra cada etapa no mesmo momento em que ela acontece.
- ✗Uma roda gira ao contrário em "frente"? Inverta os dois fios desse motor no AO1/AO2 (ou BO1/BO2), não o código.
- ✗Nada gira e nada esquenta? Confira STBY em 3,3 V, VM ligado na bateria e o GND comum.
💡 Usando o DRV8833
No DRV8833 não há pino de velocidade separado: os dois pinos de entrada de cada motor recebem PWM. Para frente, PWM no AIN1 e 0 no AIN2; para trás, o contrário; os dois em 0 deixam o motor solto. O sketch do rover no módulo 1.6 traz as duas versões, escolhidas por uma linha no topo do código.
Por que aprender
Frente, ré, girar e parar são os verbos que a máquina de estados do rover vai usar. Escrevendo-os uma vez, em funções pequenas, o código do projeto fica curto e legível: "se a parede está perto, parar(), depois re()".
Conceitos-chave
📐 Servo no ESP32 com ESP32Servo
O servo tem três fios: marrom (GND), vermelho (5 V) e laranja (sinal). Ele não lê o duty cycle como o motor DC; ele lê a largura do pulso. A cada 20 ms (50 vezes por segundo) chega um pulso, e a duração dele diz o ângulo. A biblioteca ESP32Servo calcula esses pulsos para você. A Servo.h do Arduino Uno não funciona no ESP32.
Como ler: cada cor de pulso, à esquerda, corresponde ao braço da mesma cor, à direita. Pulso curto (verde) põe o braço num extremo, pulso médio (ciano) no centro, pulso longo (âmbar) no outro extremo. O espaço depois do pulso completa os 20 ms. Seu servo pode usar uma faixa um pouco diferente; os números 500 e 2400 do código ajustam isso.
Passo a passo
Instale a biblioteca
Na Arduino IDE 2.x, abra o Gerenciador de Bibliotecas, procure "ESP32Servo" (autor Kevin Harrington) e instale a versão mais recente, que é a compatível com o pacote esp32 3.x.
Ligue os três fios
Laranja no GPIO 23, marrom no GND comum, vermelho no 5 V do regulador (tópico 6). Para um teste rápido sem carga, o pino 5V da placa ligada no USB serve.
Teste antes no Wokwi, se quiser
O Wokwi tem servo e a biblioteca ESP32Servo: monte o mesmo circuito, cole o código e veja o braço virtual se mover.
Objetivo: fazer o servo "olhar" para a frente, para a direita, de novo para a frente e para a esquerda, como o pescoço do rover vai fazer na 1.6.
// Servo SG90 no ESP32 com a biblioteca ESP32Servo (pacote esp32 3.x)
#include <ESP32Servo.h>
const int PINO_SERVO = 23; // fio laranja (sinal)
Servo cabeca; // o servo que gira o sensor do rover
void setup() {
Serial.begin(115200);
cabeca.setPeriodHertz(50); // um pulso a cada 20 ms
cabeca.attach(PINO_SERVO, 500, 2400); // 0,5 ms = 0 graus ... 2,4 ms = 180 graus
cabeca.write(90); // comeca olhando para a frente
Serial.println("Servo pronto no GPIO 23");
delay(1000);
}
void loop() {
int angulos[] = {90, 20, 90, 160}; // frente, direita, frente, esquerda
for (int i = 0; i < 4; i++) {
cabeca.write(angulos[i]);
Serial.printf("angulo: %d\n", angulos[i]);
delay(800); // tempo para o servo chegar
}
}
Como verificar
- ✓O braço vai ao centro, a um lado, volta ao centro e vai ao outro lado, parando firme em cada posição.
- ✓O Serial Monitor repete "angulo: 90", "angulo: 20", "angulo: 90", "angulo: 160".
- ✗Erro de compilação citando funções de PWM? Atualize a ESP32Servo; versões antigas eram da API 2.x.
- ✗Servo tremendo ou ESP32 reiniciando? Falta corrente no 5 V: use o regulador do tópico 6.
Por que aprender
Com o sensor de distância em cima do servo, o rover olha para os dois lados antes de decidir para onde virar, em vez de virar sempre para o mesmo lado. É a mesma técnica de "apontar" que você vai usar na garra, na câmera que segue um objeto e no braço da Trilha 5.
Conceitos-chave
🔋 Baterias: NiMH, 18650, LiPo e BMS
Uma bateria de robô precisa de duas coisas: a tensão certa para os motores e corrente de sobra para o arranque. É aqui que a bateria 9 V quadrada falha: a tensão parece boa, mas ela entrega pouca corrente, cai na primeira acelerada e o ESP32 reinicia. Para a Trilha 1, a escolha segura é 4 pilhas AA recarregáveis (NiMH) ou 2 células 18650 com placa de proteção.
🌱 Novo aqui?
mAh (miliampère-hora) é a capacidade: uma bateria de 2000 mAh alimenta 500 mA por cerca de 240 minutos, na teoria. 2S quer dizer duas células de lítio em série: 2 × 3,7 V = 7,4 V nominais, 8,4 V carregadas. O BMS (sistema de gerenciamento de bateria) é a plaquinha que corta a energia se a célula descarregar demais, carregar demais ou entrar em curto.
Como ler: quanto mais longa a barra, mais corrente a bateria entrega sem a tensão despencar. A barra vermelha minúscula explica por que a 9 V reinicia o robô. A LiPo tem a barra mais longa, e por isso mesmo é a mais perigosa: num curto ela entrega essa corrente toda em calor.
✓ Lítio com segurança
- ✓18650 só em suporte com BMS e de marca conhecida; células iguais e com a mesma carga.
- ✓LiPo carregada com carregador balanceador, dentro de saco anti-chamas, sobre superfície que não queima.
- ✓Chave liga-desliga no fio positivo, perto da bateria.
- ✓Guardar com carga média, longe do sol e de objetos metálicos soltos.
✗ Nunca
- ✗Deixar bateria de lítio carregando sem ninguém por perto.
- ✗Usar LiPo estufada, amassada ou furada: descarte em ponto de coleta.
- ✗Encostar os dois polos com ferramenta ou fio desencapado.
- ✗Bateria 9 V quadrada para motor ou servo.
⚠️ Tensão alta demais para o motor TT
Motores TT são feitos para cerca de 3 a 6 V. Duas 18650 carregadas dão 8,4 V: o motor anda, mas esquenta e se desgasta. No código do rover há um teto de velocidade (cerca de 70% do PWM) para que a tensão média fique perto de 6 V. Com 4 pilhas NiMH, o teto pode ir a 100%.
Por que aprender
Energia errada é a causa número um de robô que "reinicia sozinho", e a bateria de lítio é o maior risco real da bancada. Saber ler tensão, capacidade e proteção faz o rover andar mais tempo e deixa a sala (e a sua casa) mais segura.
Conceitos-chave
⚡ Regulador, GND comum e ruído do motor
A bateria tem 7,4 V; o ESP32, o sensor e o servo querem 5 V. Quem faz essa conversão é um regulador buck, uma plaquinha que baixa a tensão perdendo pouca energia em calor. A ligação fica em dois ramos: a bateria vai direto ao VM do driver (força dos motores) e, pelo buck, ao 5 V da eletrônica. E todos os negativos se encontram num ponto só: o GND comum.
Como ler: o caminho âmbar é a tensão da bateria, que só vai ao driver e ao buck. O verde é o 5 V limpo da eletrônica. O ciano tracejado é o 3,3 V que o ESP32 manda para a lógica do driver. As linhas cinza pontilhadas são os GND: todas terminam no mesmo círculo. Se faltar uma, os sinais perdem a referência e o robô se comporta de forma aleatória.
🌱 Novo aqui?
Brownout é a queda rápida de tensão: o motor arranca, puxa um pico de corrente, a tensão cai por milissegundos e o ESP32 se reinicia para se proteger. O capacitor de desacoplamento é um pequeno reservatório de carga perto de quem consome: um cerâmico de 100 nF soldado nos terminais de cada motor absorve as faíscas elétricas das escovas, e um eletrolítico de 470 µF a 1000 µF no VM do driver segura os picos.
Objetivo: descobrir por que o ESP32 reiniciou. Rode o sketch sozinho para ver o motivo "normal". Depois copie a função motivo() e as linhas do setup() para o início do teste de motores do tópico 3: a cada reinício, a primeira linha do Serial Monitor diz a causa.
// Por que o ESP32 reiniciou? (pacote esp32 3.x)
#include "esp_system.h"
const char* motivo(esp_reset_reason_t r) {
switch (r) {
case ESP_RST_POWERON: return "ligou a energia ou apertou EN (normal)";
case ESP_RST_SW: return "reset pedido pelo programa";
case ESP_RST_PANIC: return "erro no programa (panic)";
case ESP_RST_BROWNOUT: return "BROWNOUT: a tensao caiu (motor, bateria fraca, fio)";
default: return "outro motivo";
}
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.print("Ultimo reinicio: ");
Serial.println(motivo(esp_reset_reason()));
}
void loop() {}
Como verificar
- ✓Ao ligar normalmente, aparece "ligou a energia ou apertou EN (normal)".
- ✗Aparece "BROWNOUT" (ou a mensagem "Brownout detector was triggered" antes)? A alimentação está fraca: confira buck, capacitores, bateria e GND comum.
✓ Alimentação limpa
- ✓Ajuste o buck para 5,0 V com o multímetro antes de ligar qualquer placa nele.
- ✓5 V do buck no pino 5V/VIN do ESP32; o regulador da placa faz o 3,3 V.
- ✓Fios de motor curtos e torcidos em par; longe dos fios do sensor.
✗ Ruído garantido
- ✗Servo ou motor tirando energia do pino 3V3 do ESP32.
- ✗Bateria direto (7,4 V) no pino 3V3 ou num GPIO: queima a placa.
- ✗Driver com GND próprio, sem ligar ao GND do ESP32.
Por que aprender
Sem regulador, capacitores e GND comum, o ruído do motor reinicia o ESP32 justamente quando ele mais precisa funcionar: na hora de frear e virar diante da parede. Esse defeito parece "bug de código" e faz muita gente desistir; agora você sabe procurar na energia primeiro.
Conceitos-chave
✅ Resumo do módulo
Para ir além
- LEDC (PWM) no Arduino-ESP32 — referência oficial da API 3.x
- Biblioteca ESP32Servo — código-fonte e exemplos
- TB6612FNG (Pololu) — pinagem, limites e datasheet
- DRV8833 (Texas Instruments) — datasheet oficial
- Migração 2.x → 3.0 — por que código antigo de PWM não compila
Próximo módulo
1.6 · Projeto: rover que desvia de obstáculos. Tudo da trilha junto: planejar, montar, testar por partes e programar a máquina de estados.