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
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)
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);
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.
Voyez vous des messages dans la console lors des opération intempestives?
par exemple le Serial.println("fin fermeture");
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.
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 ?
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
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.
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.