Tourner sur soi-même sans se perdre : Pilotage simple d'un moteurs à courant continu avec un capteur infrarouge

De Wiki L.A.B
Aller à : navigation, rechercher
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.

Arduino opto fourche ledx1.png

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.

MoteurCC bb.png

MoteurCC schéma.png

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); 
}