Enoncé du TP

publicité
ROB_TP2
Robot WIFIBOT : Commande des moteurs
G.COLIN
1 – Présentation
Le robot WIFIBOT est un robot de surveillance, muni d’une caméra IP et de 4 roues motrices.
Il est pilotable à travers le réseau (privé ou Internet).
Dans ce TP, on s’intéresse en particulier aux commandes des moteurs électriques. Le robot en dispose de 4, un pour
chaque roue.
Le robot dispose de 2 cartes de commande des moteurs. Chaque carte commande 2 moteurs.
Objectif du TP : Etablir la commande des moteurs à courant continu.
2 – Etude du principe de la commande
Le circuit intégré L298, permet de commander 2 moteurs à courant continu. Il dispose de 8 transistors de puissance
capable de fournir 2 Ampères à chaque moteur. Il est nécessaire de refroidir le circuit intégré à l’aide d’un radiateur.
Le schéma de câblage pour un moteur est le suivant :
Les diodes sont externes au circuit, et assurent la continuité du courant lorsque les transistors se bloquent.
Les transistors bipolaires laissent passer un courant entre collecteur et émetteur lorsque la base est au niveau haut.
Fonction logique ET :
Il faut 1 ET 1 sur les 2 entrées pour avoir un 1 en sortie
Fonction logique ET avec une entrée inversée :
Il faut 0 ET 1 sur les entrée pour avoir un 1 en sortie
ère
2.1 – En s’inspirant des 2 exemples donnés sur la 1 ligne, compléter le tableau du document réponse en indiquant si les
transistors sont bloqués ou passants (remplacer un transistor passant par un fil, comme ci-dessus). Préciser le potentiel (+V ou
GND) sur les bornes du moteur.
2.2 – Indiquer, sur document réponse, les cas où le moteur est soumis à une différence de potentiel qui permettrait de le faire
tourner.(indiquer marche ou arrêt pour chaque cas).
2.3 – Quelle est la conséquence sur l’alimentation du moteur lorsque l’entrée logique EnA est à 0.
Pour inverser le sens de rotation du moteur à courant continu, il faut inverser la différence de potentiel à ses bornes.
On définit le sens 1 lorsque In=1 et In2=0.
2.4 – Indiquer les états logiques de In1 et In2 pour obtenir le sens2, inverse du sens 1.
3 – Commande en PWM (Pulse Width Modulation=Modulation de Largeur d'Impulsion)
L’instruction, intégré à la carte ARDUINO, analogWrite() permet de générer sur certaines sorties, un signal numérique de
fréquence fixe (500Hz environ, soit 500 périodes par seconde) et de rapport cyclique variable.
La variable passée à la fonction permet de faire varier le rapport cyclique de 0% (pour 0) à 100% (pour 255).
La syntaxe exacte est la suivante :
3.1 – En appliquant une règle de 3, pour la commande analogWrite(100) puis pour la commande analogWrite(200), tracer la
forme du signal obtenu en respectant les échelles, sur le document réponse (rappel : la période = 1/fréquence).
Par la suite, on relie la sortie à rapport cyclique variable sur l’entrée EnA du circuit L298 qui commande un des moteurs.
La variation du rapport cyclique aura pour conséquence de faire varier la tension moyenne aux bornes du moteur, et donc de
faire varier la vitesse de rotation du moteur.
4 – Test sur carte ARDUINO
Le montage est pré-câblé.
er
Le 1 programme de test est donné ci-dessous :
La sortie 8 de la carte ARDUINO est reliée sur l’entrée In1 du circuit L298
La sortie 11 de la carte ARDUINO est reliée sur l’entrée In2 du circuit L298
La sortie 9 de la carte ARDUINO est reliée sur l’entrée EnA du circuit L298
int In1=8;
int In2=11;
int EnA=9;
void setup()
{
pinMode(In1,OUTPUT);
pinMode(In2,OUTPUT);
pinMode(EnA,OUTPUT);
}
void loop()
{
digitalWrite(In2,LOW);
digitalWrite(In1,HIGH);
analogWrite(EnA,100);
while(1);
}
Implanter le programme dans la mémoire de la carte ARDUINO
Modifier la valeur 100 (dans la commande analogWrite(EnA,100) par la valeur 150. Faire un essai.
Recommencer pour les valeurs 200 et 250
Si la tension aux bornes du moteur est insuffisante, le moteur n’arrive pas à vaincre les résistances mécaniques dues aux
frottements.
Tester avec des valeurs faibles (10, 20, 30, 40, 50 …) et déterminer la valeur minimale à appliquer pour que le moteur puisse
démarrer.
4.1 – Proposer une modification du programme (sur les 2 instructions digitalWrite) pour faire tourner le moteur dans le sens
contraire. Faire constater au prof.
Pour structurer le programme, on décide dans un premier temps de créer une procédure « void MoteurA_Sens1(unsigned char
vitesse) », comme ci-dessous :
int In1=8;
int In2=11;
int EnA=9;
void setup()
{
pinMode(In1,OUTPUT);
pinMode(In2,OUTPUT);
pinMode(EnA,OUTPUT);
}
void MoteurA_Sens1(unsigned char vitesse)
{
digitalWrite(In2,LOW);
digitalWrite(In1,HIGH);
analogWrite(EnA,vitesse);
}
void loop()
{
MoteurA_Sens1(150);
while(1);
}
Tester le programme
4.2 – De la même manière, créer une procédure « void MoteurA_Stop() » qui arrête le moteur et tester cette procédure en
modifiant le programme principal (boucle loop()) de la manière suivante :
void loop()
{
MoteurA_Sens1(150);
delay(2000);
MoteurA_Stop();
delay(2000);
}
Faire constater au prof.
4.3 – De la même manière, créer une procédure « void MoteurA_Sens2(unsigned char vitesse) » qui fait tourner le moteur dans
le sens2 (contraire au sens précédent) et tester cette procédure en modifiant le programme principal (boucle loop()) de la
manière suivante :
void loop()
{
MoteurA_Sens1(150);
delay(2000);
MoteurA_Stop();
delay(2000);
MoteurA_Sens2(150);
delay(2000);
MoteurA_Stop();
delay(2000);
}
Faire constater au prof.
5 – Commande du moteur par LABVIEW
Implanter le programme ci-dessous dans la carte ARDUINO, en complétant au préalable les parties à compléter.
int In1=8;
int In2=11;
int EnA=9;
unsigned char sens;
void setup()
{
pinMode(In1,OUTPUT);
pinMode(In2,OUTPUT);
pinMode(EnA,OUTPUT);
Serial.begin(115200);
Serial.println("c'est parti");
sens=1;
}
void MoteurA_Sens1(unsigned char vitesse)
{
digitalWrite(In2,LOW);
digitalWrite(In1,HIGH);
analogWrite(EnA,vitesse);
}
void MoteurA_Sens2(unsigned char vitesse)
{
…………..à compléter
}
void MoteurA_Stop()
{
…………..à compléter
}
void loop()
{
unsigned char data0, data1, data2;
if (Serial.available() > 0)
{
data0=Serial.read();//lecture 1ère donnée
switch(data0)
{
case 'M':
while(Serial.available()<=0);//attente 2ème donnée
data1=Serial.read();//lecture 2ème donnée
while(Serial.available()<=0);//attente 3ème donnée
data2=Serial.read();//lecture 3ème donnée
if (data1==1 && sens==1) MoteurA_Sens1(data2);
if (data1==2 && sens==2) MoteurA_Sens2(data2);
if (data1==1 && sens==2) {MoteurA_Stop();delay(1000);sens=1;}
if (data1==2 && sens==1) {MoteurA_Stop();delay(1000);sens=2;}
break;
}
}
}
Télécharger le fichier visa_commande_MCC.zip et l’enregistrer dans le répertoire travail
Ouvrir le fichier visa_commande_MCC.vi à l’aide du logiciel LABVIEW
Procéder aux essais. Faire constater au prof.
5.1 – Indiquer les 3 données qui sont transmises à la carte ARDUINO (valeur ou nature de l’information), au dos du document
réponse
Lorsqu’on change le sens de rotation du moteur, il s’arrête avant de redémarrer.
5.2 – Quels sont les lignes de programme de la carte ARDUINO qui permettent cet arrêt avant le changement de sens ?
(Répondre au dos du document réponse)
Téléchargement