Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Le programme renvoie toujours pareil...

    4 mars 2015 à 15:47:34

    Bonjour,

    Aujourd'hui, je travaille sur un projet de lanceur de balles de ping pong automatique. Pour cela, j'ai 3 capteurs (Gauche, Milieu et Droite). Les trois capteurs sont branchés sur l'arduino aux ports respectifs A0,A1 et A2. Une LED d'alarme est sur le port 13.Le servo au port 9.

    J'ai donc fait le code suivant :

    //Les libraries
    #include <Servo.h>;
    
    //Les variables
    unsigned cap_g = A0;
    unsigned cap_m = A1;
    unsigned cap_d = A2;
    Servo servo_y;
    int port_servo=9;
    int valcap_g=230;
    int valcap_m=0;
    int valcap_d=230;
    int pos_choisie=0;
    int led=13;
    int pos_servo=0;
    
    
    //Boucle setup
    void setup (){
      servo_y.attach(9);
      servo_y.write(15);
      Serial.begin(9600);
    }
    
    void loop () {
      
      //CAPTEURS
      valcap_g=analogRead(cap_g);
      valcap_m=analogRead(cap_m);
      valcap_d=analogRead(cap_d);
      if (valcap_g<550 && valcap_g>190){ //Cap G allmué
        if (valcap_m<550 && valcap_m>190){ //Cap M allumé
          if (valcap_d<550 && valcap_d>190){ //Cap D allumé
            digitalWrite(led,HIGH); //BUG
          }
          else{
            pos_choisie = 3; //Cap D éteint
          }
        }
        else { //LIGNE 34
          if (valcap_d<550 && valcap_d>190){
            pos_choisie=2; //Cap M éteint
          }
          else {
            pos_choisie=random(2,4);
          }
        }
      }
      else{
        if (valcap_m<550 && valcap_m>190){ //Cap M allumé
          if (valcap_d<550 && valcap_d>190){ //Cap D allumé
            pos_choisie=1;
          }
          else{
            pos_choisie=random(1,4);
            while (pos_choisie==2){
              pos_choisie=random(1,4);
            }
          }
        }
        
        else {
          if (valcap_d<550 && valcap_d>190){
            pos_choisie=random(1,3);
          }
         }
        }
        
      //DEPLACEMENT PAR LE SERVO
      if (pos_choisie=1){
        servo_y.write(0);
      }
      if (pos_choisie=2){
        servo_y.write(15);
      }
      if (pos_choisie=3){
        servo_y.write(30);
      }
      
      //DEBEUGUAGE
      Serial.println(valcap_g);
      Serial.println(valcap_m);
      Serial.println(valcap_d);
      Serial.println(pos_choisie);
      
      //REMISE A ZERO
      pos_choisie=0;
      
      //DELAI
      delay(2000);
      
      
      
      }
      
    


    Ici se pose le problème: le code renvoie toujours "3" pour pos_choisie, même en faisant varier manuellement les valeurs des capteurs...

    Comment faire?

    -
    Edité par Follaf 4 mars 2015 à 15:48:21

    • Partager sur Facebook
    • Partager sur Twitter
      4 mars 2015 à 18:33:41

      bah il fait exactement ce que tu lui dis de faire.

      essaie déjà de faire les choses en 2 fonctions distinctes, à savoir des fonctions que tu vas coder à part, et appeler proprement dans la boucle loop: capture, bougerServo.

      donc tu auras au moins une fonction "capture", qui te retournera une position, sous une forme qui te plait. (perso j'aurais pris un int, ou un byte, et j'aurais mis 1 c'est gauche, 2 c'est milieu, 3 c'est droite, et tout le reste génère une erreur dans une fonction plus loin, et tout à la fin de la boucle je le réinitialiserais à 0). et j'essaierai à tout prix, vu le nombre de capteurs, de bricoler un truc pour avoir des if simples, voire un switch. 

      pour la fonction qui fait tourner le servo, pareil, une donnée en entrée, et un switch en fonction de cette donnée, c'est plus propre que des if then else empilés.

      question peut-être idiote, c'est quoi tes 3 capteurs? non parce que si ça se trouve y'a encore moyen de rendre encore plus facile le code, donc je pose les questions, tu m'en veux pas, hein?

      • Partager sur Facebook
      • Partager sur Twitter

      oui. non. enfin je regarde et je te dis.

        4 mars 2015 à 20:35:57

        if (pos_choisie=1){
            servo_y.write(0);
        }
        if (pos_choisie=2){
            servo_y.write(15);
        }
        if (pos_choisie=3){
            servo_y.write(30);
        }

        Je suis assez étonné que ton compilateur ne te sorte pas un warning ou une erreur sur ces 3 if.

        Attention à ne pas confondre l'affection (un seul égal) et la comparaison (deux égal) !

        • Partager sur Facebook
        • Partager sur Twitter
          4 mars 2015 à 22:50:23

          lorrio: ça sort pas d'erreur parce qu'en C++ c'est pas faux d'écrire ça, et même ça a un sens (débile, je te confirme, mais ça a un sens).
          • Partager sur Facebook
          • Partager sur Twitter

          oui. non. enfin je regarde et je te dis.

            4 mars 2015 à 23:12:00

            Oui, je sais que cela a un sens (je m'en sert d'ailleurs de temps en temps) ;)

            Mais tel que son code est actuellement, le compilateur devrait au moins générer un warning : warning: suggest parentheses around assignment used as truth value

            Et avec l'option -Werror, il devrait même refuser de compiler en générant une erreur.

            • Partager sur Facebook
            • Partager sur Twitter
              5 mars 2015 à 20:48:40

              y'a des configurations de compilateur dans l'éditeur arduino?
              • Partager sur Facebook
              • Partager sur Twitter

              oui. non. enfin je regarde et je te dis.

                5 mars 2015 à 21:24:53

                Bonne question :)

                Mais étant donné que l'éditeur arduino est vraiment le pire IDE que j'ai connu, j'en doute fort.

                • Partager sur Facebook
                • Partager sur Twitter
                  5 mars 2015 à 22:42:59

                  Je connais l'editeur d'arduino, c'est bien son genre de laisser passer ca sans broncher :lol:
                  • Partager sur Facebook
                  • Partager sur Twitter
                  YO ASK FO' IT !
                    6 mars 2015 à 6:56:53

                    dans le doute, j'ai testé, pour voir, et effectivement, le compilateur intégré à l'IDE arduino ne génère pas de warning (et encore moins d'erreur) pour ça, et le niveau de warning-error n'est pas réglable.

                    bref un bon IDE poubelle.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    oui. non. enfin je regarde et je te dis.

                      11 mars 2015 à 15:37:49

                      Merci à vous. Les erreurs ont été corrigées, le code fonctionne à peu près normalement sauf que maintenant, il s'agit de traiter le déplacement du servo.

                      Le code est maintenant le suivant:

                      //Les libraries
                      #include <Servo.h>;
                      
                      //Les variables
                      unsigned cap_g = A0;
                      unsigned cap_m = A1;
                      unsigned cap_d = A2;
                      Servo servo_y;
                      int port_servo=9;
                      int valcap_g=230;
                      int valcap_m=0;
                      int valcap_d=230;
                      int pos_choisie=0;
                      int led=13;
                      int pos_servo=0;
                      int pos=0;
                      
                      //Boucle setup
                      void setup (){
                        servo_y.attach(9);
                        servo_y.write(15);
                        Serial.begin(9600);
                      }
                      
                      void loop () {
                        /*
                        //CAPTEURS
                        //valcap_g=analogRead(cap_g);
                        //valcap_m=analogRead(cap_m);
                        //valcap_d=analogRead(cap_d);
                        if (valcap_g<550 && valcap_g>190 && valcap_m<550 && valcap_m>190 && valcap_d<550 && valcap_d>190){
                         digitalWrite(led,HIGH);
                        }
                        else if (valcap_g<550 && valcap_g>190 && valcap_m<550 && valcap_m>190){
                          pos_choisie=3;
                        }
                        else if (valcap_g<550 && valcap_g>190 && valcap_d<550 && valcap_d>190){
                          pos_choisie=2;
                        }
                        else if (valcap_m<550 && valcap_m>190 && valcap_d<550 && valcap_d>190){
                          pos_choisie=8;
                        }
                        else if (valcap_d<550 && valcap_d>190){
                          pos_choisie=4;
                        }
                        else if (valcap_g<550 && valcap_g>190){
                          pos_choisie=5;
                        }
                        else if (valcap_m<550 && valcap_m>190){
                          pos_choisie=6;
                          //while (pos_choisie==2){
                           // pos_choisie=random(1,4);
                          //}
                        }*/
                        pos_choisie=random(1,4);
                          
                          
                        //CONVERSION DES VARIABLES
                        if (pos_choisie==1){
                          pos=1;
                        }
                        else if (pos_choisie==2){
                          pos=15;
                        }
                        else if (pos_choisie==3){
                          pos=30;
                        }
                        
                        //DEPLACEMENT DU SERVO
                        while (pos_servo < pos){
                          pos_servo+=1; 
                          servo_y.write(pos_servo);
                          delay(15);
                        }
                        while (pos_servo > pos){
                          pos_servo-=1;
                          servo_y.write(pos_servo);
                          delay(15);
                        }
                         pos_servo=pos;
                         
                        //DEBEUGAGE
                        //Serial.println(valcap_g);
                        //Serial.println(valcap_m);
                        //Serial.println(valcap_d);
                        //Serial.println(pos_choisie);
                        //Serial.println(pos);
                        //Serial.println(pos_servo);
                        
                        //DELAI
                        delay(2000);
                        
                        //REMISE A ZERO
                        pos_choisie=0;
                        
                        }
                        


                      Le servo se décale de quelques degrés (une dizaine)  lorsqu'on passe de la position 3 à 2 ou de 2 à 3. Le problème, c'est qu'on a aucun mouvement lorsque la position 1 est choisie (s'il est sur la 3 et qu'il choisit 1, il se mets sur la 2), et on aimerait qu'il se décale de 15°. Problème résolu.


                      Cependant, un autre problème se présente... Lorsque tout est branché sur la carte Arduino (les capteurs et le servo), les capteurs donnent des valeurs complètement abérantes, et le servo ne bouge pas. Je suis sûr que les capteurs marchent ainsi que le servo. Cela peut-il venir du fait qu'on ait pas une alimentaion assez puissante ?

                      PS: désolé de répondre une semaine plus tard!

                      -
                      Edité par Follaf 11 mars 2015 à 17:23:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 mars 2015 à 10:11:15

                        follaffollaf a écrit:

                        Cependant, un autre problème se présente... Lorsque tout est branché sur la carte Arduino (les capteurs et le servo), les capteurs donnent des valeurs complètement abérantes, et le servo ne bouge pas. Je suis sûr que les capteurs marchent ainsi que le servo. Cela peut-il venir du fait qu'on ait pas une alimentaion assez puissante ?

                        Une alimentation insuffisante peut effectivement provoquer ce genre d'anomalie. Le mieux serait de mesurer la tension pour voir si ça baisse. Il faut aussi examiner les raccordements, qui peuvent aussi introduire des tensions parasites si ce n'est pas bien fait. Un petit schéma fidèle à la réalisation peut permettre de voir si tout semble monté correctement.

                        -
                        Edité par clgbzh 14 mars 2015 à 10:11:48

                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Arduino] Le programme renvoie toujours pareil...

                        × 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