Pages: [1]   Go Down
Author Topic: Branchement de deux microswitch fin de course et LED 13  (Read 960 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :


Code:
#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!



* microswitch_x_2.jpg (869.9 KB, 1992x1665 - viewed 95 times.)
« Last Edit: July 18, 2013, 04:56:18 pm by FlorL » Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 872
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
Logged

Christian

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-mr-green

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
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super, merci de votre rapidité en tout cas!

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

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

Bonne soirée!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir à tous smiley

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-twist

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 :

Code:
#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é  smiley-mr-green

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  smiley-mr-green





* microswitch_x_2_serie.jpg (747.29 KB, 1941x1476 - viewed 53 times.)
« Last Edit: July 19, 2013, 03:35:01 pm by FlorL » Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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

}

« Last Edit: July 19, 2013, 03:03:52 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

france
Offline Offline
God Member
*****
Karma: 15
Posts: 872
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: July 19, 2013, 03:23:29 pm by Christian_R » Logged

Christian

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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-twist

Après vérification et application sur les moteurs, je voulais signaler que tout fonctionne à merveille smiley
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!
« Last Edit: July 24, 2013, 04:18:29 pm by FlorL » Logged

Pages: [1]   Go Up
Jump to: