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
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.
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/****************************************************** | |
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