Icono del sitio AranaCorp

Uso del escudo del motor ESP12E

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

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:

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-.

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

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

Fuentes

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

Salir de la versión móvil