Bonjour, je suis début en Arduino et je dois réaliser un banc de test pour valider le fonctionnement de deux capteurs ILS/REED dans une pièce.
Voici mon câblage actuel avec un schéma électrique fait sur Tinkercad donc je ne sais pas s'il est juste ou non.
Mon problème est le suivant : lors du lancement du programme mon servomoteur va devant mon capteur avec un aimant pour l'activer (jusque-là tout va bien ) ensuite si le capteur fonctionne une LED devrait s'allumer puis même système pour la seconde LED sauf que mes LEDs ne s'allume soit pas du tout soit aléatoirement alors que les capteurs fonctionnent (tester avec un multimètre).
Je vous met mon code en espérant que quelqu'un pourra m'aider pour résoudre ce mystère
#include <Servo.h>
// crée l’objet pour contrôler le servomoteur
Servo monservo;
// constantes ne change pas. Elles sont utilisées pour donner les pins:
const int BoutonDepart = 11; //le numéro de la pin du bouton départ
const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
const int LedVerte = 3;//le numéro de la pin de la Led verte
const int LedJaune = 2;//le numéro de la pin de la Led jaune
const int ReedVert = 4;
const int ReedJaune = 5;
// les variables vont changées:
int etatBoutonDepart;
int etatBoutonRAZ;
int etatReedVert;
int etatReedJaune;
void setup() {
// initiliser les LEDs en tant que sortie
pinMode(LedFin, OUTPUT);
pinMode(LedVerte, OUTPUT);
pinMode(LedJaune, OUTPUT);
//initiliser les boutons en tant que entrer avec un état LOW au repos
pinMode(BoutonDepart, INPUT);
pinMode(BoutonRAZ, INPUT);
//capteur Reed en tant qu'entrer avec un état LOW au repos
pinMode(ReedVert, INPUT);
pinMode(ReedJaune, INPUT);
//initialisation du servomoteur
monservo.attach(13); // utilise la broche 13 pour le contrôle du servomoteur
monservo.write(80); // positionne le servomoteur à 80°
}
void loop() {
// On mémorise l'état du bouton
etatBoutonDepart = digitalRead(BoutonDepart);
// teste si le bouton a un niveau logique BAS
if (etatBoutonDepart == HIGH){
monservo.write(135); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{etatReedVert = digitalRead(ReedVert);
if (etatReedVert == HIGH){digitalWrite(LedVerte, HIGH);}
delay(1);
}
monservo.write(1); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{etatReedJaune = digitalRead(ReedJaune);
if (etatReedJaune == HIGH){digitalWrite(LedJaune, HIGH);}
delay(1);
}
monservo.write(80); // demande au servo de se déplacer à cette position
delay(100); // attend 1000 ms entre changement de position
digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
}
{// lire l'état du bouton départ
etatBoutonRAZ = digitalRead(BoutonRAZ);
//Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
}
}
ce que vous testez c'est S1 et S2 dans le schéma ?
normalement quand on fait une machine qui fait des tests, elle n'est pas sensée être intégrée dans le réseau de production.
Que voulez vous faire exactement?
PS: vous aviez déjà une autre post sur le même sujet, ce n'était pas vraiment nécessaire d'en créer un nouveau (c'est contre les règles du forum, ensuite l'information est éparpillée)
Bonjour, désoler je ne savais pas qu'il ne fallait pas ré ouvrir un chat.
Le S1 et S2 sont respectivement mon bouton de démarrage du programme et mon bouton pour la RAZ des LEDs en fin de cycle, moi je dois tester les TILT 1 et TILT 2 (capteur REED) avec une LEDS pour chacun des capteurs.
Mon objectif est d'identifié lors du démontage de mon produit si ces capteurs sont défectueux ou non pour qu'ils puissent être de nouveau assemblé.
Tes relais REED n'ont pas de résistances de PULL_DOWN
comme tes boutons qui eux ont 10K contre GND,
donc les entrée REED de l'Arduino
//capteur Reed en tant qu'entrer avec un état LOW au repos
pinMode(ReedVert, INPUT);
pinMode(ReedJaune, INPUT);
sont "en l'air" quand il ne sont pas activés et leur fil est susceptible de capter n'importe quoi comme perturbations, d'où l'aléatoire.
Si ton montage de test n'est pas dans un endroit trop perturbé, tu te simplifierai la tâche en inversant la logique de lecture de tes boutons et reed en mettant un côté à GND et l'entrée configurée en INPUT_PULLUP ainsi tu n'a plus besdoin de réststances. La lecture s'inverse, également == HIGH devient == LOW, pour les boutons et les REED.
Super!
Même si l'on ne joue pas au petit train, Locoduino est une excellente source d'information, qui a, pour moi, une qualité essentielle, la sobriété.
J'ai un problème maintenant avec le pullup je pense, car quand mon capteur est fonctionnel tout se passe bien les deux LEDs s'allume et quand un deux ne fonctionne plus une des LEDs reste éteint jusque-là nickel.
Viens le moment ou un capteur est bloqué en position fermée donc le banc le détecte comme valide car le courant passe.
Pour remédier à cela est ce possible d'annuler le pullup ?
#include <Servo.h>
// crée l’objet pour contrôler le servomoteur
Servo monservo;
// constantes ne change pas. Elles sont utilisées pour donner les pins:
const int BoutonDepart = 11; //le numéro de la pin du bouton départ
const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
const int LedVerte = 3;//le numéro de la pin de la Led verte
const int LedJaune = 2;//le numéro de la pin de la Led jaune
const int ReedVert = 4;//le numéro de la pin du capteur REED vert
const int ReedJaune = 5;//le numéro de la pin du capteur REED jaune
// les variables vont changées :
int etatBoutonDepart = 0;
int etatBoutonRAZ = 0;
int etatReedVert = 0;
int etatReedJaune = 0;
void setup() {
Serial.begin(9600);
// initiliser les LEDs en tant que sortie :
pinMode(LedFin, OUTPUT);
pinMode(LedVerte, OUTPUT);
pinMode(LedJaune, OUTPUT);
//initiliser les boutons en tant que entrer :
pinMode(BoutonDepart, INPUT);
pinMode(BoutonRAZ, INPUT);
//capteur Reed en tant qu'entrer :
pinMode(ReedVert, INPUT_PULLUP);
pinMode(ReedJaune, INPUT_PULLUP);
//initialisation du servomoteur
monservo.attach(13); // utilise la broche 13 pour le contrôle du servomoteur
monservo.write(80); // positionne le servomoteur à 80°
}
void loop() {
// On mémorise l'état du bouton
etatBoutonDepart = digitalRead(BoutonDepart);
// teste si le bouton a un niveau logique BAS
if (etatBoutonDepart == HIGH){
monservo.write(135); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{etatReedVert = digitalRead(ReedVert);
if (etatReedVert == LOW){
digitalWrite(LedVerte, HIGH);
}else{
digitalWrite(LedVerte,LOW);
}
}
monservo.write(5); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{etatReedJaune = digitalRead(ReedJaune);{
if (etatReedJaune == LOW){
digitalWrite(LedJaune, HIGH);
}else{
digitalWrite(LedJaune, LOW);
}
}
}
monservo.write(80); // demande au servo de se déplacer à cette position
delay(100); // attend 1000 ms entre changement de position
digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
}
{// lire l'état du bouton départ
etatBoutonRAZ = digitalRead(BoutonRAZ);
//Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
}
}
Tu ne testes jamais cette condition du REED bloqué fermé, il me semble.
Ce que tu devrait faire, au départ du cycle ou à la fin du cycle est de mettre le servo en position médiane et de contrôler si un REED te renvoie un LOW auquel cas, il serait bloqué fermé.
Bonjour, j'ai refais mon programme avec un test au début du cycle pour savoir si un des deux capteurs était défaillant pour éviter un résultat erroné, maintenant suite à la demande de mon tuteur d'apprentissage (J'ai oublier de précis c'est un projet pour un BTS CIM) j'ai mis en place un code pour tester le front montant lors du test mais je n'ai aucun résultat est ce que j'ai fait une erreur dans le codage ?
Et voici le code avec le front montant
#include <Servo.h>
// crée l’objet pour contrôler le servomoteur
Servo monservo;
// constantes ne change pas. Elles sont utilisées pour donner les pins:
const int BoutonDepart = 11; //le numéro de la pin du bouton départ
const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
const int LedVerte = 3;//le numéro de la pin de la Led verte
const int LedJaune = 2;//le numéro de la pin de la Led jaune
const int ReedVert = 4;//le numéro de la pin du capteur REED vert
const int ReedJaune = 5;//le numéro de la pin du capteur REED jaune
// les variables vont changées :
int etatBoutonDepart = 0;
int etatBoutonRAZ = 0;
int etatReedVert = 0;
int etatReedJaune = 0;
int etatReedVertMem = 0;
int etatReedJauneMem = 0;
int compteur = 0;
void setup() {
Serial.begin(9600);
// initiliser les LEDs en tant que sortie :
pinMode(LedFin, OUTPUT);
pinMode(LedVerte, OUTPUT);
pinMode(LedJaune, OUTPUT);
//initiliser les boutons en tant que entrer :
pinMode(BoutonDepart, INPUT);
pinMode(BoutonRAZ, INPUT);
//capteur Reed en tant qu'entrer :
pinMode(ReedVert, INPUT_PULLUP);
pinMode(ReedJaune, INPUT_PULLUP);
//initialisation du servomoteur
monservo.attach(13); // utilise la broche 13 pour le contrôle du servomoteur
monservo.write(80); // positionne le servomoteur à 80°
}
void loop() {
// On mémorise l'état du bouton
etatBoutonDepart = digitalRead(BoutonDepart);
// teste si le bouton a un niveau logique BAS
if (etatBoutonDepart == HIGH){
monservo.write(135); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{ etatReedVert = digitalRead(ReedVert);
if (etatReedVert != etatReedVertMem){
if (etatReedVert == HIGH){
compteur++;
digitalWrite(LedVerte, HIGH);
delay(500);
}
}
}
monservo.write(5); // demande au servo de se déplacer à cette position
delay(1500); // attend 2000 ms entre changement de position
{ etatReedJaune = digitalRead(ReedJaune);
if (etatReedJaune != etatReedJauneMem){
if (etatReedJaune == HIGH){
compteur++;
digitalWrite(LedJaune, HIGH);
delay(500);
}
}
}
monservo.write(80); // demande au servo de se déplacer à cette position
delay(100); // attend 1000 ms entre changement de position
digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
}
{// lire l'état du bouton départ
etatBoutonRAZ = digitalRead(BoutonRAZ);
//Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
}
}
Il m'a proposé d'utilisé un front montant car cela serait plus simple, hors je n'y connais rien et avec les recherche effectuées j'ai pu bidouiller un petit code donc je pense ne pas du tout avoir stocker l'information que vous me demander, et utilisé une bibliothèque je ne pense pas que ca va causer des problèmes.
Un bouton câblé en INPUT_PULLUP et et avec une des bibliothèques comme Button dans easyRun ou OneButton de Matthias Hertel ou encore Toggle simplifie grandement les choses mais ce sera un front descendant.