Comment faire pour que mon moteur s'arrête de tourner lorsque j'arrête d'appuyer sur la télécommande IR ?

Bonjour, je suis sur un projet de robot télécommandé télécommande IR. Jusque là tout s'est bien passé et j'arrive à activer le moteur mais malheureusement il se met en position on et ne cesse pas de tourner. J'aimerais qu'il ne tourne que lorsque j'appuie sur le bouton de la télécommande IR et qu'il s'arrête de tourner lorsque j'arrête d'appuyer. Après avoir tout essayé, je m'en remet à vous. Mon code est ci-dessous.
Merci d'avance de vos réponses,
Ethan

Code:

// Inclure la librairie Arduino-IRremote
// Sources : https://github.com/Arduino-IRremote/Arduino-IRremote
#include <IRremote.hpp>

// Numéro de la "pin" sur laquelle est connecté le capteur infrarouge.
#define IR_PIN 7


// Configure l'arduino.
void setup(){

  // Configure le port série.
  Serial.begin(9600);

  // Configure la librarie IRremote.
  IrReceiver.begin(IR_PIN, DISABLE_LED_FEEDBACK);

  pinMode(8, OUTPUT);
  
}

// Boucle
void loop(){

  // Si on a reçu un message.
  if (IrReceiver.decode()) {  

      // On recupère la trame reçue.
      const uint32_t trame = IrReceiver.decodedIRData.decodedRawData;

      Serial.print("Trame = ");
      Serial.println(trame, HEX);
      
      // Affiche le bouton appuyé.
      boutonAppuye(trame);

      // On dit à la librairie que l'on est pret à recevoir le message suivant.
      IrReceiver.resume();
  }
  
}

// Affiche le bouton appuyé sur le port serie.
void boutonAppuye(uint32_t trame) {

  // On recupère l'identifiant de la telecommande.
  // Note: on recupère les 16 premiers bits de la trames sur 32 bits.
  const uint16_t identifiantTelecommande = (uint16_t) trame;

  // On recupère le code du bouton pressé.
  // Note: on recupère les 16 derniers bits de la trames sur 32 bits que l'on décale de 16 bits vers la droite.
  const uint16_t codeBouton = (uint16_t) (trame>>16);

  Serial.print("identifiantTelecommande = ");
  Serial.println(identifiantTelecommande, HEX);
  
  Serial.print("Code bouton = ");
  Serial.println(codeBouton, HEX);

  // Stocke le nombre de fois que l'on a reçu la valeur 0 (bouton maintenu) suite à l'appui sur un bouton.
  // Attention : variable statique, donc non remise à zero quand la fonction est appelée.
  static int boutonMaintenuCompteur = 0;

  // Si le code bouton est 0 (bouton maintenu).
  if(codeBouton == 0) {
    
    // Si ce n'est pas le premier message "bouton maintenu".
    if(boutonMaintenuCompteur > 0) {

      // Note : on ignore le premier message car il apparait presque à chaque appui.

      // On affiche "maintenu" sur le port série.
      Serial.println("maintenu");
      
    }

    // On incrémente le compteur.
    boutonMaintenuCompteur++;

    Serial.print("boutonMaintenuCompteur = ");
    Serial.println(boutonMaintenuCompteur, DEC);
    Serial.println("");

    // On arrête la fonction maintenant.
    return;
    
  }
  else {

    // On remet le compteur à 0;
    boutonMaintenuCompteur = 0;
    
    Serial.print("boutonMaintenuCompteur = ");
    Serial.println(boutonMaintenuCompteur, DEC);
     
  } 

  // Si c'est la télécommande arduino
  if(identifiantTelecommande == 0xFF00) {  

 
      // Switch basé sur le code du bouton.
      switch(codeBouton) {
    
        // Si le code bouton est 0xBA45
        case 0xBA45:
          digitalWrite(8, HIGH);
          break;
      }
    
   }

   Serial.println("");
   
}

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

Il ne me semble pas que tu appelle l'instruction pour arrêter ton moteur digitalWrite(8, LOW);?

Mais si je fais ça, il ne se mt même pas à tourner.

Non, je n'ai pas dis de remplacer de digitalWrite(8, HIGH) par un digital(8, LOW), mais que tu n'essaye pas de l'éteindre.

Il serait donc logique que tu place cette commande pour éteindre ton moteur dans le code qui correspond à l'arrêt de l'appuis d'après les commentaires que tu as utilisé.

Après j'ai quelque doute sur le fait que lorsque codeBouton vaut 0, c'est que le bouton est maintenu enfoncé?
Mais il faudrait au moins déjà avoir une cohérence.

Étant donné que les télécommandes consomment pas mal de courant, tes piles vont être rapidement à plat avec un fonctionnement comme celui-ci. Je te conseillerait plutôt d'avoir un bouton pour la mise en marche et un autre pour l'arrêt.
Je ne comprends pas très bien la logique de ta gestion de télécommande mais tu pourrais essayer cela.

Voir le même, un peu comme le play/pause du magnéto.

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