Servo + microswitch

Bonsoir tout le monde,
J’ai un petit projet en tête, mais j’ai un peu de mal pour la partie programmation.
En gros, je doit détecter le passage d’un objet avec un microswitch, puis activer un servomoteur pour qu’il face 180° dans un sens et revienne a ça position de départ (180° dans l’autre sens)
Voila mon programme pour l’instant :

const int bouton = 2;
#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // twelve servo objects can be created on most boards
 
int pos = 0; 
 
//variable qui enregistre l'état du bouton
int etatBouton;

void setup()
{
     myservo.attach(9);
    pinMode(bouton, INPUT); //le bouton est une entrée
    etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
}


void loop()
{
    etatBouton = digitalRead(bouton); //Rappel : bouton = 2
    
    if(etatBouton == LOW) //test si le bouton a un niveau logique BAS
    {
       { 
  for(pos = 0; pos <= 180; pos += 10) // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 
    }
    else  //test si le bouton a un niveau logique différent de HAUT (donc BAS)
    {
       
    }
}

La ou je coince, c’est pour indiquer a arduino que lorsqu’il détecte le bouton en LOW un court instant, il doit démarrer un processus, et ne pas s’arrêter même si l’interrupteur se remet en HIGH
Le code est un mélange de mes recherches sur internet.
En espérant que vous pourrez m’aider :slight_smile:

Bonsoir,
comment réagit le servo avec ce code? il devrait fonctionner comme demandé! il s’arrête si le bouton est relâché?

  • Lorsque le bouton est relâché, il ne se passe rien (normal), et
  • Lorsque qu'il est enfoncé un court instant et se relève, le moteur tourne un très court instant (d'un ou deux degrés à peine),
  • Et lorsqu'il est enfoncé, (LOW), il ne se passe rien,

En clair, le servo ne bouge (pas de la bonne manière) que lorsque le bouton se relève

teste ca

const int bouton = 2;
#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // twelve servo objects can be created on most boards
 
int pos = 0; 
 
//variable qui enregistre l'état du bouton
int etatBouton;

void setup()
{
     myservo.attach(9);
    pinMode(bouton, INPUT); //le bouton est une entrée
    etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
}


void loop()
{
    etatBouton = digitalRead(bouton); //Rappel : bouton = 2
    
    if(etatBouton == LOW) //test si le bouton a un niveau logique BAS
    {
      pos += 10;myservo.write(pos);
      while (pos > 0)
       { 
        for(pos = 10; pos <= 180; pos += 10) // goes from 0 degrees to 180 degrees 
           {                                  // in steps of 1 degree 
            myservo.write(pos);              // tell servo to go to position in variable 'pos' 
            delay(15);                       // waits 15ms for the servo to reach the position 
           } 
       for(pos = 180; pos>=0; pos-=10)     // goes from 180 degrees to 0 degrees 
          {                                
           myservo.write(pos);              // tell servo to go to position in variable 'pos' 
           delay(15);                       // waits 15ms for the servo to reach the position 
          } 
      } 
    }
    else  //test si le bouton a un niveau logique différent de HAUT (donc BAS)
    {
       
    }
}

Comment est câblé le bouton? Utilises le moniteur série pour suivre le déroulement du code :

const int bouton = 2;
#include <Servo.h> 

Servo myservo;  // create servo object to control a servo 
// twelve servo objects can be created on most boards

int pos = 0; 

//variable qui enregistre l'état du bouton
boolean etatBouton;

void setup()
{
  Serial.begin(9600);
  
  myservo.attach(9);
  myservo.write(0);              // tell servo to go to position init 

  pinMode(bouton, INPUT); //le bouton est une entrée
  //  etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"
  
  Serial.println("Setup... OK");
}

void loop()
{
  etatBouton = digitalRead(bouton); //Rappel : bouton = 2

  Serial.print("etatBouton = ");  
  Serial.println(etatBouton);

  if(etatBouton == LOW) //test si le bouton a un niveau logique BAS
  {
    Serial.print("etatBouton == LOW");
    for(pos = 0; pos <= 180; pos += 10) // goes from 0 degrees to 180 degrees 
    {                                  // in steps of 1 degree 
      myservo.write(pos);              // tell servo to go to position in variable 'pos' 
      Serial.print("position servo (0 à 180) = ");  
      Serial.println(pos);
      delay(15);                       // waits 15ms for the servo to reach the position 
    } 
    for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
    {                                
      myservo.write(pos);              // tell servo to go to position in variable 'pos' 
      Serial.print("position servo (180 à 0) = ");  
      Serial.println(pos);
      delay(15);                       // waits 15ms for the servo to reach the position 
    } 
  }
  else  //test si le bouton a un niveau logique différent de HAUT (donc BAS)
  {
    Serial.println("Pendant ce temps là... ");
    delay(50);  
  }
}

Je viens de tester les deux programmes, avec deux servo différents, et toujours le même problème;
Pour ce qui est du câblage du bouton, le GND arrive sur le COM, et ça repart du NO jusqu'a la pin2 ET 5V (j'ai suivi un montage trouvé sur internet)
Sur le site que j'ai vu ils conseillait de mettre un condensateur de 10nF et une résistance à l'entrée de l'interrupteur, ce que je n'ai pas fait.
Le moniteur série m'indique l'état du bouton a 1 tant que je ne le touche pas, puis après un appuis il se stoppe.

BONNE NOUVELLE!!
Je viens de rajouter la résistance et ça fonctionne!!
Merci beaucoup de votre aide ça fait plaisir de se sentir soutenu :slight_smile:

:o GND pin 2 et 5V !! lors d'un appuis sur le bouton ça ferrait pas un court circuit!?
Branche uniquement GND --- Bouton --- Pin 2 et utilise :

pinMode(bouton, INPUT_PULLUP);

[edit] oui, ou ajoute la résistance !

Par contre, comment on marque le topic en résolut, parce que dans le règlement ils disent d'utiliser un tag, mais comment?

édite ton premier post et modifie le titre :wink: