Go Down

Topic: [Resolu] Problème de relais qui bloque des actions (Read 2762 times) previous topic - next topic

Hikashiro

Jun 12, 2019, 01:37 pm Last Edit: Jun 21, 2019, 02:52 pm by Hikashiro
Bonjour à tous,

Je suis actuellement sur un projet. Mon projet est que j'ai un capteur à effet hall ( envoie une certaine tension selon le champ magnétique qu'il capte), 4 Leds ( Nord, Sud, Aucun champ magnétique et une qui sers lors de l'activation d'un bouton poussoir), une bobine, un relais.

J'ai réussi à faire en sorte que si le capteur capte telle tension (0 à 5V donc 0 à 1023) et bien il m'allume sois la leds qui correspond au Nord ou celle du Sud, et si aucun champ détecté alors il allume la 3 ème Leds. Puis j'ai rajouter un bouton poussoir qui fais que lorsque l'on appui dessus il allume ma 4 ème Leds. Après il m'a fallu contrôler ma bobine via une alim externe vu que l'arduino ne peut supporter plus de 40mA part sortie donc j'ai du utiliser un relais et là le problème commence.

Tout fonctionne bien avec mes 3 leds et le bouton poussoir avec sa leds mais une fois que je mets le code pour contrôler la self et bien la leds de mon bouton poussoir ne s'allume que lorsque mon relais s'active et de plus le relais prend le contrôle de mon moniteur série ( utiliser pour connaître la valeur compris entre 0 et 1023 de mon capteur avant le relais il faisait un calcul de la valeur du capteur toutes les 0.1sec je pense maintenant il suis le rythme du relais.

Avez-vous des idées ? Si possible je peux envoyer le codes et un schéma. J'espère avoir été claire un minimum.

Merci pour vos futures réponses.

68tjs

Quote
Si possible je peux envoyer le codes et un schéma.
C'est les premières choses que tu aurais du envoyer.
Pour nous un schéma électrique et un code sont le plus important.
On souhaite un vrai schéma électrique plutôt  qu'un dessin de câblage du style Fritzing (fritzing sait faire des schémas électriques à partir du dessin de câblage).
Si le code n'est pas entre entre balises codes (icône </> ) il ne sera pas lu par les utilisateurs de tablettes et téléphones.

Précises aussi de quelle carte tu te sers, il y a presque une 20 taine de modèles chez Arduino.
Et aussi si c'est un clone, il y a des clones inférieurs à l'original, mais aussi des clones supérieurs à l'original.

Hikashiro

#2
Jun 13, 2019, 08:26 am Last Edit: Jun 13, 2019, 08:30 am by Hikashiro
Bonjour,

Merci pour ta réponse donc voilà le schéma électrique sachant que j'utilise un Arduino Uno (version 3)

Au niveau du schéma électrique le relais utiliser est le :https://fr.rs-online.com/web/p/relais-rf-et-haute-frequence/8154859/
et sur mon schéma c'est une pile 9V mais en réalité j'utilise une alimentation externe.


Et voici le code :

Code: [Select]
int valmin=1024; // on initialise la valeur minimale au plus haut pour le moniteur série
int valmax=0; // et la valeur maximale au plus bas
int valmoy=512;

int pincapteur=A0;

const int pinLed=7;
const int pinLed1=8;
const int pinLed2=9;

const int LEDB=10;
const int bouton=11;
int etatbouton=0;

const int pinAC=6; // transistor A & C
const int pinBD=5; // transistor B & D


void setup()
{
Serial.begin(9600);

pinMode(LEDB,OUTPUT);      
pinMode(bouton,INPUT_PULLUP);

pinMode(pinLed,OUTPUT);
pinMode(pinLed1,OUTPUT);
pinMode(pinLed2,OUTPUT);

pinMode(pinAC,OUTPUT);
pinMode(pinBD,OUTPUT);
}

void loop()
{
  boutonled();
  valeurcapteur();
  capteurled();
  //pontH();
  }

void boutonled()
{  
etatbouton = digitalRead(bouton);
  if (etatbouton == HIGH)
  {    
    digitalWrite(LEDB,LOW);  
  }
  else
  {
    digitalWrite(LEDB,HIGH);
  }
}

void valeurcapteur()
{
      // Moniteur série pour vérifier valeur
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur
  if (valeur>valmax) //on compare avec valMax
    valmax=valeur;  // on modifie valMax
  if (valeur<valmin) // on compare avec valMin
    valmin=valeur;  // on modifie valMin
int pourcentage=map(valeur,valmin,valmax,0,100); //pourcentage entre les bornes
  //Séquence d'affichage
  Serial.print("Valeur : ");
  Serial.print(valmin);
  Serial.print(" < ");
  Serial.print(valeur);
  Serial.print(" < ");
  Serial.print(valmax);
  Serial.print("  soit : ");
  Serial.print(pourcentage);
  Serial.println(" %");
}

void capteurled()
{
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur

if (valeur=analogRead(pincapteur)== (0, 500) )              // Valeur Min
 {
    digitalWrite(pinLed,HIGH);                        // on allume la LED emplacement 7
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,LOW);
  }
else if (valeur=analogRead(pincapteur)== (505, 507) )     // Valeur Moy
{
    digitalWrite(pinLed,LOW);                  
    digitalWrite(pinLed1,HIGH);                     // on allume la LED emplacement 8
    digitalWrite(pinLed2,LOW);
  }  
else if (valeur=analogRead(pincapteur)== (1023, 515) )     // Valeur Max
{
    digitalWrite(pinLed,LOW);                  
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,HIGH);                    // on allume la LED emplacement 9
  }
}

void pontH()  
{
digitalWrite(pinAC,LOW);
digitalWrite(pinBD,LOW);
delay (2000);

digitalWrite(pinAC,HIGH);
digitalWrite(pinBD,LOW);
delay (2000);

digitalWrite(pinAC,LOW);
digitalWrite(pinBD,HIGH);
delay (2000);
}


Sachant que après réflexion je vais sûrement utiliser un pont en H vu que je dois aussi de temps en temps alimenter ma self en négatif (-5V/+5V) donc j'aimerais vos avis là dessus, je vais aussi montrer un schéma électrique pour que vous puissiez me dire si cela va fonctionner correctement.

La partie du relais n'étant pas mise vu que j'étais parti sur un pont en H quelque heure après mon poste mais voilà se que j'avais mis avant :
Code: [Select]
const int RELAIS = 12;

boolean etatRelais = 0; // Etat du relais (on / off)

void setup()   {
  pinMode(RELAIS, OUTPUT);
}


void loop(){

   etatRelais=!etatRelais;
   digitalWrite(RELAIS,etatRelais);
   delay (3000);
}


Je vous laisse télécharger les 2 fichiers.

Merci pour votre aide.

dbrion06

La construction
Code: [Select]

if (valeur=analogRead(pincapteur)== (0, 500) )              // Valeur Min
 {

est vraiment bizarre
un construction plus classique, du genre:
valeur=analogRead(pincapteur);
if ((valeur >=0) && (valeur <= 500))
ou
Code: [Select]

valeur=analogRead(pincapteur);
switch (valeur){
  case 0 ...  500 : ...
}
(cette dernière, avec des intervalles pour le case, n'est pas standard mais très lisible https://www.geeksforgeeks.org/using-range-switch-case-cc/

Hikashiro

#4
Jun 13, 2019, 09:42 am Last Edit: Jun 13, 2019, 09:44 am by Hikashiro
Bonjour dbrion06,

Merci pour m'avoir fais la remarque et guider pour cela car justement j'essayais de trouver une autre alternative mais j'avais vu cette façon sur le net mais il faut croire que j'avais du mal m'y prendre (certainement trop d'espace) puisque celle-ci n'avais pas bien fonctionner. Je viens de réessayer et c'est mieux maintenant il me prend vraiment les valeurs qui sont comprises dedans et non la dernière.

Merci bien :)

Hikashiro

#5
Jun 13, 2019, 11:29 am Last Edit: Jun 13, 2019, 11:31 am by Hikashiro
A mon avis, mon histoire d'utiliser un pont en H je vais vite l'oublier. Je pense que au final mettre 2 relais pour faire du courant négatif serais plus facile mais comment câbler cela ? J'ai beau chercher je ne trouve rien qui correspond à un minimum à se que je recherche c'est à dire alimenter ma bobine via 2 relais qui change d'état pour pouvoir alimenter la bobine en -5V/+5V.

Serait-il possible de me guider ?

fdufnews

Un pont ferait très bien l'affaire autrement tu peux utiliser un second relais pour faire un inverseur.

Hikashiro

#7
Jun 13, 2019, 04:04 pm Last Edit: Jun 13, 2019, 04:26 pm by Hikashiro
Du coup j'ai choisi de prendre 2 relais, l'un me sers pour le nord, qui envoie du +5V et l'autre me sers pour le sud mais justement j'ai un problème sur lui alors je ne sais pas si c'est mon code vu que je l'ai modifié pas mal aujourd'hui ou sois mes câblages sont tout simplement mauvais.

Code: [Select]
int pincapteur=A0;

const int pinLed=7;
const int pinLed1=8;
const int pinLed2=9;

const int LEDB=10;
const int bouton=11;
int etatbouton=0;

const int RELAIS = 6;
const int RELAIS2 = 5;
//boolean etatRelais = 0;
//boolean etatRelais2 = 0;

void setup()
{
Serial.begin(9600);

pinMode(LEDB,OUTPUT);      
pinMode(bouton,INPUT_PULLUP);

pinMode(pinLed,OUTPUT);
pinMode(pinLed1,OUTPUT);
pinMode(pinLed2,OUTPUT);

pinMode(RELAIS,OUTPUT);
pinMode(RELAIS2,OUTPUT);
}

void loop()
{
  boutonled();
  valeurcapteur();
  capteurled();
  }

void boutonled()
{  
etatbouton = digitalRead(bouton);
  if (etatbouton == HIGH)
  {    
    digitalWrite(LEDB,LOW);  
  }
  else
  {
    digitalWrite(LEDB,HIGH);
  }
}

void valeurcapteur()
{
      // Moniteur série pour vérifier valeur
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur
  Serial.print("Valeur Capteur : ");
  Serial.print(valeur);
  Serial.println();
  delay(1000);
  if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
  Serial.println("Test centre OK");
  digitalWrite(RELAIS,LOW);
  digitalWrite(RELAIS2,HIGH);
}
else if ((valeur >=0) && (valeur <= 501))              // Valeur Min
{
  Serial.println("Test NORD OK");
  digitalWrite(RELAIS,HIGH);
  digitalWrite(RELAIS2,LOW);
}

else if ((valeur >=515) && (valeur <= 1023))
{
  Serial.println("Test SUD OK");
  digitalWrite(RELAIS,LOW);
  digitalWrite(RELAIS2,LOW);
}
}

void capteurled()
{
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur

if ((valeur >=0) && (valeur <= 501))              // Valeur Min
 {
    digitalWrite(pinLed,HIGH);                        // on allume la LED emplacement 7
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,LOW);
  }
else if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
    digitalWrite(pinLed,LOW);                  
    digitalWrite(pinLed1,HIGH);                     // on allume la LED emplacement 8
    digitalWrite(pinLed2,LOW);
  }  
else if ((valeur >=515) && (valeur <= 1023))     // Valeur Max
{
    digitalWrite(pinLed,LOW);                  
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,HIGH);                    // on allume la LED emplacement 9
  }
}


J'ai fais un petit schéma de mon arduino uno avec mes relais relier avec l'arduino et le branchement avec la bobine sachant que se n'est pas une pile de 9V que j'utilise mais plutôt une alimentation externe que j'ai mis en Série pour avoir +5V/-5V.

Merci encore pour vos réponses et votre aide :)

fdufnews

#8
Jun 14, 2019, 08:45 am Last Edit: Jun 14, 2019, 08:47 am by fdufnews
Je ne te cacherais pas que j'ai renoncé à interpréter ton "schéma". C'est complètement illisible.
Voilà un schéma de câblage des relais que je te propose

Les 2 relais au repos ou actifs le moteur est arrêté
Un relais actif l'autre au repos le moteur tourne dans un sens. Avec la combinaison inverse le moteur tourne dans l'autre sens.

Hikashiro

Oui désolé ce n'était pas trop propre ^^"

J'ai réussi à faire autrement et à faire fonctionner sauf que maintenant mon prof aimerais que cela fonctionne comme une sorte de banc de test il dis que cela va nous préparer pour l'an prochain.

Je voudrais rajouter en plus comme quoi si mes 3 test sont OK alors une LED verte pour dire test OK pour tout s'allume et une LED rouge si il y a une erreur et là je bloque un peu au niveau du code ^^"

voilà actuellement mon code
Code: [Select]
int pincapteur=A0;

const int pinLed=7;
const int pinLed1=8;
const int pinLed2=9;

const int LEDB=10;
const int bouton=11;
int etatbouton=0;

const int RELAIS = 6;
const int RELAIS2 = 5;
boolean etatRelais = 0;
boolean etatRelais2 = 0;

void setup()
{
Serial.begin(9600);

pinMode(LEDB,OUTPUT);     
pinMode(bouton,INPUT_PULLUP);

pinMode(pinLed,OUTPUT);
pinMode(pinLed1,OUTPUT);
pinMode(pinLed2,OUTPUT);

pinMode(RELAIS,OUTPUT);
pinMode(RELAIS2,OUTPUT);
}

void loop()
{
  boutonled();
  valeurcapteur();
  capteurled();
  }

void boutonled()

etatbouton = digitalRead(bouton);
  if (etatbouton == HIGH)
  {     
    digitalWrite(LEDB,LOW); 
  }
  else
  {
    digitalWrite(LEDB,HIGH);
  }
}

void valeurcapteur()
{
      // Moniteur série pour vérifier valeur
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur
  Serial.print("Valeur Capteur : ");
  Serial.print(valeur);
  Serial.println();
  delay(1000);
  if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
  Serial.println("Test centre OK");
  etatRelais=!etatRelais;
  digitalWrite(RELAIS,!etatRelais);
  digitalWrite(RELAIS2,etatRelais2);
}
else if ((valeur >=0) && (valeur <= 501))              // Valeur Min
{
  Serial.println("Test NORD OK");
  digitalWrite(RELAIS,etatRelais);
  etatRelais2=!etatRelais2;
  digitalWrite(RELAIS2,!etatRelais2);
}

else if ((valeur >=515) && (valeur <= 1023))
{
  Serial.println("Test SUD OK");
  digitalWrite(RELAIS,etatRelais);
  digitalWrite(RELAIS2,etatRelais2);
}
}

void capteurled()
{
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur

if ((valeur >=0) && (valeur <= 501))              // Valeur Min
 {
    digitalWrite(pinLed,HIGH);                        // on allume la LED emplacement 7
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,LOW);
  }
else if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
    digitalWrite(pinLed,LOW);                   
    digitalWrite(pinLed1,HIGH);                     // on allume la LED emplacement 8
    digitalWrite(pinLed2,LOW);
  } 
else if ((valeur >=515) && (valeur <= 1023))     // Valeur Max
{
    digitalWrite(pinLed,LOW);                 
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,HIGH);                    // on allume la LED emplacement 9
  }
}


Merci pour votre aide

J-M-L

#10
Jun 14, 2019, 01:25 pm Last Edit: Jun 14, 2019, 01:34 pm by J-M-L
Sur le point
Code: [Select]

if (valeur=analogRead(pincapteur)== (0, 500) )              // Valeur Min
 {


Merci pour m'avoir fais la remarque et guider pour cela car justement j'essayais de trouver une autre alternative mais j'avais vu cette façon sur le net mais il faut croire que j'avais du mal m'y prendre (certainement trop d'espace) puisque celle-ci n'avais pas bien fonctionner.
Votre écriture ne voulait pas dire grand chose.

il y avait une affectation valeur= de la valeur de la formule à droite analogRead(pincapteur) == (0, 500) donc déjà comme on a un == ce qui arriverait dans valeur serait un booléen (vrai ou faux).

ensuite dans l'évaluation du test d'égalité on irait bien chercher la valeur analogique associée à pincapteur et que l'on comparerait à l'évaluation de l'expression (0, 500)

La virgule ainsi utilisée dit au compilo, évalue l'expression à gauche de la virgule, puis évalue celle à droite de la virgule et retourne comme valeur cette seconde évaluation.  ici on a des valeurs, donc rien vraiment à exécuter donc (0, 500) est évalué à 500.

donc c'est comme si on avait écrit:
Code: [Select]
valeur = (analogRead(pincapteur) == 500)
donc en français, valeur sera vrai si la mesure analogique de la pin pincapteur donne 500. Dans ce cas valeur vaudra true (donc 1) sinon elle vaudra false (donc 0)

ce n'est donc certainement pas ce que vous vouliez faire... je ne sais pas trop où vous avez vu cette notation...

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Hikashiro

D'accord merci pour l'explication plus technique qui me fais vraiment mieux comprendre mon erreur.

Et j'avais trouvé cette solution là sur un forum qui parlais du langage C pour pouvoir mettre des nombres en "fourchette" mais il semblerais que j'ai sois du mal interpréter se que la personne expliquais ou sois c'était faux.

En tout cas merci pour votre explication :)
 
(Si vous avez des idées ou une explication qui pourrais m'aider dans mon dernier poste je suis preneur merci bien )

J-M-L

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)


--> moi je ré-écrirais tout sous cette forme :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Hikashiro

#13
Jun 14, 2019, 01:45 pm Last Edit: Jun 14, 2019, 01:59 pm by Hikashiro
D'accord je vais aller voir ton tuto merci pour ton temps et ton aide.


J'ai réussi à faire que quand j'appuie sur mon bouton le programme se lance mais le seul problème est que si je lâche le bouton le programme s'arrête ^^"

Avez vous une solution ?

Code: [Select]
int pincapteur=A0;

const int pinLed=7;
const int pinLed1=8;
const int pinLed2=9;

const int LEDB=10;
const int bouton=11;
int etatbouton=0;

const int RELAIS = 6;
const int RELAIS2 = 5;
boolean etatRelais = 0;
boolean etatRelais2 = 0;

void setup()
{
Serial.begin(9600);

pinMode(LEDB,OUTPUT);     
pinMode(bouton,INPUT_PULLUP);

pinMode(pinLed,OUTPUT);
pinMode(pinLed1,OUTPUT);
pinMode(pinLed2,OUTPUT);

pinMode(RELAIS,OUTPUT);
pinMode(RELAIS2,OUTPUT);
}

void loop()
{
  valeurcapteur();
  capteurled();
  }

void valeurcapteur()
{
  etatbouton = digitalRead(bouton);
  if (etatbouton == LOW)
  {
      // Moniteur série pour vérifier valeur
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur
  Serial.print("Valeur Capteur : ");
  Serial.print(valeur);
  Serial.println();
  delay(1000);
  if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
  Serial.println("Test centre OK");
  etatRelais=!etatRelais;
  digitalWrite(RELAIS,!etatRelais);
  digitalWrite(RELAIS2,etatRelais2);
}
else if ((valeur >=0) && (valeur <= 501))              // Valeur Min
{
  Serial.println("Test NORD OK");
  digitalWrite(RELAIS,etatRelais);
  etatRelais2=!etatRelais2;
  digitalWrite(RELAIS2,!etatRelais2);
}

else if ((valeur >=515) && (valeur <= 1023))
{
  Serial.println("Test SUD OK");
  digitalWrite(RELAIS,etatRelais);
  digitalWrite(RELAIS2,etatRelais2);
}
}
else (etatbouton == HIGH);
{
  digitalWrite(LEDB,HIGH);
}
}
void capteurled()
{
int valeur=analogRead(pincapteur); // on lit la valeur transmise par le capteur

if ((valeur >=0) && (valeur <= 501))              // Valeur Min
 {
    digitalWrite(pinLed,HIGH);                        // on allume la LED emplacement 7
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,LOW);
  }
else if ((valeur >=502) && (valeur <= 514))   // Valeur Moy
{
    digitalWrite(pinLed,LOW);                   
    digitalWrite(pinLed1,HIGH);                     // on allume la LED emplacement 8
    digitalWrite(pinLed2,LOW);
  } 
else if ((valeur >=515) && (valeur <= 1023))     // Valeur Max
{
    digitalWrite(pinLed,LOW);                 
    digitalWrite(pinLed1,LOW);
    digitalWrite(pinLed2,HIGH);                    // on allume la LED emplacement 9
  }
}

J-M-L

la solution n'est pas de traquer la position des boutons mais les transitions et ce que ça veut dire... et plus vous rajouterez de contraintes plus votre code avec cette approche sera compliquée...

C'est ce que fait une machine à état plus simplement

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up