ESP8266 - Driver de Motor DC DRV8833

Este tutorial ensina você a usar o ESP8266 junto com o pequeno driver DRV8833 para girar motores DC para frente e para trás em qualquer velocidade. Em detalhes, vamos aprender:

Sugerimos:

ESP8266 NodeMCU DRV8833 DC motor driver

Hardware Necessário

1×ESP8266 NodeMCU ESP-12F
1×Alternatively, ESP8266 D1 Mini NodeMCU ESP-12F
1×Alternatively, ESP8266 NodeMCU ESP-12E (Uno-form)
1×Micro USB Cable
1×Alternatively, ESP8266 NodeMCU ESP-12F (SMD-form)
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 ESP8266

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.

Sobre o Driver de Motor DRV8833

O DRV8833 é um minúsculo chip de ponte H dupla fabricado pela Texas Instruments. Um módulo consegue acionar dois motores DC com escovas de forma independente (ele também pode acionar um motor de passo bipolar, mas isso não é abordado aqui). Suas saídas são MOSFETs com uma baixa resistência em condução de cerca de 360 mΩ, então o motor recebe quase toda a tensão da alimentação e o chip fica frio. Isso é um grande avanço em relação ao antigo L298N, que perde cerca de 2V dentro de si mesmo.

Fatos principais:

DRV8833
Alimentação do motor (pino VCC) 2.7V a 10.8V
Corrente de saída cerca de 1.5A RMS por canal, 2A de pico (com boa refrigeração)
Número de motores 2 motores DC (ou 1 motor de passo bipolar)
Nível das entradas lógicas 3.3V ou 5V (não precisa de alimentação lógica separada)
Frequência PWM até 50 kHz
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. Por causa disso, os sinais de 3.3V do ESP8266 podem acioná-lo diretamente, sem conversor de nível. Se você precisa de mais corrente para um motor grande, os dois canais podem ser ligados em paralelo para cerca de 3A, mas isso é opcional.

Pinagem do Driver de Motor DRV8833

DRV8833 motor driver pinout

A placa breakout DRV8833 comum, vermelha ou azul, tem 12 pinos:

  • Pino VCC: deve ser conectado à fonte de alimentação do motor (2.7V a 10.8V). Este NÃO é o pino 3.3V do ESP8266.
  • Pino GND: deve ser conectado ao terra da alimentação do motor E ao GND do ESP8266
  • Pinos IN1, IN2: entradas de controle do motor A, devem ser conectados a dois pinos PWM do ESP8266
  • Pinos IN3, IN4: entradas de controle do motor B, devem ser conectados a dois outros pinos PWM
  • Pinos OUT1, OUT2: saídas para o motor A
  • Pinos OUT3, OUT4: saídas para o motor B
  • Pino EEP: o pino de sleep (nSLEEP). Ele deve estar em HIGH para ligar o driver. Conecte-o ao 3.3V do ESP8266. Se 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 o chip detecta um problema (sobrecorrente, superaquecimento, tensão baixa). É opcional e pode ficar desconectado.

※ Nota:

Os rótulos dos pinos mudam de um fabricante para outro. Algumas placas imprimem AIN1/AIN2/BIN1/BIN2, AOUT1/AOUT2/BOUT1/BOUT2, SLP e FLT no lugar dos nomes acima. A função de cada pino é a mesma. Sempre siga os rótulos impressos no seu próprio módulo.

Como o DRV8833 Controla um Motor

Diferente do L298N, o DRV8833 não tem pino de velocidade ENA/ENB. Cada motor é controlado apenas por seus dois pinos de entrada. A tabela abaixo é para o motor A (IN1, IN2). O motor B funciona da mesma forma com IN3 e IN4.

IN1 IN2 Motor A
LOW LOW Roda livre (o motor é solto e gira livre até parar)
HIGH LOW Gira para frente
LOW HIGH Gira para trás
HIGH HIGH Freio (o motor para rápido)

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

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

Por causa disso, os dois pinos de entrada de cada canal devem ser pinos do ESP8266 com capacidade PWM.

Escolhendo os Pinos do ESP8266

Quase todo GPIO do NodeMCU pode gerar PWM com analogWrite(), mas alguns pinos são uma má escolha para um driver de motor:

  • O D0 (GPIO16) não consegue gerar PWM.
  • D3 (GPIO0), D4 (GPIO2) e D8 (GPIO15) são pinos de modo de boot. Um dispositivo que os puxe para o lado errado na hora de ligar pode impedir o ESP8266 de iniciar.

Então, neste tutorial usamos D5 e D6 para o motor A. Para o motor B usamos D1 e D2. D1 e D2 são os pinos I2C padrão, mas estão livres aqui porque nenhum dispositivo I2C está conectado. Se você adicionar um módulo I2C mais tarde, mova o motor B para o D7 e outro pino livre.

Sobre a faixa do PWM: desde o ESP8266 Arduino core 3.0, analogWrite() recebe por padrão um valor de 0 a 255. O core 2.x mais antigo usava de 0 a 1023. O código abaixo chama analogWriteRange(255) no setup(), então 255 sempre significa velocidade máxima, não importa qual versão do core você tenha instalada.

Como Programar o DRV8833

  • O primeiro passo é definir os pinos do ESP8266 que estão conectados a IN1 e IN2:
#define PIN_IN1 D5 #define PIN_IN2 D6
  • Defina os dois pinos como saídas e fixe a faixa do PWM em 0 - 255:
pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); analogWriteRange(255);
  • Gire para frente em uma dada velocidade (0 a 255):
analogWrite(PIN_IN1, speed); analogWrite(PIN_IN2, 0);
  • Gire para trás em uma dada velocidade:
analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, speed);
  • Roda livre (deixe o motor rolar até parar):
analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0);
  • Freio (pare rapidamente):
analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255);

Parte 1 - O ESP8266 Controla Um Motor DC via DRV8833

Diagrama de Ligação

O motor é alimentado por um adaptador externo de 5V através do DC power jack. O ESP8266 apenas envia os sinais de controle.

The wiring diagram between ESP8266 NodeMCU and DRV8833 one DC motor

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

Módulo DRV8833 ESP8266 NodeMCU / Outro
IN1 D5
IN2 D6
EEP 3.3V
GND GND (ESP8266) e negativo (-) da fonte de 5V
VCC positivo (+) da fonte de 5V
OUT1, OUT2 os dois fios do motor DC
ULT não conectado

※ Nota:

  • Nunca alimente o motor pelo pino 3.3V ou VIN do ESP8266. Motores puxam corrente alta e geram ruído elétrico que pode reiniciar a placa.
  • O GND da fonte do motor, o do DRV8833 e o do ESP8266 devem estar todos conectados entre si. Sem um terra comum, o motor não vai responder.

Código ESP8266 para o DRV8833 - Um Motor

Este código acelera o motor no sentido para frente, mantém a velocidade máxima, deixa-o em roda livre, gira-o para trás a cerca de 70% da velocidade e depois o freia. Cada etapa é impressa no Serial Monitor.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-drv8833-dc-motor-driver */ /* * ESP8266 NodeMCU - control ONE DC motor with the DRV8833 driver * * Channel A of the DRV8833 is used: * IN1 <- D5 (GPIO14) * IN2 <- D6 (GPIO12) * EEP (sleep pin) is tied to 3.3V, so the driver is always awake. * * The DRV8833 has no enable/speed pin. Speed is set by PWM on IN1 or IN2: * forward : PWM on IN1, IN2 = LOW * reverse : IN1 = LOW, PWM on IN2 * coast : IN1 = LOW, IN2 = LOW * brake : IN1 = HIGH, IN2 = HIGH */ #define PIN_IN1 D5 // ESP8266 pin connected to IN1 of the DRV8833 #define PIN_IN2 D6 // ESP8266 pin connected to IN2 of the DRV8833 void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); // ESP8266 core 3.x uses 0-255 by default, core 2.x used 0-1023. // Setting it here makes the sketch work the same on both versions. analogWriteRange(255); motorCoast(); // start with the motor stopped } void loop() { // 1. Forward: ramp the speed up from 0 to full Serial.println("Forward - speeding up"); for (int speed = 0; speed <= 255; speed += 5) { motorForward(speed); delay(40); } // 2. Hold full speed for 2 seconds Serial.println("Forward - full speed"); delay(2000); // 3. Coast: release the motor, it slows down by itself Serial.println("Coast - motor free-runs to a stop"); motorCoast(); delay(2000); // 4. Reverse at about 70% speed Serial.println("Reverse - 70% speed"); motorReverse(180); delay(2000); // 5. Brake: short the motor for a quick stop Serial.println("Brake - fast stop"); motorBrake(); delay(2000); } // speed: 0 (stopped) .. 255 (full speed) void motorForward(int speed) { analogWrite(PIN_IN1, speed); analogWrite(PIN_IN2, 0); } void motorReverse(int speed) { analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, speed); } void motorCoast() { analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); } void motorBrake() { analogWrite(PIN_IN1, 255); // 255 = always HIGH analogWrite(PIN_IN2, 255); }

Passos Rápidos

Para começar com o ESP8266 na Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para o ESP8266 na Arduino IDE se esta é a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama. Mantenha o adaptador de 5V desconectado por enquanto.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Copie o código acima e cole-o na Arduino IDE. Nenhuma biblioteca extra é necessária.
  • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
  • Conecte o adaptador de 5V para alimentar o motor.
  • Abra o Serial Monitor e observe o motor:
    • Ele acelera devagar e depois funciona em velocidade máxima por 2 segundos.
    • Ele é solto e rola até parar.
    • Ele gira para o outro lado em uma velocidade mais baixa.
    • Ele para bruscamente quando o freio é aplicado.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E 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 Coast - motor free-runs to a stop
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

    ※ Nota:

    Se o motor girar no sentido "errado", basta trocar os dois fios do motor em OUT1 e OUT2. Nenhuma mudança no código é necessária.

Parte 2 - O ESP8266 Controla Dois Motores DC via DRV8833

Agora vamos usar os dois canais do DRV8833. Pense no motor A como a roda esquerda e no motor B como a roda direita de um pequeno carrinho robô.

Diagrama de Ligação

The wiring diagram between ESP8266 NodeMCU and DRV8833 two DC motors

This image is created using Fritzing. Click to enlarge image

Módulo DRV8833 ESP8266 NodeMCU / Outro
IN1 D5
IN2 D6
IN3 D1
IN4 D2
EEP 3.3V
GND GND (ESP8266) e negativo (-) da fonte de 5V
VCC positivo (+) da fonte de 5V
OUT1, OUT2 motor A (roda esquerda)
OUT3, OUT4 motor B (roda direita)

Código ESP8266 para o DRV8833 - Dois Motores

Para manter o loop() curto, o código usa duas funções auxiliares, motorA(speed) e motorB(speed). A velocidade é um número com sinal de -255 a 255:

  • Um valor positivo gira o motor para frente
  • Um valor negativo gira o motor para trás
  • 0 o deixa em roda livre

O carrinho anda para frente, anda para trás, vira à esquerda (roda esquerda para trás, roda direita para frente), vira à direita e depois para.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-drv8833-dc-motor-driver */ /* * ESP8266 NodeMCU - control TWO DC motors with the DRV8833 driver * (like the left and right wheels of a small robot car) * * Motor A (left wheel): IN1 <- D5 (GPIO14), IN2 <- D6 (GPIO12) * Motor B (right wheel): IN3 <- D1 (GPIO5), IN4 <- D2 (GPIO4) * EEP (sleep pin) is tied to 3.3V, so the driver is always awake. */ #define PIN_IN1 D5 // Motor A #define PIN_IN2 D6 // Motor A #define PIN_IN3 D1 // Motor B #define PIN_IN4 D2 // Motor B #define DRIVE_SPEED 200 // speed used for driving (0 - 255) #define TURN_SPEED 160 // a bit slower for turning void setup() { Serial.begin(9600); pinMode(PIN_IN1, OUTPUT); pinMode(PIN_IN2, OUTPUT); pinMode(PIN_IN3, OUTPUT); pinMode(PIN_IN4, OUTPUT); analogWriteRange(255); // same 0-255 range on ESP8266 core 2.x and 3.x 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 backward motorB(TURN_SPEED); // right wheel forward delay(1000); Serial.println("Car: turn right"); motorA(TURN_SPEED); // left wheel forward motorB(-TURN_SPEED); // right wheel backward delay(1000); Serial.println("Car: stop"); stopCar(); delay(2000); } // Drive one DRV8833 channel with a signed speed: // speed > 0 -> forward, speed < 0 -> reverse, speed = 0 -> coast void setMotor(int pinA, int pinB, int speed) { speed = constrain(speed, -255, 255); if (speed > 0) { analogWrite(pinA, speed); analogWrite(pinB, 0); } else if (speed < 0) { analogWrite(pinA, 0); analogWrite(pinB, -speed); } else { analogWrite(pinA, 0); analogWrite(pinB, 0); } } void motorA(int speed) { setMotor(PIN_IN1, PIN_IN2, speed); } void motorB(int speed) { setMotor(PIN_IN3, PIN_IN4, speed); } // Brake both motors (both inputs HIGH) for a quick stop void stopCar() { analogWrite(PIN_IN1, 255); analogWrite(PIN_IN2, 255); analogWrite(PIN_IN3, 255); analogWrite(PIN_IN4, 255); }

Passos Rápidos

  • Ligue o segundo motor em OUT3 e OUT4 e conecte IN3 e IN4 a D1 e D2, como mostrado no diagrama.
  • Conecte o ESP8266 ao seu PC com o cabo USB.
  • Copie o código acima para a Arduino IDE.
  • Clique no botão Upload para fazer o upload dele para o ESP8266.
  • Conecte o adaptador de 5V.
  • Abra o Serial Monitor. A saída é parecida com esta:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Car: forward Car: backward Car: turn left Car: turn right Car: stop Car: forward Car: backward Car: turn left
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
  • Se uma roda girar no sentido oposto durante "Car: forward", troque os dois fios desse motor.

Vídeo

Conhecimento Adicional

Vamos comparar o DRV8833 com o driver L298N usado no tutorial ESP8266 - Motor DC.

DRV8833 L298N
Tensão do motor 2.7V a 10.8V 5V a 35V
Corrente por canal cerca de 1.5A (2A de pico) cerca de 2A
Tipo de chave MOSFET (baixa perda) BJT (cerca de 2V de perda)
Controle de velocidade PWM nos pinos IN PWM nos pinos ENA/ENB
Pinos necessários por motor 2 3
Tamanho muito pequeno grande, com dissipador de calor

É evidente que o DRV8833 é a melhor escolha para pequenos robôs a bateria de 3V a 9V, enquanto o L298N ainda é útil quando os motores precisam de 12V ou mais.

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!