Arduino - Driver de Motor DC DRV8833

Neste tutorial, vamos aprender:

Arduino Driver de Motor DC DRV8833

Se você nunca usou um motor DC, o tutorial Arduino - Motor DC explica como funcionam a velocidade e o sentido com o driver L298N, que é maior.

Hardware Necessário

1×Arduino Uno R3
1×Cabo USB 2.0 tipo A/B (para PC com USB-A)
1×Cabo USB 2.0 tipo C/B (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×Fios Jumper
1×(Recomendado) Shield com Bornes de Parafuso para Arduino Uno
1×(Recomendado) Sensors/Servo Expansion Shield for Arduino Uno
1×(Recomendado) Shield de Protoboard para Arduino Uno
1×(Recomendado) Case para Arduino Uno
1×(Recomendado) Placa Base de Prototipagem e Kit de Protoboard para Arduino Uno

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
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.

Para a PARTE 1, um motor DC é suficiente. O segundo motor só é necessário para a PARTE 2.

Sobre o Driver de Motor DRV8833

O DRV8833 é um chip pequeno da Texas Instruments com duas pontes H dentro. Uma ponte H pode girar um motor DC com escovas nos dois sentidos, então o módulo aciona dois motores DC (ou um pequeno motor de passo bipolar, mas isso não é abordado aqui). Suas saídas são MOSFETs com uma resistência muito baixa, cerca de 360 mΩ. Por causa disso, o motor recebe quase toda a tensão da bateria e o chip fica frio. O velho L298N perde cerca de 2V dentro dele mesmo, então o DRV8833 é uma escolha melhor para robôs que funcionam com baterias de 3V a 9V.

Pinagem do Driver de Motor DRV8833
DRV8833
Tensão de Alimentação do Motor (VCC) 2.7V a 10.8V
Tensão de Entrada Lógica 3.3V ou 5V (sem alimentação lógica separada)
Corrente de Saída 1.5A RMS por canal, 2A de pico
Número de Canais 2 (motor A e motor B)
Frequência PWM até 50 kHz
Proteção subtensão, sobrecorrente, sobretemperatura

O módulo DRV8833 comum tem estes pinos:

  • Pino VCC: precisa ser conectado ao fio positivo da fonte de alimentação do motor (2.7V a 10.8V)
  • Pino GND: precisa ser conectado ao GND da fonte de alimentação e ao GND do Arduino
  • Pinos IN1, IN2: controlam o motor A. Eles precisam ser conectados a dois pinos PWM do Arduino
  • Pinos IN3, IN4: controlam o motor B. Eles precisam ser conectados a outros dois pinos PWM do Arduino
  • Pinos OUT1, OUT2: conectam-se aos dois fios do motor A
  • Pinos OUT3, OUT4: conectam-se aos dois fios do motor B
  • Pino EEP: o pino de repouso (nSLEEP). Ele precisa estar em HIGH para ligar o driver. Nós o conectamos ao 5V do Arduino. Se ele estiver em LOW, o chip dorme e os motores não se movem.
  • Pino ULT: o pino de falha (nFAULT). Ele vai para LOW quando há um problema, como corrente ou calor demais. Podemos deixá-lo sem conexão.

Os rótulos não são iguais em todos os módulos. Algumas placas imprimem AIN1, AIN2, BIN1, BIN2, AOUT1, AOUT2... para as entradas e saídas, e SLP e FLT para os pinos de repouso e de falha. As funções são as mesmas.

Ao contrário do L298N, o DRV8833 não precisa de uma alimentação lógica de 5V vinda do Arduino. O chip gera sua própria tensão lógica a partir do VCC. O Arduino só precisa compartilhar o mesmo GND.

Como Controlar um Motor com Dois Pinos

Não existe pino de velocidade ENA ou ENB no DRV8833. Cada motor é controlado por apenas dois pinos de entrada. A tabela abaixo mostra o que acontece com 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 e desacelera sozinho)
HIGH LOW Para frente
LOW HIGH Reverso
HIGH HIGH Freio (o motor para rapidamente)

Para definir a velocidade, enviamos um sinal PWM para uma entrada e mantemos a outra entrada em LOW:

  • Para frente com velocidade: PWM em IN1, IN2 em LOW
  • Reverso com velocidade: IN1 em LOW, PWM em IN2

É por isso que os dois pinos de um motor precisam ser pinos PWM. No Arduino Uno, os pinos PWM são 3, 5, 6, 9, 10 e 11.

※ Nota:

  • Nunca alimente os motores pelo pino 5V do Arduino. Os motores precisam de muito mais corrente do que o Arduino pode fornecer. Use uma fonte de alimentação externa.
  • O GND da fonte de alimentação, do DRV8833 e do Arduino deve ser conectado junto.
  • Se um motor girar no sentido errado, basta trocar os dois fios dele nos pinos OUT.

PARTE 1: Arduino Controla Um Motor DC com DRV8833

Diagrama de Ligação

Diagrama de ligação do Arduino com DRV8833 e um motor DC

This image is created using Fritzing. Click to enlarge image

Tabela de ligação do Módulo DRV8833 e do Arduino Uno

Módulo DRV8833 Arduino Uno / Outro
IN1 → Pino 10
IN2 → Pino 9
EEP → 5V
GND → GND (e GND da fonte de alimentação de 5V)
VCC → positivo (+) da fonte de alimentação de 5V pelo conector de alimentação DC
OUT1, OUT2 → os dois fios do motor DC

Como Programar o DRV8833

  • Defina os pinos do Arduino conectados a IN1 e IN2:
#define AIN1_PIN 10 #define AIN2_PIN 9
  • Configure os pinos como saídas:
pinMode(AIN1_PIN, OUTPUT); pinMode(AIN2_PIN, OUTPUT);
  • Faça o motor girar para frente com uma velocidade de 0 a 255:
digitalWrite(AIN2_PIN, LOW); analogWrite(AIN1_PIN, speed);
  • Faça o motor girar em reverso:
digitalWrite(AIN1_PIN, LOW); analogWrite(AIN2_PIN, speed);
  • Deixe o motor parar em roda livre:
digitalWrite(AIN1_PIN, LOW); digitalWrite(AIN2_PIN, LOW);
  • Freie o motor:
digitalWrite(AIN1_PIN, HIGH); digitalWrite(AIN2_PIN, HIGH);

Código Arduino - DRV8833 com Um Motor DC

O código abaixo faz o seguinte:

  • Acelera o motor lentamente para frente
  • Funciona em velocidade máxima por 2 segundos
  • Para em roda livre
  • Gira em reverso em velocidade média
  • Freia até parar rapidamente
  • Repete tudo de novo e de novo
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-drv8833-dc-motor-driver */ // Arduino Uno pins connected to the DRV8833 module (both must be PWM pins) #define AIN1_PIN 10 // the Arduino pin connected to the IN1 pin of DRV8833 #define AIN2_PIN 9 // the Arduino pin connected to the IN2 pin of DRV8833 // the setup function runs once when you press reset or power the board void setup() { Serial.begin(9600); pinMode(AIN1_PIN, OUTPUT); pinMode(AIN2_PIN, OUTPUT); motorCoast(); // make sure the motor is not moving at start Serial.println("DRV8833 is ready"); } // the loop function runs over and over again forever void loop() { // 1. Speed up slowly in the forward direction Serial.println("Forward: speeding up"); for (int speed = 0; speed <= 255; speed += 5) { motorForward(speed); delay(40); } // 2. Keep the full speed for 2 seconds Serial.println("Forward: full speed"); delay(2000); // 3. Coast: the motor slows down by itself Serial.println("Coast (free stop)"); motorCoast(); delay(1500); // 4. Run backward at about 70% speed Serial.println("Reverse: speed 180"); motorReverse(180); delay(2000); // 5. Brake: the motor stops quickly Serial.println("Brake (fast stop)"); motorBrake(); delay(1500); } // forward: PWM on IN1, IN2 is LOW. speed: 0 to 255 void motorForward(int speed) { digitalWrite(AIN2_PIN, LOW); analogWrite(AIN1_PIN, speed); } // reverse: IN1 is LOW, PWM on IN2. speed: 0 to 255 void motorReverse(int speed) { digitalWrite(AIN1_PIN, LOW); analogWrite(AIN2_PIN, speed); } // coast: both inputs LOW -> motor outputs are off void motorCoast() { digitalWrite(AIN1_PIN, LOW); digitalWrite(AIN2_PIN, LOW); } // brake: both inputs HIGH -> motor wires are shorted, fast stop void motorBrake() { digitalWrite(AIN1_PIN, HIGH); digitalWrite(AIN2_PIN, HIGH); }

Passos Rápidos

  • Faça a ligação como mostrado no diagrama acima. Conecte a fonte de alimentação de 5V por último.
  • Conecte o Arduino ao PC por cabo USB
  • Abra a Arduino IDE, selecione a placa e a porta corretas
  • Copie o código acima e abra-o com a Arduino IDE
  • Clique no botão Upload na Arduino IDE para fazer o upload do código para o Arduino
  • Observe o motor: ele acelera, funciona, para em roda livre, volta e freia
  • Abra o Serial Monitor para ver o que o motor está fazendo a cada momento
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
DRV8833 is ready Forward: speeding up Forward: full speed Coast (free stop) Reverse: speed 180 Brake (fast stop) Forward: speeding up Forward: full speed Coast (free stop)
Ln 11, Col 1
Arduino Uno on COM15
2

Veja a diferença entre as duas paradas. Depois de "Coast", o motor continua girando por um curto tempo. Depois de "Brake", ele para quase de imediato.

PARTE 2: Arduino Controla Dois Motores DC com DRV8833

Com dois motores, podemos construir a base de um pequeno carrinho robô: o motor A é a roda esquerda e o motor B é a roda direita.

Diagrama de Ligação

Diagrama de ligação do Arduino com DRV8833 e dois motores DC

This image is created using Fritzing. Click to enlarge image

Tabela de ligação do Módulo DRV8833 e do Arduino Uno

Módulo DRV8833 Arduino Uno / Outro
IN1 → Pino 10
IN2 → Pino 9
IN3 → Pino 6
IN4 → Pino 5
EEP → 5V
GND → GND (e GND da fonte de alimentação de 5V)
VCC → positivo (+) da fonte de alimentação de 5V pelo conector de alimentação DC
OUT1, OUT2 → motor A (esquerdo)
OUT3, OUT4 → motor B (direito)

Como Programar para Dois Motores DC

Para manter o código curto, usamos uma função auxiliar para cada motor. Ela recebe uma velocidade com sinal:

  • Um valor positivo (1 a 255) faz o motor girar para frente
  • Um valor negativo (-1 a -255) faz o motor girar em reverso
  • 0 deixa o motor em roda livre
motorA(200); // left wheel forward motorB(-200); // right wheel backward

Para virar o carrinho, as duas rodas giram em sentidos opostos:

  • Virar à esquerda: motor A em reverso, motor B para frente
  • Virar à direita: motor A para frente, motor B em reverso

Código Arduino - DRV8833 com Dois Motores DC

O código abaixo move o carrinho para frente, para trás, vira à esquerda, vira à direita e depois para.

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-drv8833-dc-motor-driver */ // Arduino Uno pins connected to the DRV8833 module (all four are PWM pins) #define AIN1_PIN 10 // IN1 - motor A (left wheel) #define AIN2_PIN 9 // IN2 - motor A (left wheel) #define BIN1_PIN 6 // IN3 - motor B (right wheel) #define BIN2_PIN 5 // IN4 - motor B (right wheel) #define CAR_SPEED 200 // driving speed, from 0 to 255 void setup() { Serial.begin(9600); pinMode(AIN1_PIN, OUTPUT); pinMode(AIN2_PIN, OUTPUT); pinMode(BIN1_PIN, OUTPUT); pinMode(BIN2_PIN, OUTPUT); stopCar(); Serial.println("Two-motor car is ready"); } 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"); motorA(-CAR_SPEED); // left wheel goes back motorB(CAR_SPEED); // right wheel goes forward delay(1000); Serial.println("Car: turn right"); motorA(CAR_SPEED); // left wheel goes forward motorB(-CAR_SPEED); // right wheel goes back delay(1000); Serial.println("Car: stop"); stopCar(); delay(2000); } // control motor A. speed: -255 (full reverse) to 255 (full forward), 0 = coast void motorA(int speed) { setMotor(AIN1_PIN, AIN2_PIN, speed); } // control motor B. speed: -255 (full reverse) to 255 (full forward), 0 = coast void motorB(int speed) { setMotor(BIN1_PIN, BIN2_PIN, speed); } // shared helper for one DRV8833 channel void setMotor(int in1, int in2, int speed) { speed = constrain(speed, -255, 255); if (speed > 0) { // forward: PWM on IN1, IN2 LOW digitalWrite(in2, LOW); analogWrite(in1, speed); } else if (speed < 0) { // reverse: IN1 LOW, PWM on IN2 digitalWrite(in1, LOW); analogWrite(in2, -speed); } else { // coast: both LOW digitalWrite(in1, LOW); digitalWrite(in2, LOW); } } // stop both motors quickly (brake: both inputs HIGH) void stopCar() { digitalWrite(AIN1_PIN, HIGH); digitalWrite(AIN2_PIN, HIGH); digitalWrite(BIN1_PIN, HIGH); digitalWrite(BIN2_PIN, HIGH); }

Passos Rápidos

  • Faça a ligação para dois motores como mostrado no diagrama acima
  • Conecte o Arduino ao PC por cabo USB
  • Copie o código acima e abra-o com a Arduino IDE
  • Clique no botão Upload na Arduino IDE para fazer o upload do código para o Arduino
  • Levante as rodas da mesa (ou coloque o carrinho no chão com espaço suficiente)
  • Veja o resultado no Serial Monitor
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Two-motor car is ready Car: forward Car: backward Car: turn left Car: turn right Car: stop Car: forward Car: backward
Ln 11, Col 1
Arduino Uno on COM15
2

※ Nota:

Se o carrinho virar à direita quando deveria virar à esquerda, troque os dois fios de um motor nos pinos OUT dele, ou troque o motor A e o motor B no código.

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!