mardi 14 juin 2011

Moteur pas à pas.

Bon, globalement les articles précédents étaient des mises à jour sur ce que j'avais déjà produit pendant l'année. Un des points qui me posait quelques problèmes était le système qui devait répartir le contenu de ma cuve de développement dans les différents bouteilles qui contenaient les produits (ce ne sont pas des produits à usage unique).
J'avais construit un système basé sur le contrôle d'un moteur DC piloté à l'aide d'un HBridge. Mais le système manquait cruellement de précision. Je suis donc passé au contrôle de Moteur pas à pas (wiki) récupéré sur une imprimante Epson C62 HS (5 euros dans une brocante) qui contenait deux moteurs pas à pas.




Le branchement et la programation de ce type de moteur est bien plus compliquée qu'un simple switch ON/OFF, il faut envoyer une séquence de signal alternativement sur les deux bobines qui compose ce type de moteur. Pour pouvoir gérer ces moteurs de manière plus simple qu'avec mon HBridge fait avec 4 NPN, je me suis commandé une puce (qui contient 2 Hbridge nécéssaire au fonctionnement d'un moteur pas à pas.

Pour le branchement, après avoir identifié le circuit du moteur, j'ai suivi ce tuto : driving-a-bipolar-stepper-motor-forward-and-backward-with-l293d



// Arduino Code:
//declaration of PINS that connected the wire to motor
int blanc4 = 2;
int jaune3 = 3;
int blanc2 = 4;
int jaune1 = 5;
int B_init0 = 50;  //push button to stop init position
int prod = 0;  //what king of chemical is in use (0 for junk)
int distance = 0;

//debug Leds //
int LedRefill = 41;
int LedInit = 32;
//this is the time to wait in every single step
int delayTime = 3;

//set the pin for OUTPUT
void setup() {
  pinMode(blanc4, OUTPUT);
  pinMode(jaune3, OUTPUT);
  pinMode(jaune1, OUTPUT);
  pinMode(blanc2, OUTPUT);
  pinMode(B_init0, INPUT);
  pinMode(LedRefill, OUTPUT);
  pinMode(LedInit, OUTPUT);

// Init position //
  while (digitalRead(B_init0) == LOW) {
     initialisationPosition();
     digitalWrite(LedInit, LOW);
  }
 
}

void loop() {

      for (int i=0;i<6;i++){ 
        prod = i;
        delay(500);
        Refill(distance);
        delay(500);
      }
}

// Functions //

void initialisationPosition(){ 
    digitalWrite(LedInit, HIGH);
      backward(10);
}
 


void Refill(int distance){
    distance = prod*(380/5-2);
    forward(distance);
    digitalWrite(LedRefill, HIGH);
    delay(1000);
    digitalWrite(LedRefill, LOW);
    backward(distance);
    }
    
    
void forward(int steps){
  for(int i=0;i
// in every phase 2 wires is up and 2 is down
    digitalWrite(blanc4, LOW);
    digitalWrite(jaune3, HIGH);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);
 
    digitalWrite(blanc4, LOW);
    digitalWrite(jaune3, HIGH);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);}
}

void backward (int steps){
  for(int i=0;i
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, HIGH);
    digitalWrite(jaune1, LOW);
    delay(delayTime);
 
    digitalWrite(blanc4, HIGH);
    digitalWrite(jaune3, LOW);
    digitalWrite(blanc2, LOW);
    digitalWrite(jaune1, HIGH);
    delay(delayTime);
 
     digitalWrite(blanc4, LOW);
     digitalWrite(jaune3, HIGH);
     digitalWrite(blanc2, LOW);
     digitalWrite(jaune1, HIGH);
     delay(delayTime);
 
     digitalWrite(blanc4, LOW);
     digitalWrite(jaune3, HIGH);
     digitalWrite(blanc2, HIGH);
     digitalWrite(jaune1, LOW);
     delay(delayTime);
  }
  


}
On peut voir dans le code la séquence des pins à activer pour avoir un mouvement dans un sens forward() et dans l'autre backward().
J'ai vu qu'il y avait d'autres solutions pour avoir le meme résultat. Pour l'instant avec ce code adapté à mes besoins, ça fonctionne. J'irai voir un peu plus tard si j'ai moyen d'optimiser tout ça.

J'ai donc programmé une boucle qui dit de déplacer la tête de 6 étapes en s'arretant à chaque étape et en activant une LED rouge pendant 1 seconde puis retour à la position 0 pour toujours savoir où se trouve la tête (la position 0 sera l'endroit où se trouvera le collecteur vers l'évier pour éviter toute fuite au dessus d'un de mes bacs). Le contrôle de cette LED étant exactement le même signal que pour l'activation d'un transistor NPN, donc si la LED s'allume, la pompe s'activera.

Je vais maintenant reporter le circuit de la platine de développement sur fritzing pour commencer à designer la carte fille de l'Arduino Mega.

Aucun commentaire:

Enregistrer un commentaire