Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 45

Bouton poussoir



  1. #1
    Tranber72

    Bouton poussoir


    ------

    Bonjour à tous

    J'ai un moteur CC relié à une motor shield arduino et je cherche à faire en sorte que le bouton poussoir stoppe le moteur (actionné par un joystick) mais seulement pendant 3 secondes. Autrement dit, si le bouton est appuyé pendant plus de 3 secondes son action s'annule (et l'action du joystick sur le moteur peut avoir lieu)
    Quelle fonction puis-je utiliser ?

    Merci

    -----

  2. Publicité
  3. #2
    f6bes

    Re : Bouton poussoir

    Bsr àtoi,
    Hum est comment comptes tu t'y prendre pendant le lap de temps des 3 secondes .
    Donc tu appuies ...ça s'arréte durant 3 secondes ( forcément) et ENSUITE l'action reprends.

    Bonne soirée

  4. #3
    Yoruk

    Re : Bouton poussoir

    Une interruption, avec un délai à l'intérieur ?
    La robotique, c'est fantastique !

  5. #4
    Tranber72

    Re : Bouton poussoir

    Salut,

    Merci pour ta réponse rapide :

    En fait le bouton poussoir fonctionne comme un interrupteur de fin de course. Je veux pouvoir repartir dans l'autre sens avec mon moteur donc j'aimerais faire en sorte que lorsque le bouton poussoir est appuyé il ne bloque pas le moteur et le joystick pendant une durée infinie.

    Merci

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    Tranber72

    Re : Bouton poussoir

    Voici mon code de base actuel (sans le joystick)

    Merci pour votre aide

    Code:
    const byte PIN_VITESSE_MOTEUR_A = 3;
    const byte PIN_SENS_MOTEUR_A    = 12;
    const byte PIN_FREIN_MOTEUR_A   = 9;
    
    // la valeur entre 0 et 1023 déduite de la position du potentiomètre
     
    int sensorValue=0; 
     
    // la valeur entre 0 et 255 que l'on va utiliser pour régler la vitesse du moteur
     
    int outputValue=0; 
    
    void setup() {
    
      Serial.begin(115200); 
    
      pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
    
      pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_SENS_MOTEUR_A, LOW); 
      
    }  
     
     
    void loop() {
       
       // lire la valeur en entrée de la Pin A0
        
       sensorValue = analogRead(A4);
        
        // conversion de la valeur sensorvalue (qui va de 0 à 1023)
       // en une valeur entre 0 et 255 outputvalue
        
       outputValue = map(sensorValue, 0, 1023, 0, 255);
        
       // outputvalue permet de controler la vitesse du moteur
        
      digitalWrite(PIN_VITESSE_MOTEUR_A, outputValue);
          digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
    
        
       delay(100);
    }

  9. #6
    Antoane
    Responsable technique

    Re : Bouton poussoir

    Bonjour,

    Tu peux faire qqch comme cela :
    Code:
    //Initialisation
    boulean bouton_ancien = 0 ; 
    
    [...]
    
    // A ajouter dans la main loop : 
    If (bouton == 1 AND bouton_ancien == 0)
    then 
              delay(3) ; % here we wait 3s
              bouton_ancien = 1 ;
    end
    If (bouton == 0 AND bouton_ancien == 1) % re-initialise
    then 
              bouton_ancien = 0 ;
    end
    Ce n'est pas du langage arduino, à toi de convertir
    Note que le système est bloqué pendant les 3s secondes d'attente en raison de l'utilisation d'un delay(). Tu peux t'en affranchir en le remplacant par la fonction millis() de l'arduino http://arduino.cc/en/reference/millis
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  10. Publicité
  11. #7
    Tranber72

    Re : Bouton poussoir

    Merci pour ta réponse

    Je comprends pas à quoi correspond bouton_ancien et bouton dans ton code ?

  12. #8
    Yvan_Delaserge

    Re : Bouton poussoir

    Pour utiliser millis(), on pourrait insérer avant la loop:

    long duree;

    Et dans la loop:
    Code:
    void loop() {
       if (millis() > duree+3000) {
        //annuler la commande du bouton du joystick
        duree = millis();
      }
    }
    }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  13. #9
    Antoane
    Responsable technique

    Re : Bouton poussoir

    bouton_ancien est une variable booléenne temporaire.
    bouton désigne l'état de ton bouton-poussoir (1=appuyé).
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  14. #10
    Yvan_Delaserge

    Re : Bouton poussoir

    A quoi sert le Serial.begin(115200); ?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  15. #11
    Tranber72

    Re : Bouton poussoir

    Voici ce que j'ai écrit : le moteur s'arrête définitivement à l'appui du bouton

    Code:
      if (buttonState_1 == HIGH || buttonState_2 == HIGH) {   
        // Si le bouton est actif les moteurs sont éteints
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
       if (millis() > 3000) {
        //annuler la commande du bouton du joystick
           digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
          digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
      }
    }
          
      
      else { // Sinon, si le bouton n'est pas actif
    
       
       
          digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
          digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
    
        }  }

  16. #12
    Yvan_Delaserge

    Re : Bouton poussoir

    Si tu veux annuler la commande qu'envoie le bouton du joystick, il n'y a pas besoin de remettre les pins du frein à low?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  17. Publicité
  18. #13
    Yvan_Delaserge

    Re : Bouton poussoir

    Je verrais plutôt ça comme ça:
    Code:
    if (buttonStateNew == LOW && buttonStateOld == HIGH) {   
        // Si le bouton vient d'être activé, les moteurs sont éteints
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      //on regarde l'heure qu'il est et on la mémorise dans duree
      duree= millis();
    }
     
    if (millis() > (duree+3000)) {
        //annuler la commande du bouton du joystick
        digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
        digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
      }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  19. #14
    Tranber72

    Re : Bouton poussoir

    merci

    le programme me met ce message d'erreur

    Code:
    annexe_code.ino: In function 'void loop()':
    annexe_code:63: error: 'duree' was not declared in this scope
    annexe_code:66: error: 'duree' was not declared in this scope

  20. #15
    Yvan_Delaserge

    Re : Bouton poussoir

    Il faut insérer avant la loop:

    long duree;
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  21. #16
    Yvan_Delaserge

    Re : Bouton poussoir

    et par ailleurs je te propose encore quelques modifications:
    Code:
    if (buttonStateNew == LOW && buttonStateOld == HIGH) {   
        // Si le bouton vient d'être activé, on éteint le moteur A et on active les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      //on regarde l'heure qu'il est et on la mémorise dans duree
      duree= millis();
      //On met à jour l'état du bouton
      buttonStateOld = buttonStateNew; 
    }
     //si le bouton est activé depuis plus de 3 secondes
    if (buttonStateNew == LOW && buttonStateOld == LOW && millis() > (duree+3000)) {
        //annuler la commande du bouton du joystick. On réactive le moteur et on désactive les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
        digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
      }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  22. #17
    Yvan_Delaserge

    Re : Bouton poussoir

    Je me demande s'il ne manque pas des parenthèses:
    Code:
    if ((buttonStateNew == LOW) && (buttonStateOld == HIGH)) {   
        // Si le bouton vient d'être activé, on éteint le moteur A et on active les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      //on regarde l'heure qu'il est et on la mémorise dans duree
      duree= millis();
      //On met à jour l'état du bouton
      buttonStateOld = buttonStateNew; 
    }
     //si le bouton est activé depuis plus de 3 secondes
    if ((buttonStateNew == LOW) && (buttonStateOld == LOW) && (millis() > (duree+3000))) {
        //annuler la commande du bouton du joystick. On réactive le moteur et on désactive les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
        digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
      }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  23. #18
    Yvan_Delaserge

    Re : Bouton poussoir

    Voilà ton code complet. Il compile sans problème.
    Code:
    const byte PIN_VITESSE_MOTEUR_A = 3;
    const byte PIN_SENS_MOTEUR_A    = 12;
    const byte PIN_FREIN_MOTEUR_A   = 9;
    const byte PIN_VITESSE_MOTEUR_B = 11;
    const byte PIN_SENS_MOTEUR_B    = 13;
    const byte PIN_FREIN_MOTEUR_B   = 8;
    
    const byte PIN_JOYSTICK_X = A2;
    const byte PIN_JOYSTICK_Y = A3;
    const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre /!\
    
    
    
    
    // Variables "axe1Joystick" et "axe2Joystick": pas besoin d'avoir des variables globales
    
    
    void setup() {
    
      Serial.begin(115200); 
    
      pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
    
      pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);
    
      pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_SENS_MOTEUR_A, LOW); 
    
      pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_SENS_MOTEUR_B, LOW); 
    
      pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_FREIN_MOTEUR_A, LOW); 
    
      pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
    
      pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L'activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires.
    
    
    }
    long duree;
    void loop() {
    
      int joystickX = analogRead(PIN_JOYSTICK_X); 
      int joystickY = analogRead(PIN_JOYSTICK_Y);
      byte joystickZ = digitalRead(PIN_JOYSTICK_Z);
      byte joystickZold;
      if ((joystickZ == LOW) && (joystickZold == HIGH)) {   
        // Si le bouton vient d'être activé, on éteint le moteur A et on active les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
        digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);
        digitalWrite(PIN_SENS_MOTEUR_B, LOW);
        //on regarde l'heure qu'il est et on la mémorise dans duree
        duree= millis();
        //On met à jour l'état du bouton
        joystickZold = joystickZ; 
      }
      //si le bouton est activé depuis plus de 3 secondes
      if ((joystickZ == LOW) && (joystickZold == LOW) && (millis() > (duree+3000))) {
        //annuler la commande du bouton du joystick. On réactive le moteur et on désactive les freins A et B
        digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
        digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
      }
    
      if (joystickX > 700) {  
        // Si la valeur X est strictement supérieur à 700 le moteur A avance
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
      } 
    
      else if (joystickX < 300) {  
        // Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      } 
      else {
        // Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
      }
    
      if (joystickY > 700) {  
        // Si la valeur Y est strictement supérieur à 700 le moteur B avance
        digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
      } 
      else if (joystickY < 300) {   
        // Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
        digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_B, LOW);
      } 
      else {
        // Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
        digitalWrite(PIN_VITESSE_MOTEUR_B,LOW); 
      } 
    }
    Comme demandé, si le bouton du joystick (Z) est activé plus de 3 secondes, les 2 freins sont désactivés et les 2 moteurs se remettent en route, mais à vitesse maximale et dans la direction correspondant à HIGH sur les pins concernées..

    Pour bien faire, il faudrait mémoriser l'état des moteurs avant l'arrêt par le bouton du joystick et reprendre les mêmes valeurs.

    Mais je me demande quel et le sens de tout ceci. Le bouton Z du joystick n'est actif que si on presse dessus. Il a un ressort de rappel.

    Pourquoi un utilisateur presserait-il dessus pendant plus de 3 secondes? Et s'il le fait, c'est parce qu'il a une bonne raison de le faire. La dernière chose qu'il veut, c'est que tout le zinzin se remette en route tout seul au bout de 3 secondes, alors qu'il est toujours debout sur le frein.

    Enfin, c'est toi qui vois...
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  24. Publicité
  25. #19
    Yvan_Delaserge

    Re : Bouton poussoir

    A la réflexion, c'est mieux comme ça:
    Code:
    const byte PIN_VITESSE_MOTEUR_A = 3;
    const byte PIN_SENS_MOTEUR_A    = 12;
    const byte PIN_FREIN_MOTEUR_A   = 9;
    const byte PIN_VITESSE_MOTEUR_B = 11;
    const byte PIN_SENS_MOTEUR_B    = 13;
    const byte PIN_FREIN_MOTEUR_B   = 8;
    
    const byte PIN_JOYSTICK_X = A2;
    const byte PIN_JOYSTICK_Y = A3;
    const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre /!\
    
    
    
    
    // Variables "axe1Joystick" et "axe2Joystick": pas besoin d'avoir des variables globales
    
    
    void setup() {
    
      Serial.begin(115200); 
    
      pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
    
      pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);
    
      pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_SENS_MOTEUR_A, LOW); 
    
      pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_SENS_MOTEUR_B, LOW); 
    
      pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
      digitalWrite(PIN_FREIN_MOTEUR_A, LOW); 
    
      pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
      digitalWrite(PIN_FREIN_MOTEUR_B, LOW);
    
      pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L'activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires.
    
    
    }
    long duree;
    void loop() {
    
      int joystickX = analogRead(PIN_JOYSTICK_X); 
      int joystickY = analogRead(PIN_JOYSTICK_Y);
      byte joystickZ = digitalRead(PIN_JOYSTICK_Z);
      byte joystickZold;
      if ((joystickZ == LOW) && (joystickZold == HIGH)) {   
        // Si le bouton vient d'être activé, on éteint les moteurs et on active les freins 
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
        //on regarde l'heure qu'il est et on la mémorise dans duree
        duree= millis();
        //On met à jour l'état du bouton
        joystickZold = joystickZ; 
      }
      //si le bouton est activé depuis moins de 3 secondes
      if (millis() < (duree+3000)){
        //on éteint les moteurs et on active les freins
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
        digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      }
    
      if (joystickX > 700) {  
        // Si la valeur X est strictement supérieur à 700 le moteur A avance
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
      } 
    
      else if (joystickX < 300) {  
        // Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
        digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      } 
      else {
        // Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
        digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
      }
    
      if (joystickY > 700) {  
        // Si la valeur Y est strictement supérieur à 700 le moteur B avance
        digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_B, HIGH);
      } 
      else if (joystickY < 300) {   
        // Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
        digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_B, LOW);
      } 
      else {
        // Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
        digitalWrite(PIN_VITESSE_MOTEUR_B,LOW); 
      } 
    }
    Comme ça, une fois les 3 secondes écoulées, on reprend le fonctionnement normal, mais ma question reste posée: Quel intérêt?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  26. #20
    Tranber72

    Re : Bouton poussoir

    Bonjour Yvan,

    Merci pour toutes tes réponses et ton aide précieuses mais en fait cela n'a rien à voir avec le bouton de mon joystick. J'ai deux interrupteurs de fin de course aux extrémités de X qui sont enclenchés de manière permanente quand le moteur arrive en bout de course. Je souhaite donc pouvoir repartir dans l'autre sens au bout de 3 secondes malgré le fait que l'interrupteur soit encore enclenché. Je pense que ta proposition va m'aider je vais tester ça ce soir.

    Merci

  27. #21
    Tranber72

    Re : Bouton poussoir

    dans l'immédiat j'ai repris tes suggestions
    Code:
    void loop() {
      // lit l'état actuel du bouton poussoir et le mémorise dans la variable
      buttonState_1 = digitalRead(buttonPin_1);
      buttonState_2 = digitalRead(buttonPin_2);
      byte buttonold_1;
      byte buttonold_2;  
    long duree;
    
      if ((buttonState_1 == HIGH || buttonState_2 == HIGH) && (buttonold_1 == LOW || buttonold_2 == LOW)) {   
       // Si le bouton vient d'être activé, les moteurs sont éteints
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
          digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
      //on regarde l'heure qu'il est et on la mémorise dans duree
      duree= millis();
      //On met à jour l'état du bouton
        buttonold _1 = buttonState_1; 
        buttonold _2 = buttonState_2; 
    }
     
    if (millis() < (duree+3000)) {
        //annuler la commande du bouton 
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
          digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
        
      }
      }
    Qu'en penses tu ?

    Merci
    Dernière modification par Tranber72 ; 12/12/2014 à 12h49.

  28. #22
    Yvan_Delaserge

    Re : Bouton poussoir

    non, il faudrait plutôt

    if ((buttonState_1 == HIGH) & (buttonold_1 == LOW) | ( buttonState_2 == HIGH) & (buttonold_2 == LOW))

    si on considère qu'un bouton est activé lorsqu'il passe au niveau haut.

    si c'est des bytes, inutile de mettre 2 fois le &

    S'il faut non pas que ça s'arrête, mais que ça reparte DANS L'AUTRE SENS quand c'est arrivé en butée, il faudrait plutôt une machine à états, alors.

    On tourne un peu en rond je trouve. Il faudrait vraiment que tu expliques plus en détail ce que tu veux faire.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  29. #23
    Tranber72

    Re : Bouton poussoir

    ok merci j'essaye ça ce soir

    j'ai pas l'impression de tourner en rond. Désolé que ce soit le cas pour toi.

    Mon projet global, je l'avais expliqué ici http://forums.futura-sciences.com/el...uino-rev3.html
    et je pense que tu l'avais lu. Seulement, étant débutant j'avais bien compris qu'il fallait que j'y aille par étape. Donc là je travaille sur l'étape "interrupteurs de fin de course" et je pense que grâce à toi cela va être résolu et je t'en remercie

  30. #24
    Tranber72

    Re : Bouton poussoir

    Salut Yvan

    en essayant ce code, le moteur est ralenti par l'appui de l'interrupteur de fin de course.

    Merci de ton aide

  31. Publicité
  32. #25
    Tranber72

    Re : Bouton poussoir

    J'ai essayé ce code là en mettant au début : const int dureebouton = 3000;

    mais le bouton bloque indéfiniment le moteur

    Code:
    void loop() {
      // lit l'état actuel du bouton poussoir et le mémorise dans la variable
      buttonState_1 = digitalRead(buttonPin_1);
      buttonState_2 = digitalRead(buttonPin_2);
      byte buttonold_1;
      byte buttonold_2;  
    long duree;
     digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
          digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
    
     if ((buttonState_1 == HIGH || buttonState_2 == HIGH) && (buttonold_1 == LOW || buttonold_2 == LOW))  {   
       //on regarde l'heure qu'il est et on la mémorise dans duree
      duree= millis();
       // Si le bouton vient d'être activé, les moteurs sont éteints
        digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
          digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
        digitalWrite(PIN_SENS_MOTEUR_A, LOW);
        //On met à jour l'état du bouton
        buttonold_1 = buttonState_1; 
        buttonold_2 = buttonState_2; 
        }
     
     if ((millis()-duree) > dureebouton) {
        //annuler la commande du bouton 
        digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
          digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
        digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
        
      
    }
     
    
      }
    Dernière modification par Tranber72 ; 15/12/2014 à 10h39.

  33. #26
    Yvan_Delaserge

    Re : Bouton poussoir

    Résumons le cahier des charges:

    Tu as un joystick, muni de deux potentiomètres qui te permettent de contrôler un moteur chacun. Arrêt, marche avant ou marche arrière, à vitesse constante.
    Tu as un interrupteur qui s'actionne en appuyant verticalement sur le joystick. Tu l'utilises ou pas?

    Tu as deux contacts qui sont actionnés en fin de course: un pour chaque moteur.

    Pourquoi pas 2 contacts par moteur? Un dans chaque sens.

    Lorsque un contact de fin de course est actionné, tu veux qu'après 3 secondes d'arrêt, le moteur reparte, mais dans l'autre sens?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  34. #27
    Tranber72

    Re : Bouton poussoir

    L'interrupteur du joystick, je peux l'utiliser si nécessaire oui.

    Oui, il y deux interrupteurs de fin de course par moteur car il y a deux axes : un X et un Y. J'ai posté sur cette discussion un code simplifié pour d'abord faire marcher deux interrupteurs avec un moteur pour ensuite l'adapter à mon code général. Et dans ce code simplifié, je souhaite que le moteur reparte dans l'autre sens même si le bouton reste enclenché plus de trois secondes (dans le vrai ce serait si le joystick est actionné dans l'autre sens alors que le bouton est enclenché pendant plus de 3 secondes, le moteur peut repartir)

    Merci beaucoup

  35. #28
    Yvan_Delaserge

    Re : Bouton poussoir

    Citation Envoyé par Tranber72 Voir le message
    L'interrupteur du joystick, je peux l'utiliser si nécessaire oui.

    Oui, il y deux interrupteurs de fin de course par moteur car il y a deux axes : un X et un Y. J'ai posté sur cette discussion un code simplifié pour d'abord faire marcher deux interrupteurs avec un moteur pour ensuite l'adapter à mon code général. Et dans ce code simplifié, je souhaite que le moteur reparte dans l'autre sens même si le bouton reste enclenché plus de trois secondes (dans le vrai ce serait si le joystick est actionné dans l'autre sens alors que le bouton est enclenché pendant plus de 3 secondes, le moteur peut repartir)

    Merci beaucoup
    C'est pas clair. Si je joystick actionne le moteur en avant, et si le contact de fin de course vers l'avant est activé, le moteur continue à pousser contre la butée pendant 3 secondes, puis il inverse son sens de rotation, c'est-à-dire qu'il repart en arrière?
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  36. #29
    Tranber72

    Re : Bouton poussoir

    c'est pas le moteur qui appuie sur l'interrupteur mais l'objet mobilisé par le moteur. Je souhaite pouvoir réenclencher le moteur à l'aide du joystick au bout de 3 secondes si je veux repartir dans l'autre sens car sinon mon moteur est bloqué en permanence.

  37. #30
    Forcerouge

    Re : Bouton poussoir

    Il me semble que ce qu'il demande n'est pas tres complique, je vais m'incruster dans votre discussion et faire mon possible pour l'expliquer mieux qu'il ne le fait.

    Il a un joystick qui commande disons par exemple un un wagon sur un rail, qui peut aller a droite ou a gauche. Au bout de chaque rail il y a une butee et un interrupteur.
    L'objectif, c'est que le wagon s'arrete lorsqu'il arrive en butee, pour ne pas que le moteur continue betement de forcer si l'operateur continue a maintenir le joystick dans sa position. Donc une fois en butee gauche par exemple, celui ci s'arrete. Le wagon ne peut alors plus bouger que dans l'autre sens, c'est a dire repartir vers la droite, si et seulement si il en recoit l'ordre par l'operateur du joystick, autrement il reste a sa place en butee sans bouger.

    Le truc des trois secondes me semble inutile personnellement, suffit juste de ne plus prendre en compte les instructions de commande du joystick du cote bloquant a partir du moment ou le bidule se trouve etre en butee.

    En esperant que ca aidera a resoudre son souci.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Bouton Poussoir 1NO+1NF
    Par Mike12 dans le forum Technologies
    Réponses: 2
    Dernier message: 16/01/2014, 07h35
  2. bouton poussoir ?
    Par reptilee dans le forum Électronique
    Réponses: 19
    Dernier message: 08/07/2009, 21h34
  3. led + bouton poussoir
    Par invite9865321 dans le forum Électronique
    Réponses: 2
    Dernier message: 24/04/2008, 18h40
  4. bouton poussoir
    Par nanardo dans le forum Électronique
    Réponses: 1
    Dernier message: 02/04/2006, 22h55
  5. Bouton poussoir
    Par vincentx dans le forum Électronique
    Réponses: 4
    Dernier message: 23/06/2005, 14h37
Découvrez nos comparatifs produits sur l'informatique et les technologies.