samedi 8 novembre 2014

Contrôle d'un ou deux moteurs CC avec STM32 Nucleo et L293D

Je continue de m'amuser avec ma carte STM32 Nucleo qui, rappelons-le, ne coûte pas très cher et est facile à programmer au moyen du compilateur en ligne mbed.

Cette fois, nous allons contrôler deux moteurs à courant continu, qui pourront tourner dans un sens ou dans l'autre à une vitesse que nous pourrons faire varier.   Ça nous sera certainement utile si l'envie nous prend de construire un robot dont le cerveau serait un STM32...


Le circuit

Il est hors de question de brancher nos moteurs directement sur les sorties de la carte Nucleo, ça risquerait de l'endommager sérieusement.  Le circuit intégré L293D (dont le nom officiel est "double pont en H") nous servira d'intermédiaire entre la carte Nucleo et les moteurs.  En gros, le Nucleo enverra des directives au L293D, et ce dernier utilisera ces directives pour faire tourner les moteurs dans la bonne direction et à la vitesse désirée.


Le circuit L293D sera alimenté par la carte Nucleo, mais nous avons besoin d'une alimentation dédiée aux moteurs (encore une fois dans le soucis de ne pas endommager notre carte avec des courants trop intenses).  Quelques piles placées en série feront l'affaire, assurez-vous simplement de ne pas dépasser la tension maximale supportée par vos moteurs.

Voici ce que je vous propose comme circuit.  Prenez soin de brancher ensemble toutes les masses (une pin GND du Nucleo, les 4 pins GND du L293D et la borne négative de l'alimentation des moteurs).   Bien entendu, si vous n'avez besoin que d'un seul moteur, il n'est pas nécessaire d'en brancher un deuxième...




  • Pin 1 du L293D :  Pin D9 du Nucleo
  • Pin 2 du L293D : Pin D3 du Nucleo
  • Pin 3 du L293D: Une des bornes du premier moteur
  • Pins 4, 5, 12, 13 du L293D:  GND du Nucleo et borne négative de l'alimentation des moteurs
  • Pin 6 du L293D:  L'autre borne du premier moteur
  • Pin 7 du L293D:  Pin D4 du Nucleo
  • Pin 8 du L293D:  Borne positive de l'alimentation des moteurs
  • Pin 9 du L293D:  Pin D10 du Nucleo
  • Pin 10 du L293D:  pin D5 du Nucleo
  • Pin 11 du L293D:  Une des bornes du deuxième moteur
  • Pin 14 du L293D: L'autre borne du deuxième moteur
  • Pin 15 du L293D: Pin D6 du Nucleo
  • Pin 16 du L293D:  Pin 5V du Nucleo
  •  
Le script

Voici un exemple de script que vous pourrez installer dans le Nucleo au moyen du compilateur mbed (voir mes articles précédents pour plus d'informations sur la façon d'utiliser mbed).

Pour chaque moteur, le sens de la rotation dépend des deux sorties numériques qui lui sont assignées.  La vitesse du moteur est réglée au moyen d'un signal PWM.

-
/******************************************************
Contrôle de deux moteurs DC avec STM32 Nucleo et L293D
http://electroniqueamateur.blogspot.com/2014/11/controle-dun-ou-deux-moteurs-dc-avec.html
******************************************************/
#include "mbed.h"
// définition des pins: sorties numériques et sorties pwm
DigitalOut moteur1a(D3); // Marche avant du premier moteur
DigitalOut moteur1b(D4); // Marche arrière du premier moteur
DigitalOut moteur2a(D5); // Marche avant du deuxième moteur
DigitalOut moteur2b(D6); // Marche arrière du deuxième moteur
PwmOut pwm1(D9); // vitesse du premier moteur
PwmOut pwm2(D10); // vitesse du deuxième moteur
int main() {
while(1) { // en boucle jusqu'à la fin de notre civilisation
// on commence par le premier moteur seulement, en marche avant, vitesse lente (10%)
pwm1.write(0.10f);
moteur1a = 1;
moteur1b = 0;
moteur2a = 0;
moteur2b = 0;
wait(3); // on ne change rien pendant 3 secondes
// maintenant, pleine vitesse
pwm1.write(1.00f);
wait(3); // on ne change rien pendant 3 secondes
// on arrête tout
moteur1a = 0;
wait(3); // on ne change rien pendant 3 secondes
// moteur 1 en marche inverse, vitesse moyenne (30%)
pwm1.write(0.30f);
moteur1a = 0;
moteur1b = 1;
wait(3); // on ne change rien pendant 3 secondes
// on ajoute le moteur 2: marche avant, 50%
pwm2.write(0.50f);
moteur2a = 0;
moteur2b = 1;
wait(3); // on ne change rien pendant 3 secondes
// on arrête le moteur 1; moteur 2: vitesse lente en marche arrière
pwm2.write(0.200f);
moteur1a = 0;
moteur1b = 0;
moteur2a = 1;
moteur2b = 0;
wait(3); // on ne change rien pendant 3 secondes
// on arrête tout
moteur2a = 0;
wait(3); // on ne change rien pendant 3 secondes
}
}
-

Yves Pelletier (Twitter:  @ElectroAmateur)

Aucun commentaire:

Enregistrer un commentaire