Projet Moteur Pas à Pas et Capteur Infrarouge

Bonjour ,

je réalise un projet consistant à piloter un moteur pas à pas ainsi qu'un capteur Infrarouge.

Le but est de faire en sorte que le moteur s'arrête lorsque le capteur détecte un objet.

Voici le code que j'ai pour le moment où le seul problème est l'arrêt du moteur, je n'arrive absolument pas à arrêter le moteur lorsque le capteur détecte quelque chose.

int sensor = 2; // pin  2
int motor_pin_1 = 3;
int motor_pin_2 = 13;
int motor_pin_3 = 11;
int motor_pin_4 = 2;
int val =0;
int p;
// motor functions
 void run_motor()
{
  switch(p) {
    
  case 0 :
  
  digitalWrite(motor_pin_1, HIGH); //1100
  digitalWrite(motor_pin_2, LOW);
  digitalWrite(motor_pin_3, HIGH);
  digitalWrite(motor_pin_4, LOW);
  
  delayMicroseconds(800);
  
  digitalWrite(motor_pin_1, LOW); //0110
  digitalWrite(motor_pin_2, HIGH);
  digitalWrite(motor_pin_3, HIGH);
  digitalWrite(motor_pin_4, LOW);
  
  delayMicroseconds(800);
  
  digitalWrite(motor_pin_1, LOW);//0011
  digitalWrite(motor_pin_2, HIGH);
  digitalWrite(motor_pin_3, LOW);
  digitalWrite(motor_pin_4, HIGH);
  
  delayMicroseconds(800);
  
  digitalWrite(motor_pin_1, HIGH); //1001
  digitalWrite(motor_pin_2, LOW);
  digitalWrite(motor_pin_3, LOW);
  digitalWrite(motor_pin_4, HIGH);
 
  delayMicroseconds(800);
  
  break;
  }
}

 
void stop_motor ()
{
  switch (p) {
    case 0 :
    
  digitalWrite(motor_pin_1, LOW); //1001
  digitalWrite(motor_pin_2, LOW);
  digitalWrite(motor_pin_3, LOW);
  digitalWrite(motor_pin_4, LOW);
  
  delayMicroseconds(800);
  break;

  }
}

void setup(void)
{ 

 pinMode(sensor, INPUT);     // declare sensor as input
 
 pinMode(motor_pin_1, OUTPUT);
 pinMode(motor_pin_2, OUTPUT);
 pinMode(motor_pin_3, OUTPUT);
 pinMode(motor_pin_4, OUTPUT);
 
 
Serial.begin(9600); //Set Baud Rate
}
void loop(void)
{
 val = digitalRead(sensor);
 if (val == HIGH) 
 {
   stop_motor();
 }
 else
 {
   run_motor();
 }
}

En espérant avoir été clair et précis sur mon projet :wink:

A quoi sert la variable p ?

val est déclaré comme int (entier), puis testé comme un booléen HIGH ?

Quel est le type de ton capteur IR ? Il envoie uniquement 0 et +5V ?

  • Le schéma électrique
  • les liens vers les datasheets des composants
    sont aussi importants que le code.

val est déclaré comme int (entier), puis testé comme un booléen HIGH ?

val représente l'état du capteur HIGH si il détecte un objet et LOW si il ne détecte rien.

A quoi sert la variable p ?

Elle est présente juste pour que je puisse utiliser les switchs et grâce au break je comptait arrêter le moteur.

Quel est le type de ton capteur IR ? Il envoie uniquement 0 et +5V ?

La référence de mon capteur est : SA1E-BP1-2M ( http://us.idec.com/Catalog/ProductSeries.aspx?SeriesName=SA1E_Series&FamilyName=Universal_Photoelectric ).

Dans mon code il renvoie seulement son état si il détecte quelque chose ou non.

Pour mon moteur Pas à Pas : QSH 4218-51-10-049 ( http://www.trinamic.com/products/motors/motors-stepper/qmot-qsh4218 )

Pour le schèma éléctrique je n'est pas d'image pour le moment mais je dispose d'une carte arduino MEGA 2560 avec un Shield Motor vma03 ( http://www.vellemanusa.com/downloads/0/modules/usermanual_vma03.pdf )

Pour mon moteur j'ai une paire Noir/Vert et Bleu/Rouge relié au Shield avec une alimentation externe relié au pwr du shield.

Le capteur est directement connecté a l'alimentation et également au Pin 2 de l'arduino.

Merci beaucoup de prendre le temps de me répondre.

Dark-snox:
Le capteur est directement connecté a l'alimentation et également au Pin 2 de l'arduino.

Quelle alimentation ?

As-tu lu la datasheet du capteur ?

Ce que tu vas bientôt gagner, au mieux, c'est un arduino grillé.

Voici la datasheet du capteur : Error Page

C'est une alimentation externe que j'ai réglé sur 16V car l'Arduino ne peut fournir que 5V et le capteur demande une tension entre 12V et 24V.

j'ai eu une vérification et aide d'un professeur et d'un technicien pour mon schéma électrique mais cela m'intéresserai de savoir où sont les risques ? car c'est sûr qu'une Arduino de grillé ne me ferais pas plaisir.

Si je ne dis pas de bêtise, ton capteur sort du 30VDC (ça dépend peut-être de l'alimentation en entrée) et 100mA. Tension et intensité que ton arduino ne supportera pas.

As-tu fais des mesures au multimètre de ce que sort ton capteur pour vérifier qu'il détecte bien un objet positionné à sa distance de mesure ?

D'après moi le capteur renvoie la même intensité qu'il reçoit (en testant avec un multimètre), je ne vois pas comment il pourrait renvoyer plus.

J'ai testé avec la librairie Stepper avant et mon capteur lançait le démarrage de mon moteur a la détection d'un objet mais impossible encore une fois d'arrêter le moteur avec la librairie Stepper. La carte chauffait un peu mais depuis que je n'utilise plus cette librairie elle ne chauffe plus.

Je ne suis vraiment pas sur de moi étant débutant Arduino et programmation mais je ne pense pas que le capteur renvoie autant car sinon ma carte aurait déjà cramer.

Bonjour,

la honte soit sur celui qui a redige la doc de ce superbe capteur.

Aucune info concernant le cablage ni l'affectation des pins sur le connecteur pour le capteur qui en est equipe.

Soit, sur la doc en japonais, j'ai vu ceci :

comme vous pouvez la voir, la sortie c'est un simple transistor.
Je te conseille d'alimenter le capteur avec 12V et de replacer la resistance de charge par 2 resistances en serie. Point commun entre les resistances vers entree Arduino et resistances choisies pour avoir maximum 5V.
Par exemple : masse > 4K7 > 6k8 > OUT et point commun entre 4K7 et 6K8 vers entree Arduino.

Jacques