fbpixel
Etiquetas: , ,

O ESP12E Motor Shield é uma placa de expansão que permite a um Amica ESP8266 NodeMCU (V2) accionar dois motores CC ou um motor passo-a-passo. Já vimos como conduzir um motor CC utilizando uma ponte-H que pode exigir muita cablagem quando se utiliza o simples CI. Para uma aplicação incorporada, como um robô Willy, terá de conduzir vários motores em paralelo. Existem escudos para este fim que simplificarão a montagem.

Matériel

  • Computador
  • NodeMCU ESP8266 Amica (V2)
  • Cabo USB A Macho/B Macho
  • Escudo do motor ESP12E
  • Motor CC x2 ou Stepper motor x1

Princípio funcional

O ESP12E Motor Shield utiliza a ponte-H dupla L293D. Permite accionar motores na direcção e velocidade com uma tensão nominal entre 5 e 36V e uma corrente de 600mA, até 1,2A com uma fonte de tensão externa:
Este escudo permite o uso:

  • até dois motores CC ou um motor passo-a-passo bipolar
  • um sensor analógico
  • GPIOs
  • ônibus I2C, SPI e UART
nodemcu-esp8266-esp12e-motor-shield-pinout Usando o Escudo do motor ESP12E

Esquema

Compatível com a placa Amica NodeMCU ESP8266, o escudo é colocado directamente sobre o microcontrolador. A alimentação dos motores está ligada ao bloco de terminais VM/GND e a da placa ao bloco de terminais VIN/GND. É possível ligar os pinos VIN e VM com uma ponte, se a alimentação dos motores for a mesma que a alimentação do NodeMCU (<10V Max). Os motores são ligados aos blocos terminais A+,A-,B+,B-.

  • D1, D3 (motor A/ Stepper 1,2)
  • D2, D4 (motor B / Stepper 3,4)
  • Entradas disponíveis A0
  • GPIO disponível nos pinos 0 a 8

No caso de um escudo, as ligações são pré-definidas. As ligações do motor são detalhadas nos diagramas seguintes.

nodemcu-esp8266-esp12e-motor-shield-dc_bb Usando o Escudo do motor ESP12E
nodemcu-esp8266-esp12e-motor-shield-step_bb Usando o Escudo do motor ESP12E

Código de gestão para um motor CC

Para interagir com o ESP12E Motor Shield, não utilizamos uma biblioteca específica. Pode sempre criar a sua própria biblioteca para simplificar o seu código.

/*
   Board pin | NodeMCU GPIO |  Arduino IDE
      A-           1             5 or D1
      A+           3             0 or D3
      B-           2             4 or D2
      B+           4             2 or D4
*/

const int pwmMotorA = D1;
const int pwmMotorB = D2;
const int dirMotorA = D3;
const int dirMotorB = D4;

int motorSpeed = 500;

void setup() {
  Serial.begin(115200);
  Serial.println();

  pinMode(pwmMotorA , OUTPUT);
  pinMode(pwmMotorB, OUTPUT);
  pinMode(dirMotorA, OUTPUT);
  pinMode(dirMotorB, OUTPUT);

  Serial.println("Motor SHield 12E Initialized");
  delay(5000);
}

void loop() {
  Serial.println("Activate A");
  digitalWrite(pwmMotorA, motorSpeed);
  digitalWrite(dirMotorA, LOW);
  delay(1500);

  Serial.println("Reverse A");
  digitalWrite(dirMotorA, HIGH);
  delay(1500);

  Serial.println("Stop A");
  digitalWrite(pwmMotorA, 0);
  digitalWrite(dirMotorA, LOW);
  delay(3000);

  Serial.println("Activate B");
  digitalWrite(pwmMotorB, motorSpeed);
  digitalWrite(dirMotorB, LOW);
  delay(1500);

  Serial.println("Reverse B");
  digitalWrite(dirMotorB, HIGH);
  delay(1500);

  Serial.println("Stop B");
  digitalWrite(pwmMotorB, 0);
  digitalWrite(dirMotorB, LOW);
  delay(3000);
}

Código de gestão do motor passo-a-passo

Para conduzir um motor passo-a-passo, é necessário activar as bobinas do motor seguindo uma sequência precisa. Esta sequência é descrita na funçãoStep() seguinte.

const int pwmMotorA = D1;
const int pwmMotorB = D2;
const int dirMotorA = D3;
const int dirMotorB = D4;

int delayBtwnStep = 3;

void setup() {
  Serial.begin ( 115200 );
  Serial.println();

  pinMode(pwmMotorA, OUTPUT);
  pinMode(pwmMotorB, OUTPUT);
  pinMode(dirMotorA, OUTPUT);
  pinMode(dirMotorB, OUTPUT);
  Serial.println("Motor SHield 12E Initialized");
}

void loop() {
  stepperRotate(10, 0);
  delay(500);
  stepperRotate(10, 1);
  delay(500);
}


void stepperRotate(int nbStep, int dirStep) {
  for (int i = 0; i <= nbStep; i++) {
    if (dirStep == 0) {  // sens horaire
      nextStep(i % 4);
    }
    if (dirStep == 1) {  // sens antihoraire
      nextStep(3 - (i % 4));
    }
    delay(delayBtwnStep);
  }
}


void nextStep(int index) {
  if (index == 0) {
    digitalWrite(pwmMotorA, true);
    digitalWrite(pwmMotorB, false);
    digitalWrite(dirMotorA, true);
    digitalWrite(dirMotorB, false);
  }
  if (index == 1) {
    digitalWrite(pwmMotorA, false);
    digitalWrite(pwmMotorB, true);
    digitalWrite(dirMotorA, true);
    digitalWrite(dirMotorB, false);
  }
  if (index == 2) {
    digitalWrite(pwmMotorA, false);
    digitalWrite(pwmMotorB, true);
    digitalWrite(dirMotorA, false);
    digitalWrite(dirMotorB, true);
  }
  if (index == 3) {
    digitalWrite(pwmMotorA, true);
    digitalWrite(pwmMotorB, false);
    digitalWrite(dirMotorA, false);
    digitalWrite(dirMotorB, true);
  }
}

Aplicações

  • Controlar um robô de duas rodas como Willy através de uma ligação WiFi

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie