O Motor Shield oficial do Arduino é uma placa de extensão para os microcontroladores Arduino UNO e Mega para controlar motores de corrente contínua e motores de passo. Já vimos como controlar um motor CC utilizando uma ponte H, mas isso pode exigir muita cablagem quando se usa simplesmente o circuito integrado. Para uma aplicação na forma embarcada, como num robô Willy, é necessário controlar vários motores em paralelo. Para este fim, existem shields que simplificam a montagem.

Material
- Computador
- Arduino UNO
- Cabo USB A Macho/B Macho
- Arduino Motor Shield
- Motor CC ou motor de passo
Princípio de funcionamento
O Arduino Motor Shield utiliza a ponte H dupla L298. Ele permite controlar a direção e velocidade de motores com uma tensão nominal entre 5 e 12V e uma corrente de 2A, podendo chegar a 4A com uma fonte de tensão externa.
Com este shield, é possível pilotar:
- até dois motores CC ou um motor de passo bipolar;
- dois sensores analógicos;
- duas saídas PWM, como servomotores;
- há um barramento I2C disponível, o que permite conectar módulos compatíveis.

Esquema
Compatível com as placas UNO e Mega, o shield é colocado diretamente sobre a placa Arduino. A fonte de alimentação é ligada ao bloco terminal Power. Os motores são ligados aos terminais A+,A-,B+,B-. Os pinos do Arduino são diretamente ligados aos pinos do circuito integrado:
- Digital pin 12: direção DC Motor #A / Stepper #A
- Digital pin 13: direção DC Motor #B / Stepper #B
- Digital pin 3: velocidade DC Motor #A / Stepper #A
- Digital pin 11: velocidade DC Motor #B / Stepper #B
- Digital pin 9: ativação break DC Motor #A
- Pino digital 8: ativação break DC Motor #B
- Entradas disponíveis In2 In3 ligadas às entradas analógicas A2 e A3
- Saídas disponíveis Out5, Out6 ligadas às saídas PWM 5 e 6
No caso de um shield, as ligações são pré-definidas. Verifique a documentação técnica do componente.
As ligações dos motores são detalhadas nos diagramas a seguir.


Código
Para interagir com o Motor Shield, não precisamos de nenhuma biblioteca específica, porque ele se liga diretamente aos pinos do Arduino. Pode ser interessante criar a sua própria biblioteca para simplificar o seu código.
//Parameters
const int input_voltage = 9;//V
const int nominal_voltage = 5;////V
const int MAX_SPEED = int(nominal_voltage * 255 / input_voltage);
const int directionA = 12;
const int directionB = 13;
const int brakeA = 9;
const int brakeB = 8;
const int speedA = 3;
const int speedB = 11;
const int in2 = A2;
const int in3 = A3;
void setup() {
//Init Serial USB
Serial.begin(9600);
Serial.println(F("Initialize System"));
//Init Motor Shield
pinMode(directionA, OUTPUT); //Initiates Motor Channel A pin
pinMode(brakeA, OUTPUT); //Initiates Brake Channel A pin
pinMode(directionB, OUTPUT); //Initiates Motor Channel B pin
pinMode(brakeB, OUTPUT); //Initiates Brake Channel B pin
}
void loop() {
readSensorMS();
testMotorMS();
//testStepperMS();
}
void testStepperMS() { /* function testStepperMS */
//// Test stepper
Serial.println("Move stepper 1 step clockwise");
stpCW(1);
Serial.println("Move stepper 1 step counter clockwise");
stpCCW(1);
}
void testMotorMS() { /* function testMotorMS */
//// Test DC motor
Serial.println(F("-------------------------------------"));
Serial.println(F("Avant "));
dcForward();
delay(500);
Serial.println(F("Arrière "));
dcBackward();
delay(500);
Serial.println(F("Arrêt "));
dcStop();
delay(1000);
}
void readSensorMS() { /* function readSensorMS */
//// Read sensors
Serial.print(F("In2 : ")); Serial.println(analogRead(in2));
Serial.print(F("In3 : ")); Serial.println(analogRead(in3));
}
void dcForward() { /* function dcForward */
//// set forward motion for A and B
digitalWrite(directionA, HIGH); //Establishes forward direction of Channel A
digitalWrite(brakeA, LOW); //Disengage the Brake for Channel A
analogWrite(speedA, MAX_SPEED);
digitalWrite(directionB, HIGH); //Establishes forward direction of Channel B
digitalWrite(brakeB, LOW); //Disengage the Brake for Channel B
analogWrite(speedB, MAX_SPEED);
}
void dcBackward() { /* function dcBackward */
//// set backward motion for A and B
digitalWrite(directionA, LOW); //Establishes forward direction of Channel A
digitalWrite(brakeA, LOW); //Disengage the Brake for Channel A
analogWrite(speedA, MAX_SPEED);
digitalWrite(directionB, LOW); //Establishes forward direction of Channel B
digitalWrite(brakeB, LOW); //Disengage the Brake for Channel B
analogWrite(speedB, MAX_SPEED);
}
void dcStop() { /* function dcStop */
//// stop motors A and B
digitalWrite(brakeA, HIGH); //Engage the Brake for Channel A
analogWrite(speedA, 0);
digitalWrite(brakeB, HIGH); //Engage the Brake for Channel B
analogWrite(speedB, 0);
}
void stpCW(int nbstep) { /* function stpCW */
//// Move stepper clockwise
for (int i = 0; i < nbstep; i++) {
digitalWrite(brakeA, LOW); //Disable brake A
digitalWrite(brakeB, HIGH); //Enable brake B
digitalWrite(directionA, HIGH); //Set direction of CH A
analogWrite(speedA, MAX_SPEED); //Set speed for CH A
delay(30);
digitalWrite(brakeA, HIGH); //Enable brake A
digitalWrite(brakeB, LOW); //Disable brake B
digitalWrite(directionB, LOW); //Set direction of CH B
analogWrite(speedB, MAX_SPEED); //Set speed for CH B
delay(30);
digitalWrite(brakeA, LOW); //Disable brake A
digitalWrite(brakeB, HIGH); //Enable brake B
digitalWrite(directionA, LOW); //Set direction of CH A
analogWrite(speedA, MAX_SPEED); //Set speed for CH A
delay(30);
digitalWrite(brakeA, HIGH); //Enable brake A
digitalWrite(brakeB, LOW); //Disable brake B
digitalWrite(directionB, HIGH); //Set direction of CH B
analogWrite(speedB, MAX_SPEED); //Set speed for CH B
delay(30);
}
}
void stpCCW(int nbstep) { /* function stpCCW */
//// Move stepper counter-clockwise
for (int i = 0; i < nbstep; i++) {
digitalWrite(brakeA, LOW); //Disable brake A
digitalWrite(brakeB, HIGH); //Enable brake B
digitalWrite(directionA, HIGH); //Set direction of CH A
analogWrite(speedA, MAX_SPEED); //Set speed for CH A
delay(30);
digitalWrite(brakeA, HIGH); //Enable brake A
digitalWrite(brakeB, LOW); //Disable brake B
digitalWrite(directionB, HIGH); //Set direction of CH B
analogWrite(speedB, MAX_SPEED); //Set speed for CH B
delay(30);
digitalWrite(brakeA, LOW); //Disable brake A
digitalWrite(brakeB, HIGH); //Enable brake B
digitalWrite(directionA, LOW); //Set direction of CH A
analogWrite(speedA, MAX_SPEED); //Set speed for CH A
delay(30);
digitalWrite(brakeA, HIGH); //Enable brake A
digitalWrite(brakeB, LOW); //Disable brake B
digitalWrite(directionB, LOW); //Set direction of CH B
analogWrite(speedB, MAX_SPEED); //Set speed for CH B
delay(30);
}
}
void dcStop() { /* function dcStop */
//// stop motors A and B
digitalWrite(brakeA, HIGH); //Engage the Brake for Channel A
analogWrite(speedA, 0);
digitalWrite(brakeB, HIGH); //Engage the Brake for Channel B
analogWrite(speedB, 0);
}
Aplicações
- Controlar um robô de duas rodas como o Willy
Fontes
- Documentação técnica do módulo L298
- Controlar um motor CC com o Arduino
- Controlar um motor de passo com o Arduino
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie