Branchement de deux microswitch fin de course et LED 13

Bonjour !

Je me présente, je suis FlorL et j'ai découvert Arduino il y a environ deux ans et demi. Après avoir interrompu ma pratique pendant un peu plus d'un an, j'ai mis de nouveau mes mains dans le cambouis il y a quelques mois pour un projets avec des moteurs et des interrupteurs type "fin de course" comme celui-ci : http://www.destockage38.com/images/FDCMOY_HD.jpg.

Pour faire simple, j'ai deux microswitchs liés chacun à un moteur pas-à-pas. Ici les switchs servent de butée pour inverser le sens de rotation des moteurs.

Si le branchement des moteurs ne pose pas problème, j'ai plus de soucis pour le câblage des switchs sur l'Arduino. C'est sûrement très simple mais quelque chose m'échappe. Je m'explique :

L'idée est de brancher deux switches sur l'Arduino afin que la LED 13 s'allume dès que l'un des deux switchs est appuyé, la LED me sert à détecter si le contact se fait bien, c'est pour ça que je n'ajoute pas de LED supllémentaires.

Je branche tout ce petit monde selon le schéma Fritzing en pièce jointe. Pour plus d'information, les switchs sont bien des fin de courses avec une petite languette au-dessus et les résistances sont d'environ 5Kohm.

Et je téléverse ceci dans l'Arduino :

#define Led     13
#define Ils0A     11
#define Ils1A     10
#define Ils0B     3
#define Ils1B     2



void setup()
{  
  pinMode(Led, OUTPUT); 
  pinMode(Ils0A, INPUT);  
  pinMode(Ils1A, INPUT);  
  pinMode(Ils0B, INPUT);  
  pinMode(Ils1B, INPUT);    
  
}

void loop()
{  
  ReadIlsA();
  ReadIlsB();
}

boolean ReadIlsA()

{
  
 if (digitalRead(Ils1A) == 1) 
 {
   digitalWrite(Led, 1); 
   return 1;
 }
  else 
  {
    digitalWrite(Led, 0);
    return 0;
  }
}

boolean ReadIlsB()

{
  
 if (digitalRead(Ils1B) == 1) 
 {
   digitalWrite(Led, 1); 
   return 1;
 }
  else 
  {
    digitalWrite(Led, 0);
    return 0;
  }
}

Maintenant, je vous décris ce qui se passe.

Lorsque j'appuie sur le switch de gauche, le contact se fait sans problème.
Lorsque j'appuie sur le switch de droite, la LED 13 emet une très faible lumière. Les switchs étant branchés en parallèle, je me dis que ce n'est pas normal, et surtout, ce n'est pas ce que je souhaite! Ce que je souhaite, c'est que la LED 13 s'allume avec la même intensité quelque soit le switch appuyé.

Je tourne et je retourne le problème sans vraiment trouver. Ceci dit, je reste persuadée que la solution est très simple genre un câble mal branché ou manquant. Le souci, c'est que je ne vois pas ce qui cloche dans mes branchements.

Il se peut que mon câblage soit une aberration car mes cours de physique remonte un peu, mais si quelqu'un veut bien se pencher sur mon problème, ce serait super!

Bonne soirée!

Les microswitchs sont de simples interrupteurs à contact.

  • Une borne sur la masse GND
  • L'autre borne sur une entrée digitale de l'Arduino.

Donc 2 entrées Arduino suffisent pour 2 contacts
Tu as des fils (viloets) en trop (ils court-circuitent les pins 3 et 11 à la masse).

Au lieu de mettre tes inter en // tu les mets en série, ainsi tu économise une pin.... voir plus si je comprends bien ce que tu as fait :grin:

avec tes switchs en série, tant que le courant passe ton boléen est à 1 si un des inter coupe le passage du courant ton boléen passe à 0.... et tu inverses le sens de rotation.

Jette un oeil ici, il y a un truc un peu similaire à ce que tu veux faire dans le code :

http://forum.arduino.cc/index.php?topic=33038.0

Super, merci de votre rapidité en tout cas!

Effectivement, je n'avais pas du tout envisagé le branchement en série :grin:, persuadée qu'il fallait tout câbler en dérivation pour alimenter les switchs :grin:

Il se fait tard mais je regarde tout ça demain et je vous donne de mes nouvelles.

Bonne soirée!

Bonsoir à tous :slight_smile:

Je vous donne des nouvelles de vos conseils : globalement, ça marche. On va dans le sens de la progression et c'est toujours appréciable!
Mais si je mets "globalement", c'est qu'il y a aussi une raison, malheureusement ]:smiley:

Pour commencer, je mets en pièce jointe le dernier schéma Fritzing, pour que ce soit utile à tous, afin de comparer avec celui du premier post.

J'ai modifié légèrement le code, qui est desormais le suivant :

#define Led     13
#define Ils0A     11 // relié au GND du premier switch
#define Ils1A     12 // relié au NC du premier switch
#define Ils0B     2 // relié au GND du deuxième switch
#define Ils1B     3  // relié au NC du deuxième switch



void setup()
{  
  pinMode(Led, OUTPUT); 
  pinMode(Ils0A, INPUT);  
  pinMode(Ils1A, INPUT);  
  pinMode(Ils0B, INPUT);  
  pinMode(Ils1B, INPUT);    
 Serial.begin(115200);
  
}

void loop()
{  
  ReadIlsA();
  ReadIlsB();
}

boolean ReadIlsA()

{
  
 if (digitalRead(Ils1A) == 1) 
 {
   digitalWrite(Led, 1); 
   Serial.print(1);
   return 1;
 }
  else 
  {
    digitalWrite(Led, 0);
    return 0;
  }
}

boolean ReadIlsB()

{
  
 if (digitalRead(Ils1B) == 1) 
 {
   digitalWrite(Led, 1); 
   Serial.print(2);
   return 1;
 }
  else 
  {
    digitalWrite(Led, 0);
    return 0;
  }
}

J'ajoute notamment un "Serial.print" sur les états "switchA appuyé" et "switchB appuyé", logiquement, quand le switch A est appuyé, ça envoie "1" dans le moniteur, et dans le cas du switch B, ça envoie "2". Tout ça pour bien vérifier mon signal.

Lorsque je téléverse la chose sur Arduino, la led 13 fait ce que je lui demande au départ, donc a priori tout va bien.

Sauf que :

La LED TX s'allume lorsque j'appuie sur un des switches.
Lorsque je check le moniteur, le switch A envoie bien une série de "111111111111...." là où le switch B envoie une série de "2121212121..." là où c'est sensé envoyer du "222222222...." comme vous l'avez deviné :grin:

D'où mes questions :

Pourquoi la LED TX s'allume et est-ce que c'est normal?
l'envoie du signal "2121212121..." peut-il venir du branchement en série?

Merci d'avance
de votre intérêt et de votre patience.

PS : Sympa la vidéo Jean-François! Par contre j'ai pas vu où était placé le switch de fin de course, mais je suis peut-être miro :grin:

Là on voit bien que les switchs sont en série :

Le code pour trouver la position milieu de la roue avant, le moteur de la direction part dans un sens jusqu'à la première touche, puis repart dans l'autre sens en comptant les pas du moteur jusqu'à la deuxième touche. On repart dans l'autre sens de la moitié des pas comptés... et on la roue avant est alignée avec l'axe du mobile

void mise_a_zero(){
  delay (200);
  ////////////////////////////////touche a gauche
  while (digitalRead(pin_stop)==HIGH){
  
    delai_entre_pas= micros()-Old_time;
  if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
    Old_time=micros();
    
  digitalWrite(pinA, etatPinA[pas_suivant]);
  digitalWrite(pinB, etatPinB[pas_suivant]);
  pas_suivant--;
  if(pas_suivant <0){pas_suivant=3;}
  }
  }
  
  while (stepper_return<=15){
     delai_entre_pas= micros()-Old_time;
  if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
    Old_time=micros();
    
  digitalWrite(pinA, etatPinA[pas_suivant]);
  digitalWrite(pinB, etatPinB[pas_suivant]);
  pas_suivant++;
  stepper_return++;
  if(pas_suivant >=4){pas_suivant=0;}
  }}
  stepper_return=0;
  /////////////////////// fin de touche a gauche
  ///// touche a droite
  while (digitalRead(pin_stop)==HIGH){
  
  delai_entre_pas= micros()-Old_time;
  if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
    Old_time=micros();
    
  digitalWrite(pinA, etatPinA[pas_suivant]);
  digitalWrite(pinB, etatPinB[pas_suivant]);
  pas_suivant++;
  stepper_count++;
  if(pas_suivant >=4){pas_suivant=0;}
}}
///// fin de touche a droite

/// positionnement a zero
stepper_count= stepper_count/2;
pos_stepper=stepper_count;
while (stepper_count>=-4){
     delai_entre_pas= micros()-Old_time;
  if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
    Old_time=micros();
    
  digitalWrite(pinA, etatPinA[pas_suivant]);
  digitalWrite(pinB, etatPinB[pas_suivant]);
  pas_suivant--;
  
  stepper_count--;
  pos_stepper--;
  if(pas_suivant <0){pas_suivant=3;}
}
}
/// fin de positionnement a zero

}

Ton fil gris côté gauche est flottant (décalé d'une rangée).
Il n'y a pas besoin de 4 pins sur l'Arduino.

@Christian : exact, du coup j'ai modifié le schéma !
@Jean-François : merci pour les précisions, vu comme ça, on comprends mieux comment fonctionne tes fins de course!

Bon, j'avance un peu dans mon exploration : pour la LED TX, ça vient du "Serial.begin(115200);" qui envoie des données vers le moniteur série, notamment les valeurs des switch, donc il est normal qu'elle s'allume quand j'appuie. Une info tout de même si ça vous arrive : si vous televersez le code tel quel et que vous n'ouvrez pas le moniteur, TX reste constamment allumé. Voilà pour la précision.

Je continue de jeter un oeil à tout ça! ]:smiley:

Après vérification et application sur les moteurs, je voulais signaler que tout fonctionne à merveille :slight_smile:
Un grand merci à vous tous pour votre intérêt et votre rapidité, j'ai gagné un temps fou grâce à vous!

A bientôt sur le forum!