Contrôle Moteur DC via L293E

Description
Le précédent article concernant ce même point était basé sur un pont-H L293D.
Cependant, ce modèle commence à se faire rare et il est couramment remplacé par un L293E qui à 4 pins de plus.
Pas besoin de se laisser déconcentré pour autant.
Voici donc quelques recommandations de montages.

Avantages du L293E
  • Il permet de laisser passer un courant allant jusqu'a 1 Ampère (2 Ampères temporairement).
  • Protection contre la surchauffe.
  • Puisqu'il est presque identique au L293D, ce qui est expliqué dans le précédent article reste valable pour celui ci :-)

Inconvénient du L293E
  • Le brochage à changé, le circuit à 20 broches (au lieu de 16).
    Il faut donc faire attention à ce que l'on fait.
  • Il faut impérativement utiliser des diodes en roue libre pour protéger le circuit intégré (voir schéma ci-dessous).
  • Des broches sense sont apparues et très honnêtement, je ne sais pas à quoi elle peuvent servir (du moins, pour le moment).
    Il suffit de les mettre à GND :-)
Ou acheter un L293E
En Belgique, il est possible de se fournir un L293E chez Farnell.
Voici le lien direct vers le produit part #1467711 au prix de 6.67 eur HTVA.

Brochage

  • VSS - Alimentation de la logique de commande (5V).
    A raccorder à la borne +5V d'Arduino (donc sur le régulateur d'Arduino).
  • VS - Alimentation de puissance des moteurs.
    Par exemple, s'il s'agit d'une ancien véhicule téléguidé que vous avez canibalisé, il s'agira de la borne positive (+9.2v) de votre accumulateur.
  • GND - Doit être raccorder à la masse (GND) de la source d'alimentation de puissance VS (donc le négatif de l'accumulateur) et à la masse de la source d'alimentation de VSS (donc GND Arduino).
    Si vous n'avez qu'une source d'alimentation pour le tout, c'est forcement plus simple.
  • OUTPUT1, OUTPUT2 - Broches à raccorder à la charge (le moteur). C'est via ces broches de
  • INPUT1, INPUT2 - Broche de commande du Pont-H. Se raccorde a Arduino.
  • CHIP ENABLE1 - permet d'envoyer (ou pas) la tension sur les sorties du moteur via OUTPUT1 & OUTPUT2.
    ENABLE1 commande l'activation du premier Pont-H.
    Si ENABLE1 = GND, le pont-H est déconnecté et le moteur ne fonctionne pas.
    Si ENABLE1 = VSS, le pont-H est connecté aux sorties et le moteur fonctionne dans un sens ou l'autre ou pas en fonction des tensions appliquée sur INPUT1 & INPUT2.
  • SENSE1 & SENSE2 - Permet de mesurer le courant dans le circuit de puissance (si utilisé, fera l'objet d'un article séparé).
    A placer impérativement sur GND si la fonctionnalité n'est pas utilisée. 
Le refroidissement
Ce n'est pas un hasard s'il y a autant de pin GND regroupée au centre du L293E.
C'est parce qu'elle sont utilisée pour évacuer la chaleur excédentaire via la large piste de cuivre sur laquelle les broches sont raccordées.
La datasheet fourni d'ailleurs quelques  recommandations.
Source: Datasheet

Exemple de montage
Dans cet exemple de montage, je vais prendre la commande du moteur de commande de direction d'un petit véhicule télécommandé Nikko.
La tension d'alimentation du moteur est de 5 volts... et l'accumulateur de 7.2v.

Plan de montage du L293E
  • Le +5v provient directement du board Arduino
  • Le 7.2v provient d'une alimentation stabilisée à 7.5v (ou accumulateur NiCd à 7.2v).
  • La masse Arduino (GND) est raccordée avec:
    1) la masse de l'alimentation externe et
    2) la masse de déparasitage du moteur (noir)
  • Le moteur est raccordé comme suit:
    Output 1: Un pôle du moteur (vert)
    Output 2: L'autre pôle du moteur (jaune)
  • Une capacité de découplage de 33nF est raccordée entre VSS et GND.
Le résultat
Le code ci-dessous fait quelques essais de commande.
La commande se fait en PWM pour minimiser le courant dans le moteur.
En effet, à pleine tension (PWM=255, soit 100%) le courant atteint 330 mA alors qu'une commande PWM=210 atteint le même résultat mais avec un courant de 180 mA :-)

Voici le résultat final du programme... si cela n'est pas impressionnant, la prise de commande est correcte.


Code source
Source: Test_L293E_Direction.pde

/* 
    Commande d'un L293E - circuit pont H 
    via arduino 
*/

int pinInput1 = 3; // Commande de sens, Input 1
int pinInput2 = 4; // Commande de sens, Input 2
int pinPower = 9;  // Commande de puissance, Output Enabled

void setup(){
  pinMode( pinInput1, OUTPUT );
  pinMode( pinInput2, OUTPUT );
  // Pas besoin de pinMode pour commande PWM
}

void loop(){
   // Premier essai 
   // Tourne un peu. I=150 mA
   TournerDroite( 180 ); // 180 est la puissance PWM
   delay(2000);
   TournerGauche( 180 );
   delay(2000);
   ToutDroit();
   delay(2000);

   // Deuxieme essais 
   // Tourne a fond. I=180ma
   TournerDroite( 210 ); 
   delay(2000);
   TournerGauche( 210 );
   delay(2000);
   ToutDroit();
   delay(2000);

   // Troisième essais 
   // Tourne a fond (brutalement). 
   // I=330 mA --> CA DEVIENT BEAUCOUP
   /*
   TournerDroite( 255 ); 
   delay(2000);
   TournerGauche( 255 );
   delay(2000);
   ToutDroit();
   delay(2000);
   */
   
   // Tourner droite et gauche pour signaler 
   // deuxieme partie
   TournerDroite(210);
   delay( 500 );
   TournerGauche(210);
   delay( 500 );
   ToutDroit();
   delay(2000);
   
   // Deuxième serie d'essai PROGRESSIF
   /*
   --- TOTALEMENT INEFFICACE ---
   Ne tourne presque pas
   TournerDroite( 110 ); 
   delay(1000);
   TournerDroite( 150 );
   delay(1000);
   TournerDroite( 160 );
   delay(1000);
   TournerDroite( 200 );
   delay(1000);
   ToutDroit();
   delay(2000);

   --- Reste a tourner à fond depuis le début!
   TournerGauche( 180 ); 
   delay(1000);
   TournerGauche( 190 );
   delay(1000);
   TournerGauche( 200 );
   delay(1000);
   TournerGauche( 210 );
   delay(1000);
   ToutDroit();
   delay(2000); */

   // Tourner droite 2 fois pour signaler fin de 
   // séquence
   TournerDroite(210);
   delay( 800 );
   ToutDroit();
   delay(1000);
   TournerDroite(210);
   delay( 800 );
   ToutDroit();
   delay(2000);

}

void TournerDroite( int powerRate ){
  digitalWrite( pinInput1, HIGH );
  digitalWrite( pinInput2, LOW );
  analogWrite( pinPower, powerRate );
}

void TournerGauche( int powerRate ){
  digitalWrite( pinInput1, LOW );
  digitalWrite( pinInput2, HIGH );
  analogWrite( pinPower, powerRate );
}

void ToutDroit(){
  digitalWrite( pinInput1, LOW );
  digitalWrite( pinInput2, LOW );
  analogWrite( pinPower, 0 );
}

Reférences