Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ARDUINO] condition toujours valide ..

Sujet résolu
    28 mars 2015 à 16:42:44

    Salut :) , je viens vers vous car je ne comprend rien à ce qui m'arrive :(

    Avec ce code et un robot deux roues avec un detecteur distance Ultrason :

    Codeshare

    #include <AFMotor.h>
    
    AF_DCMotor Motor1(3);
    AF_DCMotor Motor2(4);
    
    int trig = 2; // déclare une variable de type 'int' appelée trig et valant 2
    int echo = A0; // déclare une variable de type 'int' appelée echo et valant 3
    long lecture_echo; //  Les variables de type long sont des variables de taille élargie pour le stockage de nombre entiers, sur 4 octets
    long cm; //  Les variables de type long sont des variables de taille élargie pour le stockage de nombre entiers, sur 4 octets
    
    void setup()  /*La fonction setup() est appelée au démarrage du programme. Cette fonction est utilisée pour initialiser les variables, le sens des broches, les librairies utilisées. 
    La fonction setup n'est exécutée qu'une seule fois, après chaque mise sous tension ou reset (réinitialisation) de la carte Arduino.
    */
    { 
      pinMode(7, OUTPUT);
      pinMode(trig, OUTPUT); /* Configure la broche Trig pour qu'elle se comporte en sortie. 
      broche: le numéro de la broche de la carte Arduino dont le mode de fonctionnement (entrée ou sortie) doit être défini.
      mode: soit INPUT (entrée) ou OUTPUT (sortie).
     */
      digitalWrite(trig, LOW); // Met un niveau logique , LOW (BAS) sur la broche ou est connecter Trig.
      pinMode(echo, INPUT);  // Configure la broche Echo pour qu'elle se comporte en entree.
      Serial.begin(9600);  // ouvre le port série et fixe le debit de communication à 9600 bauds.
    }
    
    void loop() /*Après avoir créé une fonction setup(), qui initialise et fixe les valeurs de démarrage du programme, la fonction loop () (boucle en anglais) fait exactement ce que son nom suggère 
    et s'exécute en boucle sans fin, permettant à votre programme de s'exécuter et de répondre. Utiliser cette fonction pour contrôler activement la carte Arduino.
    */
    { 
      digitalWrite(trig, HIGH); // Met un niveau logique , HIGH (HAUT) sur la broche ou est connecter Trig.
      delayMicroseconds(10); // Stoppe le programme pendant 10 microsecondes . Il y a 1000 microsecondes dans une milliseconde, et un million de microsecondes dans un seconde.
      digitalWrite(trig, LOW);  // Met un niveau logique , LOW (BAS) sur la broche ou est connecter Trig.
      lecture_echo = pulseIn(echo, HIGH); /*  Lit la durée de l'impulsion niveau HAUT appliquée sur la broche echo qui est configurée en ENTREE. 
      L'instruction pulseIn() attend que la broche passe à HAUT, commence alors le chronométrage, attend que la broche repasse au niveau BAS et stoppe alors le chronométrage. 
      L'instruction renvoie la durée de l'impulsion en microsecondes ( 1 millions de microsecondes par secondes). L'instruction s'arrête et renvoie 0 si aucune impulsion n'est survenue dans un temps spécifié.
     */
     
     cm = lecture_echo / 58; // Calcul la distance en cm
      Serial.print("Distance en cm : "); //Affiche les données de "Distance en cm" sur le port série.
      Serial.println(cm); // affiche un retour de chariot et un saut de ligne.
      if (cm > 20)
        {
          Motor1.setSpeed(255);                                                         ////
          Motor2.setSpeed(255);                                                         ////
          Motor1.run(BACKWARD);                                                          ////
          Motor2.run(BACKWARD);
        }
      
      delay(1000); //// Stoppe le programme pendant 1000 microsecondes . Il y a 1000 microsecondes dans une milliseconde, et un million de microsecondes dans un seconde.
    }

    Je pose le robot branché à l'ordi,

    il avance, c'est bien, mais il avance même quand (cm<20) :(

    Avec l'inverse, si je met

    if (cm < 20)
        {
          Motor1.setSpeed(255);                                                         ////
          Motor2.setSpeed(255);                                                         ////
          Motor1.run(BACKWARD);                                                          ////
          Motor2.run(BACKWARD);
        }

    Il ne bouge pas au début quand cm>20 mais dès que cm<20 il avance tout le temps même lorsque cm deviens supérieur à 20 o_O.

    Donc je ne vois pas, si l'erreur est dans le code, je suis sûr que c'est une faute toute bête :D

    Mais je vois rien là.

    Voilà si vous avez une idée je suis preneur merci d'avence :D !


    -
    Edité par Koyochi 28 mars 2015 à 16:48:35

    • Partager sur Facebook
    • Partager sur Twitter
    Je possède maintenant une signature
      28 mars 2015 à 17:09:19

      Bonjour,

      La vitesse est fixée à 255 une fois le seuil franchi, il n'y a aucune instruction pour changer cette valeur, auquel cas ça reste indéfiniment. Quand la condition n'est plus vrai il faut mettre une autre valeur de vitesse.

      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2015 à 17:34:37

        Ah oui , merci beaucoup ça marche :D , je n'avais pas compris que ça fonctionnait comme ça ^^

        -
        Edité par Koyochi 28 mars 2015 à 17:34:51

        • Partager sur Facebook
        • Partager sur Twitter
        Je possède maintenant une signature

        [ARDUINO] condition toujours valide ..

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown