Tourner sur soi-même sans se perdre : Pilotage simple d'un moteurs à courant continu avec un capteur infrarouge
Sommaire
Matériel
- Arduino Uno
- Plaque d'essai (breadboard)
- Straps ou fils de liaison
- 1 moteur à courant continu 5v
- 1 Résistance 2,2 kΩ
- 1 Diode de roue libre 1N4007
- 1 Transistor 2N2222A (ou BC547)
- 1 optocoupleur en fourche type Liton LTH 307-01
Principe
Comme on l'a vu précédemment, le moteur à courant continu fonctionne sans donner aucune information sur sa position ou sur le nombre de tours qu'il a effectués. Pour contourner ce problème, il faut lui adjoindre un capteur supplémentaire permettant de connaitre le nombre de tours faits. La solution classique est d'utiliser une fourche optique et une roue à fente.
La fourche optique est une sorte de capteur de passage qui retourne 0V quand il y a un obstacle entre la fourche et +5V quand il n'y a pas d'obstacle. Quand on met la roue à fente entre les dents de la fourche optique, le capteur passera de 0 à 1 puis de 1 à 0 à chaque passage de fente. Pour connaitre le nombre de tours faits au total, il suffit de compter le nombre de fronts montants.
Montage
Le montage est le même que précédemment auquel on rajoute la fourche optique sur la broche 2 de l'Arduino.
Programme
Voici le programme qu'il faut éditer dans l'IDE Arduino, puis compiler et charger dans la carte Arduino.
/*
Ce programme permet de vérifier qu'un objet est présent au milieu d'une fourche optique
*/
// Pins utilisées
const int fourchePin = 2; //Sortie de la fourche
const int ledPin = 13; // LED témoin sur pin
int EtatFourche = 0;
void setup() {
Serial.begin(9600); //connection au port série
pinMode(ledPin, OUTPUT); //LED en sortie
pinMode(fourchePin, INPUT); //en entrée
Serial.println("Fourche optique - detection de presence");
}
void loop() {
//Vérifie si un objet obture la fourche optique
EtatFourche = digitalRead(fourchePin);
Serial.print("Etat ");
if (EtatFourche == HIGH) {
// Allumer la LED témoin
digitalWrite(ledPin, HIGH);
Serial.println("Presence");
}
else {
// Eteindre la LED
digitalWrite(ledPin, LOW);
Serial.println("Vide");
}
delay(200);
}
/*
Ce programme permet de compter les impulsions en provenance d'une roue codeuse
*/
// Pins utilisées
const int fourchePin = 2; //Sortie de la fourche
const int ledPin = 13; // LED témoin sur pin
int EtatFourche = 0;
int nbImpulsion = 0;
void comptageDUneImpulsion(){
nbImpulsion++;
}
void setup() {
Serial.begin(9600); //connection au port série
pinMode(ledPin, OUTPUT); //LED en sortie
pinMode(fourchePin, INPUT); //en entrée
Serial.println("Fourche optique - compteur d'impulsions");
attachInterrupt(0, comptageDUneImpulsion, CHANGE);
}
void loop() {
delay(500);
Serial.print("Nombre d'impulsion :");
Serial.println(nbImpulsion);
}
/*
Ce programme permet de compter les impulsions en provenance d'une roue codeuse
*/
// Pins utilisées
const int fourchePin = 2; //Sortie de la fourche
const int ledPin = 13; // LED témoin sur pin
const int moteur = 6;
int nbImpulsion = 0;
int nbImpulsionDemande = 0;
void comptageDUneImpulsion(){
if(nbImpulsion >= nbImpulsionDemande){
digitalWrite(moteur, LOW);
}
else{
nbImpulsion++;
}
}
void avancer(int _nbImpulsion){
detachInterrupt(0);
nbImpulsion = 0;
nbImpulsionDemande = _nbImpulsion;
digitalWrite(moteur, HIGH);
attachInterrupt(0, comptageDUneImpulsion, CHANGE);
}
void setup() {
Serial.begin(9600); //connection au port série
pinMode(ledPin, OUTPUT); //LED en sortie
pinMode(fourchePin, INPUT); //en entrée
Serial.println("Fourche optique - compteur d'impulsions");
}
void loop() {
delay(500);
Serial.print("Nombre d'impulsion :");
Serial.println(nbImpulsion);
}