Arduino Nano ESP32 - Driver de Motor DC DRV8833

Neste guia, vamos acionar pequenos motores DC com o Arduino Nano ESP32 por meio de um módulo driver de motor DRV8833. O Nano ESP32 só fornece sinais de 3.3V, e o DRV8833 os aceita como estão, então nenhum conversor de nível é necessário. Em detalhes, vamos aprender:

Arduino Nano ESP32 DRV8833 DC motor driver

Hardware Necessário

1×Arduino Nano ESP32
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×DRV8833 Motor Driver Module
2×Motor DC 5V
1×5V Power Adapter
1×Conector de Alimentação DC
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano ESP32

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

※ Nota:

Na Parte 1 você só precisa de um motor DC. O segundo motor é usado na Parte 2.

Sobre o Driver de Motor DRV8833

Um pino GPIO do Arduino Nano ESP32 consegue fornecer apenas alguns miliamperes, muito pouco para girar um motor. O DRV8833 da Texas Instruments fica no meio do caminho: ele tem duas pontes H, uma para cada motor, e chaveia a corrente do motor a partir de uma fonte externa com base nos sinais que recebe do Nano ESP32. Como usa saídas MOSFET, ele perde muito menos tensão e esquenta menos do que o antigo L298N, o que o torna uma boa combinação para robôs a bateria de 3V a 9V. Ele também pode acionar um pequeno motor de passo bipolar, mas este guia cobre apenas motores DC.

DRV8833 motor driver module pinout

Principais características:

DRV8833
Alimentação do motor (pino VCC) 2.7V a 10.8V
Sinais lógicos 3.3V ou 5V (não precisa de alimentação lógica separada)
Corrente de saída cerca de 1.5A RMS por canal, 2A de pico com boa refrigeração
Canais 2 (dois motores DC), podem ser ligados em paralelo para cerca de 3A em um motor
Frequência PWM até 50kHz
Proteção subtensão, sobrecorrente, sobretemperatura

Pinagem

Os rótulos variam entre os fabricantes. Algumas placas imprimem IN1/IN2/OUT1, outras imprimem AIN1/AIN2/AOUT1, SLP ou FLT. A função de cada pino é a mesma:

  • Pinos IN1, IN2: controlam o motor A. Conecte a dois pinos PWM do Arduino Nano ESP32.
  • Pinos IN3, IN4: controlam o motor B. Conecte a mais dois pinos PWM.
  • Pinos OUT1, OUT2: conecte aos dois fios do motor A.
  • Pinos OUT3, OUT4: conecte aos dois fios do motor B.
  • Pino VCC: conecte ao + da fonte de alimentação do motor (2.7V a 10.8V).
  • Pino GND: conecte ao - da fonte de alimentação do motor E ao GND do Arduino Nano ESP32.
  • Pino EEP (sleep): conecte a 3.3V para ligar o driver. Se este pino estiver em LOW, o chip dorme e os motores não se movem.
  • Pino ULT (fault): vai para LOW quando o chip encontra um problema (sobrecorrente, superaquecimento, tensão baixa). É opcional, você pode deixá-lo desconectado.

Como o DRV8833 Controla um Motor

Diferente do L298N, o DRV8833 não tem pino de velocidade ENA/ENB. Cada motor é controlado apenas por suas duas entradas. A tabela mostra o que acontece no motor A (o motor B funciona igual com IN3 e IN4):

IN1 IN2 Motor A
LOW LOW Roda livre (o motor fica solto e desacelera sozinho)
HIGH LOW Para frente
LOW HIGH Para trás
HIGH HIGH Freio (o motor para rápido)

Para mudar a velocidade, envie um sinal PWM para uma entrada e mantenha a outra em LOW:

  • Para frente com velocidade: PWM em IN1, IN2 = LOW.
  • Para trás com velocidade: IN1 = LOW, PWM em IN2.

É por isso que os quatro pinos IN devem ir para pinos com capacidade PWM. No Arduino Nano ESP32, todo pino digital pode gerar PWM, então usamos D10, D9, D6 e D5.

※ Nota:

Nunca alimente um motor pelo pino 3.3V ou 5V do Arduino Nano ESP32. Use uma fonte externa para o pino VCC do DRV8833 e conecte todos os GNDs juntos. Sem um GND compartilhado, o driver não consegue ler os sinais de controle.

Se você quiser comparar, o tutorial Arduino Nano ESP32 - Motor DC faz o mesmo trabalho com o driver L298N, que é maior.

PARTE 1: Controlar um Motor DC com o DRV8833

Diagrama de Ligação

The wiring diagram between Arduino Nano ESP32 and DRV8833 one DC motor

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 Arduino Nano ESP32 / Outros
IN1 → D10
IN2 → D9
EEP → 3V3
GND → GND (e - do adaptador de 5V)
VCC → + do adaptador de 5V (via DC power jack)
OUT1, OUT2 → os dois fios do motor DC

Como Programar

  • Defina os dois pinos de controle como saídas.
pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT);
  • Gire para frente em uma velocidade escolhida (0 a 255).
analogWrite(PIN_IN1, speed); analogWrite(PIN_IN2, 0);
  • Gire para trás em uma velocidade escolhida.
analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, speed);
  • Freie rapidamente colocando as duas entradas em HIGH, ou deixe em roda livre colocando as duas em LOW.
analogWrite(PIN_IN1, 255); // brake analogWrite(PIN_IN2, 255);

※ Nota:

No Arduino Nano ESP32, depois que um pino é usado com analogWrite(), ele permanece no modo PWM. Por isso o código escreve 0 para LOW e 255 para HIGH com analogWrite() em vez de misturar digitalWrite().

Código Arduino Nano ESP32 - Um Motor DC

O sketch abaixo acelera o motor devagar, mantém a velocidade máxima, deixa-o em roda livre, o faz girar para trás e depois o freia. Cada etapa é impressa no Serial Monitor.

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-drv8833-dc-motor-driver */ // One DC motor on channel A of the DRV8833 module. // The DRV8833 has no ENA pin: the speed comes from PWM on IN1 or IN2. // On the Nano ESP32, a pin used by analogWrite() stays in PWM mode, so this code // also uses analogWrite() for LOW (0) and HIGH (255) instead of digitalWrite(). #define PIN_IN1 D10 // The Arduino Nano ESP32 pin connected to the IN1 pin of the DRV8833 #define PIN_IN2 D9 // The Arduino Nano ESP32 pin connected to the IN2 pin of the DRV8833 void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); motorCoast(); // start with the motor free (both inputs LOW) Serial.println("DRV8833 ready"); } void loop() { // 1) Spin forward and ramp the speed from 0 up to full Serial.println("Forward: speeding up"); for (int speed = 0; speed <= 255; speed += 5) { motorForward(speed); delay(40); } // 2) Keep full speed for 2 seconds Serial.println("Forward: full speed"); delay(2000); // 3) Coast: cut the drive, the motor slows down by itself Serial.println("Coast (free stop)"); motorCoast(); delay(2000); // 4) Spin in reverse at about 70% speed Serial.println("Reverse: 70% speed"); motorReverse(180); delay(2000); // 5) Brake: both inputs HIGH, the motor stops quickly Serial.println("Brake (fast stop)"); motorBrake(); delay(2000); } // Forward: PWM on IN1, IN2 stays LOW. speed = 0..255 void motorForward(int speed) { analogWrite(PIN_IN1, speed); analogWrite(PIN_IN2, 0); } // Reverse: IN1 stays LOW, PWM on IN2. speed = 0..255 void motorReverse(int speed) { analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, speed); } // Coast: IN1 = LOW, IN2 = LOW void motorCoast() { analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); } // Brake: IN1 = HIGH, IN2 = HIGH void motorBrake() { analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255); }

Passos Rápidos

Para começar com o Arduino Nano ESP32, siga estes passos:

  • Se você é novo no Arduino Nano ESP32, consulte o tutorial sobre como configurar o ambiente para o Arduino Nano ESP32 na Arduino IDE.
  • Ligue o DRV8833, o motor e o adaptador de 5V como mostrado acima. Confira duas vezes se o EEP vai para o 3V3.
  • Conecte a placa Arduino Nano ESP32 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Nano ESP32 e a porta COM correspondente.
  • Copie o código acima e cole-o na Arduino IDE. Nenhuma biblioteca extra é necessária.
  • Clique no botão Upload para enviar o código ao Arduino Nano ESP32.
  • Conecte o adaptador de 5V e depois abra o Serial Monitor.
  • Observe o motor: ele acelera, gira rápido, desliza até parar, gira para o outro lado e depois para bruscamente.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
DRV8833 ready Forward: speeding up Forward: full speed Coast (free stop) Reverse: 70% speed Brake (fast stop) Forward: speeding up Forward: full speed
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

※ Nota:

Se "Forward" faz o motor girar no sentido errado, basta trocar os dois fios do motor em OUT1 e OUT2. Se o motor não se move de jeito nenhum, verifique primeiro o pino EEP.

PARTE 2: Controlar Dois Motores DC com o DRV8833

Um DRV8833 tem espaço para dois motores, que é exatamente o que um carrinho robô de duas rodas precisa. O motor A é a roda esquerda e o motor B é a roda direita. Para virar, uma roda vai para frente enquanto a outra vai para trás.

Diagrama de Ligação

The wiring diagram between Arduino Nano ESP32 and DRV8833 two DC motors

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 Arduino Nano ESP32 / Outros
IN1 → D10
IN2 → D9
IN3 → D6
IN4 → D5
EEP → 3V3
GND → GND (e - do adaptador de 5V)
VCC → + do adaptador de 5V (via DC power jack)
OUT1, OUT2 → motor esquerdo (motor A)
OUT3, OUT4 → motor direito (motor B)

Código Arduino Nano ESP32 - Dois Motores DC

O código tem uma pequena função auxiliar para cada motor: motorA(speed) e motorB(speed). A velocidade vai de -255 a 255. Um número positivo significa para frente, um número negativo significa para trás, e 0 deixa o motor em roda livre. Com essas duas funções auxiliares, o carrinho anda para frente, anda para trás, vira à esquerda, vira à direita e para.

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-drv8833-dc-motor-driver */ // Two DC motors (a small robot car) with one DRV8833 module. // Motor A = left wheel (IN1, IN2), Motor B = right wheel (IN3, IN4). // On the Nano ESP32, a pin used by analogWrite() stays in PWM mode, so this code // also uses analogWrite() for LOW (0) and HIGH (255) instead of digitalWrite(). #define PIN_IN1 D10 // The Arduino Nano ESP32 pin connected to the IN1 pin of the DRV8833 (motor A) #define PIN_IN2 D9 // The Arduino Nano ESP32 pin connected to the IN2 pin of the DRV8833 (motor A) #define PIN_IN3 D6 // The Arduino Nano ESP32 pin connected to the IN3 pin of the DRV8833 (motor B) #define PIN_IN4 D5 // The Arduino Nano ESP32 pin connected to the IN4 pin of the DRV8833 (motor B) #define DRIVE_SPEED 200 // speed used for driving, 0..255 #define TURN_SPEED 160 // a bit slower when turning void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); pinMode(PIN_IN3, OUTPUT); pinMode(PIN_IN4, OUTPUT); stopCar(); } void loop() { Serial.println("Car: forward"); motorA(DRIVE_SPEED); motorB(DRIVE_SPEED); delay(2000); Serial.println("Car: backward"); motorA(-DRIVE_SPEED); motorB(-DRIVE_SPEED); delay(2000); Serial.println("Car: turn left"); motorA(-TURN_SPEED); // left wheel goes back motorB(TURN_SPEED); // right wheel goes forward delay(1000); Serial.println("Car: turn right"); motorA(TURN_SPEED); // left wheel goes forward motorB(-TURN_SPEED); // right wheel goes back delay(1000); Serial.println("Car: stop"); stopCar(); delay(2000); } // Signed speed: -255..255. Positive = forward, negative = reverse, 0 = coast void motorA(int speed) { setChannel(PIN_IN1, PIN_IN2, speed); } void motorB(int speed) { setChannel(PIN_IN3, PIN_IN4, speed); } void setChannel(int pinX1, int pinX2, int speed) { speed = constrain(speed, -255, 255); if (speed > 0) { // forward: PWM on the first pin analogWrite(pinX1, speed); analogWrite(pinX2, 0); } else if (speed < 0) { // reverse: PWM on the second pin analogWrite(pinX1, 0); analogWrite(pinX2, -speed); } else { // 0: coast analogWrite(pinX1, 0); analogWrite(pinX2, 0); } } // Brake both motors (all inputs HIGH) so the car stops quickly void stopCar() { analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255); analogWrite(PIN_IN3, 255); analogWrite(PIN_IN4, 255); }

Passos Rápidos

  • Adicione o segundo motor e os fios IN3/IN4 como mostrado no diagrama.
  • Copie o código acima e cole-o na Arduino IDE.
  • Clique no botão Upload para enviar o código ao Arduino Nano ESP32.
  • Levante o carrinho (ou segure os motores) para que as rodas possam girar livremente e depois conecte o adaptador de 5V.
  • Abra o Serial Monitor e compare a ação impressa com o que as rodas fazem.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' 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
Arduino Nano ESP32 on COM15
2

※ Nota:

Se o carrinho vira quando deveria ir reto, um motor está ligado ao contrário. Troque os dois fios desse motor nos pinos OUT dele.

Vídeo

※ 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!