Étiquettes : , , , ,

Nous avons vu qu’il était plus pratique d’utiliser des shields pour certaines applications. Notamment pour piloter des moteurs avec le Motor Shield V1 de chez Adfruit.

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

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
/* 
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
It won't work with v1.x motor shields! Only for the v2's with built in PWM
control

For use with the Adafruit Motor Shield v2 
---->	http://www.adafruit.com/products/1438
*/
#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 leMotor 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

Adafruit Motor Shield V2