Etiquetas: , , , ,

O Motor Shield V2 é uma placa de extensão para os microcontroladores Arduino UNO e Mega, para controlar motores de corrente contínua e motores de passo. Para controlar motores, é possível utilizar circuitos integrados diretamente, mas isso requer uma cablagem extensa que pode se tornar muito difícil de administrar. Para realizar montagens mais limpas, pode criar os seus próprios circuitos impressos ou utilizar shields.

Vamos usar o Motor Shield V2 e ver as suas melhorias em relação à versão anterior.

Pré-requisito: Programar com o Arduino

Material

  • Computador
  • Arduino UNO
  • Cabo USB para ligar o Arduino ao computador
  • Motor CC
  • Motor de passo
  • Motor Shield V2

Visão geral do Motor Shield V2

arduino-motor-shield-v2 Controlar vários motores com o Motor Shield V2

O Motor Shield V2 utiliza o TB6612 MOSFET, com capacidade de 1,2A por canal, e a comunicação I2C. Ele usa menos pinos do que a versão anterior:

  • Digital pin SCL/A5: Comunicação I2C Serial Clock Line
  • Digital pin SDA/A4: Comunicação I2C Serial Clock Line

O Motor Shield V2 tem um jumper para selecionar o endereço I2C e pode ser empilhado. Isso permite conduzir até 32 shields (ou 64 motores de passo ou 128 motores CC) com uma única placa Arduino.

Esquema

Compatível com as placas UNO e Mega, o shield é colocado diretamente sobre a placa Arduino. A fonte de alimentação liga-se ao bloco terminal Power. Os motores são ligados aos blocos terminais M1 a M4. Pode ser necessário ligar três tipos de motores (fora os servomotores):

  • motor CC
  • motor de passo unipolar
  • motor de passo bipolar


As ligações desses motores estão detalhadas nos diagramas a seguir..

motor-shield-v2-dc-motor_bb-1280x400 Controlar vários motores com o Motor Shield V2
motor-shield-v2-stepper-unipolar-bipolar_bb-1280x329 Controlar vários motores com o Motor Shield V2
arduino-motor-shield-v2-pinout Controlar vários motores com o Motor Shield V2

Código para controle de motores CC

Para interagir com o Motor Shield V2, utilizamos a biblioteca Adafruit_MotorShield.h. Para conduzir o motor CC, usamos a classe Adafruit_DCMotor, cujas funções a se conhecer são:

  • motor.getMotor(integer) para selecionar o motor utilizado
  • motor.run() para ativar o motor num sentido ou outro (RELEASE,BACKWARD,FORWARD).
  • motor.setSpeed() para definir a velocidade
#include <Wire.h>
#include <Adafruit_MotorShield.h>

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); 

// Select which 'port' M1, M2, M3 or M4. In this case, M1
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);
// You can also make another motor on port M2
//Adafruit_DCMotor *myOtherMotor = AFMS.getMotor(2);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  // Set the speed to start, from 0 (off) to 255 (max speed)
  myMotor->setSpeed(150);
  myMotor->run(FORWARD);
  // turn on motor
  myMotor->run(RELEASE);
}

void loop() {
  uint8_t i;
  
  Serial.print("tick");

  myMotor->run(FORWARD);
  for (i=0; i<255; i++) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  
  Serial.print("tock");

  myMotor->run(BACKWARD);
  for (i=0; i<255; i++) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    myMotor->setSpeed(i);  
    delay(10);
  }

  Serial.print("tech");
  myMotor->run(RELEASE);
  delay(1000);
}

Código para controle de motores de passo

Para controlar um motor de passo, utilizamos a classe Adafruit_StepperMotor, cujas funções a se conhecer são:

  • motor.getStepper(número de passos , terminal utilizado) para selecionar o motor utilizado
  • motor.setSpeed(velocidade) para definir a velocidade
  • motor.step(número de passos, sentido, algoritmo) para girar um número de passos num sentido ou outro

Este é o exemplo da biblioteca.

#include <Wire.h>
#include <Adafruit_MotorShield.h>

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); 

// Connect a stepper motor with 4080 steps per revolution (1.8 degree)
// to motor port #2 (M3 and M4)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(48, 2);


void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  
  myMotor->setSpeed(10);  // 10 rpm   
}

void loop() {
  int nbSteps=4080;
  
  Serial.println("Single coil steps forward");
  myMotor->step(nbSteps, FORWARD, SINGLE); 
  delay(1000);
  Serial.println("Single coil steps backward");
  myMotor->step(nbSteps, BACKWARD, SINGLE); 
  delay(1000);
  Serial.println("Double coil steps forward");
  myMotor->step(nbSteps, FORWARD, DOUBLE); 
  Serial.println("Double coil steps backward");
  myMotor->step(nbSteps, BACKWARD, DOUBLE);
  delay(1000);
  Serial.println("Interleave coil steps forward");
  myMotor->step(nbSteps, FORWARD, INTERLEAVE); 
  Serial.println("Interleave coil steps backward");
  myMotor->step(nbSteps, BACKWARD, INTERLEAVE); 
  delay(1000);
  Serial.println("Microstep steps forward");
  myMotor->step(50, FORWARD, MICROSTEP); 
  Serial.println("Microstep steps backward");
  myMotor->step(50, BACKWARD, MICROSTEP);
  delay(1000);
}

Converter o código do V1 para o V2

Para converter o seu código Arduino do Motor Shield V1 para o V2, modifique os seguintes itens:

  • Substitua a biblioteca:
    #include <Adafruit_MotorShield.h> 
  • Crie um objeto MotorShield:
    Adafruit_MotorShield AFMS = Adafruit_MotorShield();  
  • Crie um objeto Motor usando um ponteiro:
    Adafruit_DCMotor *motorG = AFMS.getMotor(1); 
    Adafruit_StepperMotor
    *myMotor = AFMS.getStepper(48, 2);
  • Acrescente a linha de inicialização do shield:
      AFMS.begin();   
  • Substitua os “. ” por ” -> ” ao chamar funções:
    motorG->setSpeed(motorSpeed);  
    motorG->run(RELEASE);

Teste e combine estes exemplos para obter as funcionalidades que deseja. Se tiver algum problema ao usar o seu Motor Shield, fique à vontade para nos deixar um comentário ou enviar uma mensagem.

Aplicação

  • Conduzir um robô com 2, 4 ou mais rodas

Fontes

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