Bouton poussoir et servo

Portrait de Fakoleon

Bonjour,

récemment j'ai été confronté a un problème qui a l'air très simple sur le papier, mais au final j'ai passé la nuit à essayer de le faire fonctionner..

J'ai connecté un bouton poussoir et un servo a mon Arduino, et l'action que je voudrai faire c'est "Appuier une fois", le servo fait un demi tour (servo.write(180); ), et quand je rappuis une nouvelle fois, le servo revient à sa position initial (servo.write(0);).

Le problème étant que quoi que je fasse, le servo va a  180 quand j'appui, et reviens a 0 des que je relache, ce que je voudrai c'est sauvegarder dans une variable l'état du servo indépendamment de l'état du bouton (low ou high).

 Mais j'ai un faible niveau en programmation, je suis sur que c'est facile à résoudre mais je n'ai pas trouvé d'exemple pour mon cas.

Ce que j'ai trouvé sur le net qui a l'air de fonctionner, c'est dans le cas d'une LED, ou on peut sauvegarder dans une variable l'état LOW ou HIGH de la LED, mais quand j'essaye d'appliquer ça avec l'état du servo en 0 ou 180, ça ne marche pas comme prévu.

Donc ce que je cherche à faire c'est:

- J'appui une fois sur le bouton poussoir, le servo va a 180.

- meme si je relache le bouton, le servo reste indéfiniment dans son état

- des que je rappui sur le bouton, le servo revient a 0 et ainsi de suite.

Je vais essayé d'autres solution en attendant, merci a ceux qui tenteront de m'aider !

Portrait de Nathan Garnier

Salut,

Alors moi j'ai une pequena idée si tu faisais un If pour savoir si il y a eu un appuie puis dans ce If tu en fais 2 autres (attention oh Ifception xD) qui regarde une variable que tu a défini avant genre un int etat = 0 et pi voila quoi en fonction de la variable tu fais qq'chose ou qq'chose d'autres

Portrait de Nathan Garnier

Sa ferait quelques chose comme : (j'évite les void etc je me concentre sur la partie traitement)

int etat = 0;

const int pin_btn = <broche de connexion>;

pinMode(pin_btn, INPUT);

If(pin_btn == HIGH){

If(etat == 0){

etat = 1;

...Autre truc a faire...

}

If(etat == 1){

etat = 0;

...Autre truc a faire...

}

}

Portrait de Fakoleon

Salut, merci pour ta réponse ça m'a bien aidé, j'ai réussi à faire ce que je voulais !

En l'état ton code faisait une boucle, j'avais essayé de bricoler avec des delay mais rien n'a faire, au finale j'ai trouvé la solution d'incrémenter la variable etat en 3 temps et la ça a marcher.

Le code complet pour les curieux:

#include<Servo.h>
Servo pince;

const int pinBouton = 10;
int etatBouton = 0;
int pinBoutonE = HIGH;

void setup() {
 
 pinMode(pinBouton, INPUT);
 pince.attach(8);
 Serial.begin(9600);
 
}

void loop() {

pinBoutonE = digitalRead(pinBouton);
Serial.println(pinBoutonE);

if(pinBoutonE == LOW){
 if(etatBouton == 0 || 1){
     pince.write(180);
     delay(200); // ce delay est necessaire sinon l'incrémentation est trop rapide
     etatBouton++;
}

if(etatBouton >= 2){
  pince.write(0);
  delay(500);
  etatBouton = 0;
}
}

}

Voila, je suppose que ce n'est pas très élégant comme solution sachant qu'un delay est nécessaire, mais ça marche, merci :)

Portrait de Nathan Garnier

Avec plaisir, et oui effectivement je n'avais pas penser au faite que sa aller tourné en boucle donc si tu veux tu peux mettre des While comme sa tant que ton bouton est appuyer ben tu fais ton truc puis tu fais plus rien tant que le bouton est appuyé, je ne sais pas si cela est bien optimisé mais il le sera toujours plus que les delay :D.