ESP32 - Driver de Motor DC DRV8833

Este tutorial ensina você a usar o ESP32 para girar motores DC por meio da pequena placa driver de motor DRV8833. Começamos com um único motor (acelerar, desacelerar, mudar de direção, roda livre e freio), e depois ligamos um segundo motor para que o ESP32 possa controlar as duas rodas de um pequeno carrinho robô.

ESP32 Driver de motor DC DRV8833

Se você já tem a placa L298N, que é maior, o tutorial ESP32 - Motor DC cobre essa placa. O DRV8833 é a opção menor e que esquenta menos, e se encaixa muito bem em projetos alimentados por bateria.

Sobre o Driver de Motor DRV8833

O DRV8833 é um chip de ponte H dupla fabricado pela Texas Instruments. Um chip tem dois canais, então um módulo pode acionar dois motores DC com escovas nos dois sentidos (ou um pequeno motor de passo bipolar, que não é abordado aqui). As saídas são MOSFETs com uma resistência baixa de cerca de 360 mΩ, então muito pouca tensão é perdida dentro do driver. Com o L298N, boa parte de uma bateria de 6V é desperdiçada como calor. Com o DRV8833, quase tudo chega ao motor.

DRV8833
A tensão de alimentação do motor (VCC/VM) 2.7V a 10.8V
A corrente de saída por canal cerca de 1.5A RMS, 2A de pico (com boa refrigeração)
A lógica de controle sinais de 3.3V e 5V funcionam
A frequência PWM até 50kHz
A proteção bloqueio por subtensão, sobrecorrente, desligamento térmico

O chip gera sua própria tensão lógica interna a partir da alimentação do motor, então o módulo não tem um pino separado de alimentação lógica. É por isso que os pinos GPIO de 3.3V do ESP32 podem controlá-lo diretamente. Se você precisa de mais corrente para um motor grande, os dois canais podem ser ligados em paralelo para cerca de 3A, mas não vamos fazer isso aqui.

Pinagem do DRV8833

Pinagem do driver de motor DRV8833

A placa breakout DRV8833 vermelha/azul comum tem estes pinos. Os nomes variam entre os fabricantes: algumas placas imprimem AIN1/AIN2/BIN1/BIN2, AOUT1/AOUT2/BOUT1/BOUT2, SLP e FLT no lugar.

  • Pinos IN1, IN2: conecte estes pinos a dois pinos GPIO do ESP32 com suporte a PWM. Eles controlam o motor A.
  • Pinos IN3, IN4: conecte estes pinos a outros dois pinos GPIO do ESP32 com suporte a PWM. Eles controlam o motor B.
  • Pinos OUT1, OUT2: conecte estes pinos aos dois fios do motor A.
  • Pinos OUT3, OUT4: conecte estes pinos aos dois fios do motor B.
  • Pino VCC: conecte este pino ao positivo da fonte de alimentação do motor (2.7V a 10.8V).
  • Pino GND: conecte este pino ao negativo da fonte de alimentação do motor E a um pino GND do ESP32.
  • Pino EEP (nSLEEP): conecte este pino ao pino 3.3V do ESP32 (ou a um GPIO colocado em HIGH). Quando ele está em LOW, o chip dorme e os motores não se movem.
  • Pino ULT (nFAULT): uma saída open-drain que vai para LOW quando o chip detecta uma falha. Ele é opcional, você pode deixá-lo desconectado.

Como o DRV8833 Controla a Velocidade e a Direção

Ao contrário do L298N, o DRV8833 não tem pino de velocidade ENA/ENB. Cada canal é controlado apenas pelos seus dois pinos de entrada. A tabela abaixo é para o motor A. O motor B funciona do mesmo jeito com IN3 e IN4.

IN1 IN2 Motor A
LOW LOW Roda livre (o motor gira livremente até parar)
HIGH LOW Para frente
LOW HIGH Reverso
HIGH HIGH Freio (o motor para rapidamente)

Para definir a velocidade, o ESP32 envia um sinal PWM para uma entrada e mantém a outra em LOW:

  • Para ir para frente em uma velocidade escolhida: PWM em IN1, IN2 em LOW
  • Para ir em reverso em uma velocidade escolhida: IN1 em LOW, PWM em IN2

Isso significa que os dois pinos de entrada de cada canal precisam suportar PWM. No ESP32 isso é fácil, porque quase todo GPIO de saída consegue gerar PWM. O código deste tutorial usa analogWrite() com um valor de 0 (parado) a 255 (velocidade máxima), a mesma função que os outros tutoriais de ESP32 deste site usam.

Como Controlar Um Motor DC usando o DRV8833

Diagrama de Ligação

O motor funciona com um adaptador externo de 5V, não com o ESP32. Nunca tire a alimentação do motor do pino 5V ou 3.3V da placa ESP32. A única ligação compartilhada entre os dois lados de alimentação é o fio de terra.

  • Como conectar o ESP32 e o módulo DRV8833 com fios jumper
Diagrama de ligação do ESP32 com DRV8833 e um motor DC

This image is created using Fritzing. Click to enlarge image

Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

Como conectar o ESP32 e o DRV8833 com um motor DC usando bornes de parafuso

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 ESP32 / Outro
IN1 → GPIO27
IN2 → GPIO26
EEP → 3.3V
GND → GND do ESP32 e negativo (-) do adaptador de 5V
VCC → positivo (+) do adaptador de 5V
OUT1, OUT2 → os dois fios do motor DC

Como Programar

  • Defina os dois pinos de entrada como saídas:
pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT);
  • Gire para frente em uma velocidade de 0 a 255:
analogWrite(PIN_IN2, 0); analogWrite(PIN_IN1, speed);
  • Gire em reverso em uma velocidade de 0 a 255:
analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, speed);
  • Deixe o motor parar em roda livre:
analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0);
  • Freie o motor com força:
analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255);

Código ESP32 - Um Motor DC

O código abaixo repete este ciclo: acelera o motor para frente, mantém a velocidade máxima, deixa em roda livre, faz o motor girar em reverso a cerca de 70% da velocidade e depois freia. Cada etapa é impressa no Serial Monitor.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-drv8833-dc-motor-driver */ // ESP32 controls ONE DC motor through the DRV8833 motor driver (channel A) // The DRV8833 has no enable pin. The speed comes from a PWM signal on IN1 or IN2. #define PIN_IN1 27 // ESP32 pin GPIO27 connected to the IN1 pin of the DRV8833 #define PIN_IN2 26 // ESP32 pin GPIO26 connected to the IN2 pin of the DRV8833 void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); // start with the motor coasting (both inputs LOW) analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); } void loop() { // 1) Forward: PWM on IN1, IN2 stays LOW. Ramp the speed from 0 to 255 Serial.println("Forward - speeding up"); analogWrite(PIN_IN2, 0); for (int speed = 0; speed <= 255; speed += 5) { analogWrite(PIN_IN1, speed); delay(40); } // 2) Hold the full speed for 2 seconds Serial.println("Forward - full speed"); delay(2000); // 3) Coast: both inputs LOW, the motor slows down by itself Serial.println("Coast - motor free-runs to a stop"); analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); delay(2000); // 4) Reverse at about 70% speed: IN1 LOW, PWM on IN2 Serial.println("Reverse - 70% speed"); analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 180); delay(2000); // 5) Brake: both inputs HIGH, the motor stops quickly Serial.println("Brake - fast stop"); analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255); delay(2000); // release the brake before the next round analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); Serial.println("----------"); }

Passos Rápidos

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
  • Faça a ligação como na imagem acima. Deixe o adaptador de 5V desconectado por enquanto.
  • Conecte a placa ESP32 ao seu PC por um cabo USB Type-C.
  • Abra o Arduino IDE no seu PC.
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
  • Copie o código acima e abra com o Arduino IDE. Nenhuma biblioteca extra é necessária.
  • Compile e faça o upload do código para a placa ESP32 clicando no botão Upload no Arduino IDE.
  • Conecte o adaptador de 5V para alimentar o motor.
  • Abra o Serial Monitor e observe o motor ao mesmo tempo.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Forward - speeding up Forward - full speed Coast - motor free-runs to a stop Reverse - 70% speed Brake - fast stop ---------- Forward - speeding up Forward - full speed
Ln 11, Col 1
ESP32 Dev Module on COM15
2

※ Nota:

Se o motor girar no sentido "errado" quando o Serial Monitor mostrar Forward, é só trocar os dois fios do motor em OUT1 e OUT2. Se o motor não se mover de jeito nenhum, verifique se o pino EEP está conectado ao 3.3V.

Como Controlar Dois Motores DC usando o DRV8833

Diagrama de Ligação

Agora adicione o segundo motor em OUT3/OUT4 e conecte IN3/IN4 a mais dois pinos do ESP32. Pense no motor A como a roda esquerda e no motor B como a roda direita de um pequeno carro.

  • Como conectar o ESP32 e o módulo DRV8833 com fios jumper
Diagrama de ligação do ESP32 com DRV8833 e dois motores DC

This image is created using Fritzing. Click to enlarge image

Como conectar o ESP32 e o DRV8833 com dois motores DC usando bornes de parafuso

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 ESP32 / Outro
IN1 → GPIO27
IN2 → GPIO26
IN3 → GPIO33
IN4 → GPIO32
EEP → 3.3V
GND → GND do ESP32 e negativo (-) do adaptador de 5V
VCC → positivo (+) do adaptador de 5V
OUT1, OUT2 → motor A (esquerda)
OUT3, OUT4 → motor B (direita)

Código ESP32 - Dois Motores DC

Para manter o loop() curto, o código tem duas funções auxiliares, motorA(speed) e motorB(speed). A velocidade é um número com sinal de -255 a 255: um valor positivo gira para frente, um valor negativo gira em reverso e 0 deixa o motor em roda livre. Com essas duas funções auxiliares, cada movimento do carro precisa de apenas duas linhas.

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-drv8833-dc-motor-driver */ // ESP32 controls TWO DC motors through one DRV8833 motor driver (like a small robot car) // Motor A = left wheel, Motor B = right wheel #define PIN_IN1 27 // ESP32 pin GPIO27 connected to the IN1 pin of the DRV8833 (motor A) #define PIN_IN2 26 // ESP32 pin GPIO26 connected to the IN2 pin of the DRV8833 (motor A) #define PIN_IN3 33 // ESP32 pin GPIO33 connected to the IN3 pin of the DRV8833 (motor B) #define PIN_IN4 32 // ESP32 pin GPIO32 connected to the IN4 pin of the DRV8833 (motor B) #define CAR_SPEED 200 // driving speed, from 0 to 255 // Drive one channel with a signed speed: // speed > 0 -> forward (PWM on the first pin) // speed < 0 -> reverse (PWM on the second pin) // speed = 0 -> coast (both pins LOW) void driveChannel(int pinA, int pinB, int speed) { speed = constrain(speed, -255, 255); if (speed > 0) { analogWrite(pinB, 0); analogWrite(pinA, speed); } else if (speed < 0) { analogWrite(pinA, 0); analogWrite(pinB, -speed); } else { analogWrite(pinA, 0); analogWrite(pinB, 0); } } void motorA(int speed) { driveChannel(PIN_IN1, PIN_IN2, speed); } void motorB(int speed) { driveChannel(PIN_IN3, PIN_IN4, speed); } void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); pinMode(PIN_IN3, OUTPUT); pinMode(PIN_IN4, OUTPUT); // both motors stopped at start motorA(0); motorB(0); } void loop() { Serial.println("Car: forward"); motorA(CAR_SPEED); motorB(CAR_SPEED); delay(2000); Serial.println("Car: backward"); motorA(-CAR_SPEED); motorB(-CAR_SPEED); delay(2000); Serial.println("Car: turn left"); // left wheel back, right wheel forward motorA(-CAR_SPEED); motorB(CAR_SPEED); delay(1000); Serial.println("Car: turn right"); // left wheel forward, right wheel back motorA(CAR_SPEED); motorB(-CAR_SPEED); delay(1000); Serial.println("Car: stop"); motorA(0); motorB(0); delay(2000); }

Passos Rápidos

  • Faça a ligação para dois motores como na imagem acima.
  • Copie o código acima e abra com o Arduino IDE.
  • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP32.
  • Alimente os motores com o adaptador de 5V. Se você testar em cima de uma mesa, levante as rodas da mesa primeiro.
  • Veja o resultado no Serial Monitor e nos motores:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
Car: forward Car: backward Car: turn left Car: turn right Car: stop Car: forward Car: backward
Ln 11, Col 1
ESP32 Dev Module on COM15
2

Ao virar à esquerda, o motor A (esquerda) gira para trás e o motor B (direita) gira para frente, então o carro gira no mesmo lugar. Virar à direita é o oposto. Se uma roda for para o lado errado, troque apenas os dois fios desse motor.

※ Nota:

Este tutorial controla a velocidade de forma relativa (um valor PWM de 0 a 255). Para controlar a velocidade exata em rotações por minuto, você precisa de um motor com encoder e um laço de controle PID.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!