fbpixel
Etiquetas: , ,
0
(0)

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

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.

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

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?