Contrôle deux moteurs CC par un shield (L298P)

Alimentation

Il est conseillé de séparer les alimentations d’Arduino et des moteurs.

On placera donc les jumpers d’alimentation sur PWRIN.

E1, M1, E2, M2

Commande Pin Arduino Siginification
M1 4 Contrôle du sens de rotation
E1 5 Contrôle de la vitesse de rotation
M2 7 Contrôle du sens de rotation
E2 6 Contrôle de la vitesse de rotation

PWM ou PLL

La tension de commande des moteurs se fera en PWM.

On placera donc les jumpers en conséquence.

Exemple de code basique

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


//Moteur A
int E1 = 5; // Vitesse (PWM)
int M1 = 4; // Direction

//Motor B
int E2 = 6; // Vitesse (PWM)
int M2 = 7; // Direction


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

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

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


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

void setup()
{

  pinMode(E1, OUTPUT);
  pinMode(M1, OUTPUT);

  pinMode(E2, OUTPUT);
  pinMode(M2, 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(M1, HIGH);       
      analogWrite(E1, vitesse);
    }
    else
    {
      digitalWrite(M1, LOW);       
      analogWrite(E1, vitesse);
    }
    break;

  case MOTEUR_B :
    if (sens==AVANT)
    {
      digitalWrite(M2, HIGH);       
      analogWrite(E2, vitesse);
    }
    else
    {
      digitalWrite(M2, LOW);       
      analogWrite(E2, vitesse);
    }
    break;
  }
}



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

void arreter_tout()
{
  analogWrite(E1, 0);
  analogWrite(E2, 0);
}


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

void arreter(int moteur)
{
  switch (moteur)
  {
  case MOTEUR_A :
    analogWrite(E1, 0);

  case MOTEUR_B :
    analogWrite(E2, 0);
  }
}