Arduino UNO R4 - Driver de Motor DC DRV8833

Neste guia, vamos aprender como controlar motores DC a partir de um Arduino UNO R4 com a pequena placa driver de motor DRV8833. Começamos com um único motor e depois adicionamos um segundo motor, que é a base de um carrinho robô de duas rodas. Em detalhes, vamos aprender:

Arduino UNO R4 Driver de motor DC DRV8833

Sobre o Driver de Motor DRV8833

Um pino do Arduino UNO R4 só consegue fornecer alguns miliamperes, mas um pequeno motor DC precisa de centenas. A placa DRV8833 fica entre os dois. Ela é construída em torno de um chip da Texas Instruments com duas pontes H dentro, então uma placa aciona dois motores DC com escovas (ela também pode acionar um motor de passo bipolar). Se você leu nosso tutorial Arduino UNO R4 - Motor DC com o L298N, vai ver que o DRV8833 faz o mesmo trabalho com uma placa bem menor.

Fatos principais:

DRV8833
Tensão do motor (pino VCC) 2.7V a 10.8V
Sinais lógicos 3.3V e 5V funcionam (sem pino separado de alimentação lógica)
Corrente de saída cerca de 1.5A RMS por canal, 2A de pico (com boa refrigeração)
Chaves de saída MOSFETs, cerca de 360 mΩ (lado alto + lado baixo)
Frequência PWM até 50 kHz
Proteção bloqueio por subtensão, sobrecorrente, desligamento térmico

Como as saídas são MOSFETs, a tensão perdida dentro do driver é pequena. O L298N, mais antigo, perde alguns volts como calor, mas o DRV8833 passa quase toda a tensão da bateria para o motor. Isso o torna uma boa combinação para robôs com baterias de 3V a 9V. Se você precisa de mais corrente para um motor grande, os dois canais podem ser unidos em paralelo para cerca de 3A, mas não fazemos isso neste guia.

Pinagem do driver de motor DRV8833

Os pinos do módulo DRV8833 vermelho ou azul comum:

  • Pino VCC: conecte à fonte de alimentação do motor (2.7V a 10.8V). O chip gera sua própria tensão lógica a partir deste pino.
  • Pino GND: conecte ao terra da fonte de alimentação do motor e ao GND do Arduino UNO R4.
  • Pinos IN1, IN2: controlam o motor A. Conecte a dois pinos PWM do Arduino UNO R4.
  • 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 EEP (pino de sleep, nSLEEP): precisa estar em HIGH para ligar o driver. Conecte-o ao pino 5V do Arduino UNO R4. Se estiver em LOW, o chip dorme e os motores não se movem.
  • Pino ULT (pino de falha, nFAULT): vai para LOW quando o chip detecta um problema, como sobrecorrente ou superaquecimento. Ele é opcional, e você pode deixá-lo desconectado.

※ Nota:

Os nomes dos pinos variam entre os vendedores. Algumas placas imprimem AIN1/AIN2/BIN1/BIN2, AOUT1/AOUT2/BOUT1/BOUT2, SLP e FLT no lugar. A função de cada pino continua a mesma.

Como os pinos IN controlam um motor

O L298N tem os pinos ENA/ENB para a velocidade. O DRV8833 não tem esse pino. Cada canal usa apenas seus dois pinos IN, e eles definem tanto a direção quanto a velocidade. Esta é a tabela para o motor A (o motor B funciona do mesmo jeito com IN3 e IN4):

IN1 IN2 Motor A
LOW LOW Roda livre (sem energia, o motor rola até parar)
HIGH LOW Gira para frente
LOW HIGH Gira em reverso
HIGH HIGH Freio (o motor para rapidamente)

Para mudar a velocidade, envie um sinal PWM em vez de um HIGH constante:

  • Para frente em uma velocidade escolhida: PWM em IN1, IN2 em LOW.
  • Reverso em uma velocidade escolhida: IN1 em LOW, PWM em IN2.

Então os dois pinos IN de um canal precisam ser pinos PWM. No Arduino UNO R4 WiFi e no Minima, os pinos PWM são marcados com um sinal "~". Neste guia usamos D10 e D9 para o motor A, e D6 e D5 para o motor B.

Alimentando os motores

Nunca alimente os motores pelo pino 5V ou 3.3V do Arduino UNO R4. Alimente o pino VCC do DRV8833 com uma fonte separada, como um adaptador de 5V através de um conector de alimentação DC, ou um conjunto de 4 pilhas AA (cerca de 6V). Depois, junte o GND dessa fonte, o GND do DRV8833 e o GND do Arduino UNO R4. Sem esse terra comum, os sinais IN não têm referência e os motores agem de forma estranha.

Parte 1 - Controlar Um Motor DC

Diagrama de Ligação

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

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 Arduino UNO R4 / outro
IN1 D10
IN2 D9
EEP 5V
GND GND (e o negativo do adaptador de 5V)
VCC positivo do adaptador de 5V
OUT1, OUT2 os dois fios do motor DC

Como Programar o DRV8833

  • Defina os dois pinos que vão para IN1 e IN2:
#define IN1_PIN 10 #define IN2_PIN 9
  • Torne-os saídas no setup():
pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT);
  • Gire para frente em uma velocidade de 0 a 255:
analogWrite(IN1_PIN, speed); analogWrite(IN2_PIN, 0);
  • Gire em reverso:
analogWrite(IN1_PIN, 0); analogWrite(IN2_PIN, speed);
  • Roda livre (os dois em LOW) ou freio (os dois em HIGH):
analogWrite(IN1_PIN, 0); analogWrite(IN2_PIN, 0); // coast analogWrite(IN1_PIN, 255); analogWrite(IN2_PIN, 255); // brake

No código completo, essas linhas ficam dentro de uma pequena função motorA(speed). Uma velocidade positiva significa para frente, uma velocidade negativa significa reverso e 0 significa roda livre. Usamos analogWrite() com 0 e 255 para LOW e HIGH, assim os mesmos pinos nunca alternam entre o modo PWM e o modo digital.

Código Arduino UNO R4 - Um Motor DC

O código abaixo:

  • Acelera o motor lentamente no sentido para frente
  • Mantém a velocidade máxima por 2 segundos
  • Deixa o motor parar em roda livre
  • Faz o motor girar em reverso a cerca de 70% da velocidade
  • Freia com força e depois repete
/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-drv8833-dc-motor-driver */ // Arduino UNO R4 + DRV8833: control ONE DC motor (channel A) // Both IN pins must be PWM pins (marked with ~ on the board). #define IN1_PIN 10 // The Arduino UNO R4 pin connected to the IN1 pin of the DRV8833 #define IN2_PIN 9 // The Arduino UNO R4 pin connected to the IN2 pin of the DRV8833 // speed: -255 (full reverse) ... 0 (coast) ... 255 (full forward) void motorA(int speed) { speed = constrain(speed, -255, 255); if (speed > 0) { // forward: PWM on IN1, IN2 LOW analogWrite(IN1_PIN, speed); analogWrite(IN2_PIN, 0); } else if (speed < 0) { // reverse: IN1 LOW, PWM on IN2 analogWrite(IN1_PIN, 0); analogWrite(IN2_PIN, -speed); } else { // coast: both LOW, the motor slows down by itself analogWrite(IN1_PIN, 0); analogWrite(IN2_PIN, 0); } } // brake: both HIGH, the motor stops quickly void motorABrake() { analogWrite(IN1_PIN, 255); analogWrite(IN2_PIN, 255); } void setup() { Serial.begin(9600); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); motorA(0); // start with the motor stopped Serial.println("DRV8833 - one DC motor demo"); } void loop() { // 1. Speed up slowly in the forward direction Serial.println("Forward: speeding up"); for (int speed = 0; speed <= 255; speed += 5) { motorA(speed); delay(40); } // 2. Keep full speed for 2 seconds Serial.println("Forward: full speed"); delay(2000); // 3. Coast: cut the power and let the motor roll to a stop Serial.println("Coast (free stop)"); motorA(0); delay(1500); // 4. Run in reverse at about 70% speed Serial.println("Reverse: 70% speed"); motorA(-180); delay(2000); // 5. Brake: stop the motor fast Serial.println("Brake (fast stop)"); motorABrake(); delay(1500); }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima no Arduino IDE.
  • Ligue o módulo DRV8833, o motor DC e o adaptador de 5V conforme o diagrama fornecido. Verifique se o EEP vai para o 5V e se todos os terras estão unidos.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 apropriada (por exemplo, Arduino Uno R4 Minima) e a porta COM.
  • Copie o código acima e cole no Arduino IDE.
  • Clique no botão Upload para enviar o código para o Arduino UNO R4.
  • Conecte o adaptador de 5V para alimentar o motor.
  • Abra o Serial Monitor e observe o motor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
DRV8833 - one DC motor demo 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 Uno R4 WiFi on COM15
2

Ouça a diferença entre as duas paradas: na etapa de roda livre o motor desacelera suavemente, e na etapa de freio ele para quase de imediato.

※ Nota:

Se o motor girar no sentido errado, troque os dois fios do motor em OUT1 e OUT2. Se o motor não se mover de jeito nenhum, verifique primeiro o pino EEP: quando ele não está em HIGH, o driver dorme.

Parte 2 - Controlar Dois Motores DC

Agora usamos também o canal B. Com um motor na roda esquerda e um na roda direita, o Arduino UNO R4 pode guiar um pequeno carro apenas mudando a direção de cada roda.

Diagrama de Ligação

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

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Uno R4 e outros componentes.

Módulo DRV8833 Arduino UNO R4 / outro
IN1 D10
IN2 D9
IN3 D6
IN4 D5
EEP 5V
GND GND (e o negativo do adaptador de 5V)
VCC positivo do adaptador de 5V
OUT1, OUT2 motor A (roda esquerda)
OUT3, OUT4 motor B (roda direita)

Código Arduino UNO R4 - Dois Motores DC

Este código adiciona uma função motorB(speed) e um auxiliar drive() que define os dois motores e imprime o nome da ação. O carro anda para frente, para, anda para trás, depois vira à esquerda (motor A em reverso, motor B para frente) e à direita (o oposto).

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-drv8833-dc-motor-driver */ // Arduino UNO R4 + DRV8833: control TWO DC motors, like a small robot car // All four IN pins must be PWM pins (marked with ~ on the board). #define IN1_PIN 10 // Motor A (left wheel) - DRV8833 IN1 #define IN2_PIN 9 // Motor A (left wheel) - DRV8833 IN2 #define IN3_PIN 6 // Motor B (right wheel) - DRV8833 IN3 #define IN4_PIN 5 // Motor B (right wheel) - DRV8833 IN4 #define DRIVE_SPEED 200 // driving speed, 0 to 255 // Set one channel. speed: -255 (full reverse) ... 0 (coast) ... 255 (full forward) void setChannel(int pinA, int pinB, int speed) { speed = constrain(speed, -255, 255); if (speed >= 0) { analogWrite(pinA, speed); // forward (or coast when speed is 0) analogWrite(pinB, 0); } else { analogWrite(pinA, 0); // reverse analogWrite(pinB, -speed); } } void motorA(int speed) { setChannel(IN1_PIN, IN2_PIN, speed); } void motorB(int speed) { setChannel(IN3_PIN, IN4_PIN, speed); } // Run one action for a given time and print its name void drive(const char *action, int speedA, int speedB, unsigned long ms) { Serial.println(action); motorA(speedA); motorB(speedB); delay(ms); } void setup() { Serial.begin(9600); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); pinMode(IN3_PIN, OUTPUT); pinMode(IN4_PIN, OUTPUT); Serial.println("DRV8833 - two DC motors demo"); } void loop() { drive("Move forward", DRIVE_SPEED, DRIVE_SPEED, 2000); drive("Stop", 0, 0, 1000); drive("Move backward", -DRIVE_SPEED, -DRIVE_SPEED, 2000); drive("Stop", 0, 0, 1000); drive("Turn left", -DRIVE_SPEED, DRIVE_SPEED, 800); // A reverse, B forward drive("Stop", 0, 0, 1000); drive("Turn right", DRIVE_SPEED, -DRIVE_SPEED, 800); // A forward, B reverse drive("Stop", 0, 0, 2000); }

Passos Rápidos

  • Adicione o segundo motor e os fios IN3/IN4 como mostrado no diagrama acima.
  • Copie o código e abra no Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino UNO R4.
  • Alimente os motores com o adaptador de 5V.
  • Abra o Serial Monitor. Levante as rodas da mesa para que o carro não saia correndo enquanto você testa.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
DRV8833 - two DC motors demo Move forward Stop Move backward Stop Turn left Stop Turn right Stop Move forward
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Se o carro virar à direita quando o Serial Monitor disser "Turn left", um motor está ligado ao contrário. Troque os fios desse motor nos pinos OUT dele.

※ Nota:

Dois motores puxam mais corrente que um. Se o Arduino UNO R4 reiniciar quando os dois motores partirem, sua fonte está fraca demais. Use um adaptador mais forte ou pilhas novas, e mantenha a alimentação dos motores separada da alimentação USB.

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!