Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème démarrage fonction dans condition

    24 janvier 2013 à 22:29:12

    Bonsoir à tous,

    j'ai démarré il y a quelques mois l'électronique avec l'excellent tuto du site et j'ai continué avec le site officiel ardiuno. Je découvre en se moment la manipulation des servomoteurs(j'en utilise actuellement 2). J'ai créé un petit programme histoire de voir si j'arrivais à appliquer mes connaissance.

    En gros voila l'explication du code :

    1° je dis grace quelle variable je veux modifieren choisissant grace à une lettre celle ci

    2° je donne la valeur de la variable (que je convertie en int)

    3° une fois la vitesse donné je lance une fonction qui fais tourner le servomoteur dans l'intervalle d'angle donné et à la vitesse choisi

    Voila en gros mon but.

    Maintenant les problèmes arrivent. J'ai écrit mon code avec juste quelques problèmes pour trouver comment bien convertir en nombre mais bon ça semble marcher en effet j'obtiens une bonne conversion d'après ce que j'ai pu essayer. Ma fonction pour faire tourner mon servomoteur marche aussi car j'ai pu l'utiliser avant tout le reste du programme.

    Mon plus gros problème est que lorsque je lance mon programme j'essaye de lancer des conditions  (0,0,180,15) déjà testé et marchant très bien (désolé pour toutes ces précision mais elles me semblent utile) , mais voila j'entre belle et bien dans la condition if (j==1), elle change bien ma valeur de j mais mon servomoteur ne tourne pas et ma fonction rotation ne semble pas se lancer .... étrange ou bien j'ai oublier un truc important.

    Second problème, pas embettant mais qui m'a pris quand même très longtemps à comprendre comment passer outre: j'entre n puis 0 (donc j'associe bien numServo à 0) puis quand je veux passer à i je ne doit pas taper seulement i mais un espace + i (' i') et je peux modifier la valeur de l'angle pour f je doit taper deux espaces +f ('  f') et pour s je doit taper trois espace +s ('   s') bon une fois qu'on le sais on s'y fait mais bon j'aimerais comprendre ou est mon erreur de programmation.

    Voila donc les deux problèmes que j'essaye de résoudre si quelqu'un a une idée car j'ai beau faire rien n'y fais.

    Merci d'avance bonne soirée

    #include <Servo.h>
    #define NBRESERVO   2
    
    
    Servo myservo[NBRESERVO];
    int pos = 0,i=0,numServo=0,j=0; 
    const int branche[6]={3,5,6,9,10,11};
    char donnee[20];
    int angleI=0, angleF=0, Speed=0;
    
    void setup() 
    { 
      Serial.begin(9600);
      Serial.println("Arguments: numServo  angleI  angleF  Speed");
      for(i=0;i<NBRESERVO;i+=1)  myservo[i].attach(branche[i]); 
      i=0;
    } 
     
    void loop() 
    { 
     if (Serial.available()>0)
     {
       if (i==0)
       {
         if (Serial.read()=='n') {i=1;Serial.println("numero servo");}
         else if (Serial.read()=='i') {i=2;Serial.println("angle initial");}
         else if (Serial.read()=='f') {i=3;Serial.println("angle final");}
         else if (Serial.read()=='s') {i=4;Serial.println("vitesse");}
       }
       else
       {
         if (i==1) {numServo=lireNombre();i=0;Serial.println(numServo);Serial.println("ok1");}
         else if (i==2) {angleI=lireNombre();i=0;Serial.println(angleI);Serial.println("ok2");}
         else if (i==3) {angleF=lireNombre();i=0;Serial.println(angleF);Serial.println("ok3");}
         else if (i==4) {Speed=lireNombre();i=0;j=1;Serial.println(Speed);Serial.println("ok4");}
       }
     }
    /*  Rotation(0,0, 180,15);
      Rotation(1,0, 180,15);
      Rotation(0,179, -1,15);
      Rotation(1,179, -1,15);*/
      if (j==1) {Rotation(numServo,angleI,angleF,Speed);j=0;}
      Serial.println(i);
      delay(1000);
    } 
    
    void Rotation(int numServo,int angleI, int angleF,int Speed)
    {
      if (angleI<angleF)
      {
        for(pos=angleI;pos<angleF;pos+=1)
        {
          myservo[numServo].write(pos);
          delay(Speed);
        }
       }
      if (angleI>angleF)
      {
        for(pos=angleI;pos>angleF;pos-=1)
        {
          myservo[numServo].write(pos);
          delay(Speed);
        }
      }   
    }
    int lireNombre()
    {
      int result;
      char Buffer[8];
      memset(Buffer, '\0', 9);
      int x=0;
      while (Serial.available()>0)
      {
        Buffer[x]=Serial.read();
        delay(10);
        x++;
      }
      result = atoi(Buffer);   
      Serial.print("recu    :");
      Serial.println(result); 
      return result;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2013 à 0:12:48

       Tu entre dans la condition, mais as-tu vérifié la valeur des paramètres ?

      Affiche les valeurs des arguments dans le if mais juste avant d'appeller la fonction Rotation avec ces mêmes arguments. 

      Sinon, petit conseil pour la lecture de ton code et faciliter la compréhension, évite les structure if en une seule ligne quand tu as plus d'une ligne de code à l'intérieur. C'est pour le if / else if.

      Autre conseil, mais c'est pas obligatoire, essaie de prévoir un else avec une instruction même "inutile" (genre ca affiche "rien" ou "toto") quand tu fais des if / else if notamment avec de la recéption de données, ca te permettra de savoir ce que fait ton programme quand aucune des conditions n'est remplie (ca évite le code mort). 
      • Partager sur Facebook
      • Partager sur Twitter
        30 janvier 2013 à 21:25:22

        Bonsoir merci pour ta réponse j'ai réessayer ce soir sans rien changer et maintenant le programme marche.... étrange mais ça fais plaisir

        Merci pour le conseil je vais réecrire un peu le code

        sinon je ne comprend toujours pas pourquoi je doit mettre des espace avant mes lettres si quelqu'un a une idée ...

        • Partager sur Facebook
        • Partager sur Twitter
          1 février 2013 à 8:19:50

          Salut,

          Je connais pas l'environnement Ardiuno, mais les compilateurs sont ce qu'ils sont, y en a des bons, y en a des moins bons. Avec Keil et realview (par exemple) il y a 2 boutons pour compiler ton program, 1 rapide, qui compile uniquement les fichiers que tu viens de changer et l'autre un plus lent qui recompile tout ton project.

          J'ai pris l'habitude de recomplier mon project entier a chaque changement car j'avais des situations pareils et pire encore. J'avais un bug, je le résolvais et il etait toujours la, et la je remodifiais car mon compilateur n'avait pas pris les changements que j'avais fait pour une raison que je n'explique pas.

          Certaines fois, si tu bosses depuis de longues heures le fait de fermer et recompiler vide la RAM de ton PC et ainsi quand tu compile tu n'as plus de probleme.

          Donc si tu debug, tu ne vois pas de probleme mais que ca ne fonctionne pas, "Rebuild all project" ou sauve et ouvre + compile.

          De plus, d'autre fois tu crois que tu n'as rien changer et en fait si, et sans faire attention.

          • Partager sur Facebook
          • Partager sur Twitter

          problème démarrage fonction dans condition

          × 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