Contrôle de deux moteurs CC avec Pololu DRV8833

Principe de fonctionnement

Le circuit et les moteurs sont alimentés par une même alimentation de maximum 10,8V.

Chaque moteur est contrôlé par deux signaux PWM (de 0 à 255) :

  • AIN1 et AIN2 pour le moteur A
  • BIN1 et BIN2 pour le moteur B

Le principe est le suivant.
– Pour avancer : l’une des entrées est à HIGH et l’autre contient la vitesse
– Pour reculer : on inverse le rôle des deux entrées.
– Pour s’arrêter : les deux entrées sont à LOW

Tableau des broches

pololu-1.jpg

Côté commande

Nom de la broche Signification
GND Masse
VMM Broche permettant d’alimenter si besoin d’autres circuits
BIN1 Première commande PWM du moteur B
BIN2 Deuxième commande PWM du moteur B
AIN2 Deuxième commande PWM du moteur A
AIN1 Première commande PWM du moteur A
nSLEEP Mise en veille (si niveau LOW)
nFAULT Messages d’erreurs

Côté des sorties et alimentations

Nom de la broche Signification
GND Masse
VIN Tension d’alimentation des moteurs (de2,7V à 10.8v)
BOUT1 Première commande du moteur B
BOUT2 Deuxième commande du moteur B
AOUT2 Deuxième commande du moteur A
AOUT1 Première commande du moteur A
AISEN Sortie de détection du moteur A
BISEN Sortie de détection du moteur B

Instructions de branchement

Il est impératif relier toutes les masses.

Pour une utilisation standard, il est inutile de brancher VMM, nSLEEP, nFAULT, AISEN et BISEN.

Exemple de code Arduino

//////////////////////////////////////////
// Branchements
//////////////////////////////////////////


//Moteur A
int AIN1 = 5; // Vitesse (PWM)
int AIN2 = 6; // Vitesse (PWM) 

//Motor B
int BIN1 = 9; // Vitesse (PWM)
int BIN2 = 10; // Vitesse (PWM)


//////////////////////////////////////////
// Constantes
//////////////////////////////////////////

const int MOTEUR_A=0;
const int MOTEUR_B=1;

const int AVANT=0;
const int ARRIERE=1;


//////////////////////////////////////////
// Setup
//////////////////////////////////////////

void setup()
{

  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
}



//////////////////////////////////////////
// Loop
//////////////////////////////////////////

void loop(){
  activer(MOTEUR_A, AVANT, 128);
  activer(MOTEUR_B, AVANT, 128);

  delay(3000);
  arreter_tout();
  delay(1000);

  activer(MOTEUR_A, ARRIERE, 128);
  activer(MOTEUR_B, ARRIERE, 128);

  delay(3000);
  arreter_tout();
  delay(1000);

  activer(MOTEUR_A, AVANT, 128);
  arreter(MOTEUR_B);

  delay(3000);
  arreter_tout();
  delay(1000);

  arreter(MOTEUR_A);
  activer(MOTEUR_B, AVANT, 128);

  delay(3000);
  arreter_tout();
  delay(1000);
}


//////////////////////////////////////////
// Fonction activer
//////////////////////////////////////////

void activer(int moteur, int sens, int vitesse)
// moteur : MOTEUR_A ou MOTEUR_B
// sens : AVANT ou ARRIERE
// vitesse : entre 0 et 255
{

  switch (moteur)
  {
  case MOTEUR_A :
    if (sens==AVANT)
    {
      digitalWrite(AIN1,HIGH);
      analogWrite(AIN2,vitesse);
    }
    else
    {
      digitalWrite(AIN2,HIGH);
      analogWrite(AIN1,vitesse);
    }
    break;

  case MOTEUR_B :
    if (sens==AVANT)
    {
      digitalWrite(BIN1,HIGH);
      analogWrite(BIN2,vitesse);
    }
    else
    {
      digitalWrite(BIN2,HIGH);
      analogWrite(BIN1,vitesse);
    }
    breaak;
  }
}



//////////////////////////////////////////
// Fonction arreter_tout
//////////////////////////////////////////

void arreter_tout()
{
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, LOW);  
  digitalWrite(BIN2, LOW); 
}


//////////////////////////////////////////
// Fonction arreter
//////////////////////////////////////////

void arreter(int moteur)
{
  switch (moteur)
  {
  case MOTEUR_A :
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, LOW);

  case MOTEUR_B :
    digitalWrite(BIN1, LOW);  
    digitalWrite(BIN2, LOW);
  }
}

Sources

www.generationrobots.com/
www.pololu.com