Étiquettes : , , , , ,

Le Motor Shield V2 est une carte d’extension pour les microcontrôleurs Arduino UNO et Mega pour le pilotage de moteur CC et de moteur pas-à-pas. Pour le contrôle de moteurs, il est possible d’utiliser des circuits intégrés directement mais leur utilisation nécessite un câblage important qui peut vite devenir ingérable.
Pour réaliser des montages propres, vous pouvez soit créer vos propre PCB soit utiliser des Shields.

Nous allons utiliser le Motor Shield V2 et voir les améliorations par rapport à la version précédente.

Prérequis : Programmer avec Arduino

Matériel

  • Ordinateur
  • Arduino UNO x1
  • câble USB pour connecter l’Arduino à l’ordinateur x1
  • Moteur CC x1
  • Moteur PP x1
  • Motor Shield V2 x1

Présentation du Motor Shield V2

Le Motor Shield V2 utilise le TB6612 MOSFET avec une capacité de 1.2A par voie et la communication I2C. Il utilise moins de broches que la version précédente:

  • Digital pin SCL/A5: Communication I2C Serial Clock Line
  • Digital pin SDA/A4: Communication I2C Serial Data Line

Le Motor Shield V2 dispose de jumper pour sélectionner l’adresse I2C et sont empilable. Ce qui permet de piloter jusqu’à 32 shields (soit 64 steppers ou 128 moteurs CC) avec une seule carte Arduino.

Schéma

Compatible avec les cartes UNO et Mega, le shield se place directement sur la carte Arduino. L’alimentation se branche au bornier Power. Les moteurs sont branchés sur les borniers M1 à M4. Vous pourrez être amené à brancher trois types de moteur (sans compter les servomoteurs):

– moteur à courant continu
– moteur pas-à-pas unipolaire
– moteur pas-à-pas bipolaire


Les branchements de ces moteurs sont détaillés dans les schémas suivants.

Code pour piloter des moteurs CC

Pour interagir avec le Motor Shield V2, nous utilisons la librairie Adafruit_MotorShield.h. Pour piloter un moteur CC, nous allons utiliser la classe Adafruit_DCMotor dont les fonctions à connaitre sont:

  • motor.getMotor(entier) pour sélectionner le moteur utilisé
  • motor.run() pour activer le moteur dans un sens ou dans l’autre (RELEASE,BACKWARD,FORWARD).
  • motor.setSpeed() pour régler la vitesse
#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);
}

Code pour piloter des moteurs pas-à-pas

Pour piloter les moteurs pas-à-pas nous allons utiliser la classe Adafruit_StepperMotor dont les fonctions à connaitre sont:

  • motor.getStepper( nombre de pas , bornier utilisé) pour sélectionner le moteur utilisé
  • motor.setSpeed(vitesse) pour régler la vitesse
  • motor.step(nombre de pas, direction, algortihme) pour tourner d’un nombre de pas dans un sens ou dans l’autre

Ceci est l’exemple tiré de la librairie.

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

Pour convertir votre code Arduino pour le Motor Shield V1 vers V2, il vous faut modifier les éléments suivants:

  • Remplacer la librairie:
    #include <Adafruit_MotorShield.h> 
  • Créer un objet MotorShield:
    Adafruit_MotorShield AFMS = Adafruit_MotorShield();  
  • Créer un objet Moteur en utilisant un pointeur:
    Adafruit_DCMotor *motorG = AFMS.getMotor(1); 
    Adafruit_StepperMotor
    *myMotor = AFMS.getStepper(48, 2);
  • Ajouter la ligne d’initialisation du shield:
      AFMS.begin();   
  • Remplacer les « . » par des « -> » lors de l’appel des fonctions:
    motorG->setSpeed(motorSpeed);  
    motorG->run(RELEASE);

Testez et mélangez ces exemples pour obtenir les fonctionnalités que vous désirez. Si vous rencontrez un soucis pour utiliser votre Motor Shield, n’hésitez à nous laisser un commentaire ou à nous envoyer un message.

Application

  • Piloter un robot à 2 ou 4 roues ou plus

Source

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