fbpixel
Etiquetas: , ,

El ESP12E Motor Shield es una placa de expansión que permite que un Amica ESP8266 NodeMCU (V2) accione dos motores de corriente continua o un motor paso a paso. Hemos visto cómo accionar un motor de corriente continua utilizando un puente H que puede requerir mucho cableado cuando se utiliza el simple CI. Para una aplicación embebida, como un robot Willy, tendrás que accionar varios motores en paralelo. Para ello existen escudos que simplifican el montaje.

Material

  • Ordenador
  • NodeMCU ESP8266 Amica (V2)
  • Cable USB A Macho/B Macho
  • Escudo del motor ESP12E
  • Motor de corriente continua x2 o motor paso a paso x1

Principio de funcionamiento

El Motor Shield ESP12E utiliza el doble puente H L293D. Permite accionar motores en dirección y velocidad con una tensión nominal entre 5 y 36V y una corriente de 600mA, hasta 1,2A con una fuente de tensión externa:
Este escudo le permite utilizar:

  • hasta dos motores de corriente continua o un motor paso a paso bipolar
  • un sensor analógico
  • GPIOs
  • Buses I2C, SPI y UART
nodemcu-esp8266-esp12e-motor-shield-pinout Uso del escudo del motor ESP12E

Esquema

Compatible con la placa Amica NodeMCU ESP8266, el shield se coloca directamente sobre el microcontrolador. La alimentación de los motores se conecta a la regleta VM/GND y la de la placa a la regleta VIN/GND. Es posible conectar los pines VIN y VM con un puente, si la alimentación de los motores es la misma que la de la NodeMCU (<10V Max). Los motores se conectan a los bloques de terminales A+,A-,B+,B-.

  • D1, D3 (motor A/ Stepper 1,2)
  • D2, D4 (motor B / Stepper 3,4)
  • Entradas disponibles A0
  • GPIO disponible en los pines 0 a 8

En el caso de una shield, las conexiones están predefinidas. Las conexiones del motor se detallan en los siguientes diagramas.

nodemcu-esp8266-esp12e-motor-shield-dc_bb Uso del escudo del motor ESP12E
nodemcu-esp8266-esp12e-motor-shield-step_bb Uso del escudo del motor ESP12E

Código de gestión de un motor CC

Para interactuar con el Motor Shield ESP12E, no utilizamos una biblioteca específica. Siempre puedes crear tu propia biblioteca para simplificar tu 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 gestión del motor paso a paso

Para accionar un motor paso a paso, hay que activar las bobinas del motor siguiendo una secuencia precisa. Esta secuencia se describe en la función nextStep().

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);
  }
}

Aplicaciones

  • Controla un robot de dos ruedas como Willy a través de una conexión WiFi

Fuentes

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