Fermeture intempestive

Bonjour,

Je débute dans la programmation et en récupérant des codes et en regardant des tutos, j'ai installé un système qui permet d'ouvrir ou fermer une porte coulissante en appuyant sur un bouton poussoir. Cela pilote un moteur avec une courroie qui entraine la porte.

Mon problème c'est que parfois la porte se ferme toute seule sans que j’appuie sur rien. J'ai des fins de course et un bouton poussoir et mon arduino est équipé d'un motor shield L298P.
Voici les pistes que j'essaye d'explorer pour comprendre le phénomène :

  • saturation de la mémoire de l'arduino ?
  • la longueur des fils entre l'arduino et les boutons présente des problèmes sur la tension lue
  • problème d'utilisation des entrées pull-up et pull-down
  • mon arduino est directement alimenter par le motorshield peut-être que ca présente un pb d'instabilité
  • le fait que les fin de course restent fermé pendant longtemps en fonction de la position ouverte ou fermé du coup ce ne sont pas vraiment des boutons poussoir
  • J'ai l'impression que ça ne peut venir que de la lecture de l'état du bouton poussoir

Voici le code,

// La broche numérique 4 est reliée au Bouton poussoir.
int Boutonp = 4 ;
// La broche numérique 7 est reliée a fin de course ouverte. 
int Fco = 7;
// La broche numérique 6 est reliée  a fin de course fermée.
int Fcf = 6;
// Déclaration variable EtatBouton qui va servir à stocker une valeur au format bool soit LOW ou HIGH.
boolean EtatBoutonp;
boolean EtatFco;
boolean EtatFcf;

void setup() {
  // Ouvre le port série à 9600 bps.
  Serial.begin(9600);
  // Faire de la broche du Bouton une entrée avec activation de la résistance de rappel interne de l'ARDUINO .
  pinMode(Boutonp, INPUT_PULLUP);
  pinMode(Fco, INPUT_PULLUP);
  pinMode(Fcf, INPUT_PULLUP);
  pinMode(12, OUTPUT); // Broche Arduino réservée pour le sens de rotation du moteur A
  pinMode(9, OUTPUT); // Broche Arduino réservée pour le freinage du moteur A
}

void loop() {
  // Lit les broches d'entrée
  EtatBoutonp = digitalRead(Boutonp);
  EtatFcf = digitalRead(Fcf);
  EtatFco = digitalRead(Fco);
  // Si EtatBoutonp == low
  if (EtatBoutonp == LOW && EtatFcf == LOW)
  {
         Serial.println("ouvrir");
     Ouvrir_porte();
  }
  // Sinon
  else if (EtatBoutonp == LOW && EtatFco == LOW)
  {
      Serial.println("fermer");
Fermer_porte();
  }
  //sinon si porte à moitié ouverte
else if (EtatBoutonp == LOW && EtatFco == HIGH && EtatFcf == HIGH)
{       Serial.println("ouvrir depuis milieu");
 Ouvrir_porte();
}
}

void Ouvrir_porte(){
  EtatFco = digitalRead(Fco);
 while ( EtatFco == HIGH){
	digitalWrite(12, LOW); // Le moteur A tourne dans le sens normal
	digitalWrite(9, LOW); // Désactivation du frein moteur A
	analogWrite(3,255 ); // Vitesse maximale pour le moteur A
    EtatFco = digitalRead(Fco);
 }
  Serial.println("fin ouverture");
    digitalWrite(12, LOW); // Le moteur A tourne dans le sens inverse
  digitalWrite(9, LOW); // Désactivation du frein moteur A
  analogWrite(3,0 ); // Vitesse maximale pour le moteur A
}
void Fermer_porte(){
  EtatFcf = digitalRead(Fcf);
while (EtatFcf == HIGH){
	digitalWrite(12, HIGH); // Le moteur A tourne dans le sens inverse
	digitalWrite(9, LOW); // Désactivation du frein moteur A
	analogWrite(3,255 ); // Vitesse maximale pour le moteur A
    EtatFcf = digitalRead(Fcf);
  }
  Serial.println("fin fermeture");
  digitalWrite(12, HIGH); // Le moteur A tourne dans le sens inverse
  digitalWrite(9, LOW); // Désactivation du frein moteur A
  analogWrite(3,0 ); // Vitesse maximale pour le moteur A
}

Voici une représentation du montage que j'ai modifié par rapport à la réalité pour pouvoir utiliser Tinkercad car je n'ai pas trouvé le L298P mais les modifications ne concerne que la partie du code liée au pilotage du moteur.
[URL="Login | Tinkercad"]Login | Tinkercad

Merci d'avoir lu jusque là ;-p

Bonjour,

Je ne connais pas le motor shield L298P.
Ce qui me semble bizarre :

  • après une fermeture ou une ouverture le moteur reste sur vitesse mini ? (pas d'arrêt )
  • Je ne comprends pas trop l'intérêt d'une ouverture et fermeture en 2 temps.
    (Tu n'as que des contacts de FC, un ralentissement est donc inutile ? ou alors, Il faudrait une tempo ?
    A priori, je comprends ce que tu as voulu faire en lisant ton programme. je ne vois rien de spécial.

Ton problème pourrait se situer sur la réalisation pratique. (le câblage), des mauvais contacts ou des parasites extérieurs par exemple captés par le câblage en volant ?

  • mettre des R de pull up 10K extérieures, ou et une capa de 100 nF
  • changer le BP ?
  • simplifier le montage et le programme pour essayer de localiser le problème par élimination ...
    (déconnecter le fil allant au BP ? pour voir la fréquence des déclenchements intempestifs)

voyez vous des messages dans la console lors des opération intempestives?
par exemple le

  Serial.println("fin fermeture");

Bonjour,
Merci pour ta réponse.
En effet je pourrais peut-être simplifier le code d'ouverture ou de fermeture.
Pour le R de pull up le fait d'écrire dans le code ```
pinMode(Boutonp, INPUT_PULLUP);

Pour la capacité je dois la mettre comment ?

Non c'est une bonne idée, je dois laisser l'arduino branché au PC pour observer les événements?

Je viens de me rendre compte que le motor shield alimente le VIN de l'arduino en 19.5V alors qu'il me semble que le VIN doit avoir une tension max de 12V. Est-ce que cela peut présenter un problème sur la lecture de la tension pull up ?

la tension recommandée si on alimente par VIN est entre 7 et 12V mais la carte tient jusqu'à 20V.. Vous jouez avec les limites là et le régulateur va être hyper sollicité, vous ne pourrez quasiment pas tirer de courant.

➜ alimentez donc votre Arduino en USB pour les test et ensuite avec de 7 à 9 V sur le jack.

Bonsoir,

  1. Tu n'as pas répondu clairement à J-M-L au post 3.

Voyez vous des messages dans la console lors des opération intempestives?
par exemple le Serial.println("fin fermeture");

  1. dans le cas d'un problème de câblage et de parasites captés. je précise :
  • les R Pull-up internes sont trop fortes.
  • Abaisser l'impédance en mettant une R de pull-up extérieure sur la pin d'entrée (de 10k)
  • mettre également une C (100 nF) en parallèle sur la R pull-up pourrait améliorer la situation.

MAIS avant cela, il faut déterminer la cause !
en faisant des tests et revoir le 1) par exemple.

  1. Je ne pense pas que le problème vienne de la tension moteur trop forte.
    Mais il est évident que l'alimentation doit respecter les possibilités du matériel.

Quelle est la fréquence des déclenchements intempestifs ?

Bonsoir,

Pour localiser un problème, plusieurs possibilités.
La plus simple :

  • insérer une ligne de code :

> Serial.println("tatata"); // permet de voir si le problème "passe" par là.

  • lire une variable du programme à un instant bien précis,

> Serial.print("var xyz = "); Serial.println(xyz); // permet de voir si la valeur est "normale".

De ces "mesures" on peut faire des déductions.

Bonjour,
Je ne suis pas chez moi cette semaine mais je vais mettre en place les surveillances pour identifier le PB.
Si je mets une résistance pour un pull up externe on est D accord qu il ne faut plus activer la fonction ?
Je vous tiens au courant.

A condition de câbler correctement. Pour bien faire il faut quand même appeler pinMode avec comme paramètre INPUT - meme si c’est souvent le comportement par défaut des cartes

Ensuite il faut s’assurer que tout le reste est alimenté correctement ….

Bref postez exactement le circuit et décrivez les alimentations. Sur le wokwi il n’y a pas de simulation électrique donc on peu se passer des alims ou cacher certains fils pour que ce soit plus simple. Ce n’est pas un schéma électrique

Ensuite bien sûr si votre bouton a plusieurs pôles dupliqués il faut s’assurer d’avoir choisi la bonne paire

Bonjour,

J'ai fait des tests avec un câblage plus court et en alimentant directement en 12V l'arduino et je n'ai pas eu de PB. Par contre quand j'ai rebranché l'arduino au montage initiale j'ai eu une fermeture au bout de 24h. Le pb c'est que je ne peut pas laisser mon PC branché en permanence pour voir l'état des sorties. Est-ce qu'il est possible d'avoir accès à un historique de l'état des sorties ?

En attendant je vais commander une résistance et une capacité.

voici mon schéma, les 2 boutons 3 positions simulent les fins de course. Par contre je m’aperçois que contrairement au schéma sur mon installation j'ai connecté le GND côté Power en bas et pas en haut du côté digital. Ca peut avoir une influence?

Serait-il possible de me donner une référence ou un lien pour la capacité de 100 nF ? je n'y connais pas grand chose.

Si vous les capturez et enregistrez

Merci, auriez-vous un tuto pour réaliser cette fonction ?

le code est simple - la loop traque les activations

ensuite il faut décider ce que vous voulez sauvegarder et où...

si vous vous la date et l'heure, il faut une RTC (si vous n'êtes pas connecté à internet)

si vous voulez stocker sur une carte SD, il en faut une...

et bien sûr le code associé

Bonjour,
J'ai pu observer le phénomène et j'ai bien la variable Boutonp qui change d'état toute seule et qui déclenche la fermeture de la porte.

J'ai modifié le câblage pour mettre en place des résistances de pullup de 10Ko, du coup j'ai aussi modifié le code en remplaçant INPUT_PULLUP par INTPUT.
Pour le moment je n'ai pas mis les capacités.

Ca semble fonctionner, mais je vais attendre car parfois les déclenchements intempestifs arrivent au bout de 2 jours.

Bonne journée

Bonjour,

J'ai finalement résolu le problème en codant et cablant le bouton poussoir en Pull-down à la place du pull-up.
Depuis plus de problème.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.