Aller au contenu


Photo
- - - - -

Pan/tilt avec roborealm

arduino roborealm

  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 04 octobre 2014 - 03:17

Bonjour ! 

 

Je cherche à faire un suivi de mouvement avec roborealm. J'ai réussi à faire le suivi sur l'axe x, mais l'axe y me pose problème.

 

Roborealm me renvoie un "char" contenant les coordonnées x et y séparées par un ";", que je convertis en "int" avec la fonction "atoi". Le problème c'est comment lire séparément ces deux valeures? En cherchant je pense que la réponse est avec la fonction "strtok", mais je ne sais pas du tout comment m'y prendre, et j'ai du mal avec les tutos que j'ai trouvé..

Si vous savez je suis preneur ! Merci!



#2 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 10 octobre 2014 - 04:31

Bon ben je m'auto aide. En essayant et à coup de débogage j'ai trouvé.

Je poste ce que je pense avoir compris:

 

#include <string.h>    //j'utilise les librairies concernées.
#include <Servo.h>

Servo myservox;     //mes servomoteurs.
Servo myservoy;

 

char data[9]={           //roborealm me renvoie 9 caractères au maximum, et de type "char" (par exemple: -156;-102)
  0,0,0,0,0,0,0,0,0};

int incrx;                      //ensuite différentes variable que je vais utiliser...
int incry;

char *distancex;
char *distancey;
char *i;
int x;
int y;

int anglex = 90;
int angley = 90;
int k=0;

int sens=0;

 

void setup()//je mets en position initiale le pan/tilt.
{
  Serial.begin(9600);

  myservox.attach(53); 
  myservox.write(anglex);
  delay(500);
  myservoy.attach(50);
  myservoy.write(angley);

}

 

void loop()
{

 

  if(Serial.available()){       //verrification si roborealm envoie des octets
    while (k<9){                  //tant que j'ai pas tous les caractères
      data[k] = Serial.read();//je lis ce qu'il y a dans le buffer.
      k++;                            //et je place le caractère lu dans un data différent à chaque fois.
      delay(3);                     // le delay est important sinon ca fait nimp..

    }

 

    distancex = strtok_r(data,";",&i);       //je place ce qui est avant ";" dans mon "distancex". -156 si je reprends mon exemple.
    distancey = strtok_r(NULL,";",&i);     //je place ce qui est en dernier, juste après un ";" , dans distancey. -102 d'après mon exemple.
    x = atoi(distancex);                           //je convertie ces valeurs en variable int pour pouvoir les utiliser.
    y = atoi(distancey);

    k=0;                                                  //je remets la variable qui change de data à zéro pour la prochaine lecture de la loop.

    if(x<-159){                                        //et la c'est le programme qui pilote le pan/tilt... le plus important c'est ce qu'il y a au dessus.  
      //rien
    }
    else if (x>-159){
      incrx = map(abs(x), 0, 120, 1, 5);
      if(x < -10) {
        anglex= anglex-incrx;
        anglex=constrain(anglex, 0,180);
        myservox.write(anglex);
      }
      incrx = map(abs(x), 0, 120, 1, 5);

      if (x>10){
        anglex=anglex+incrx;
        anglex=constrain(anglex, 0, 180);
        myservox.write(anglex);
        {

        }
      }
    }

    if(y<-119){
      //rien
    }
    else if (y>-119){
      incry = map(abs(y), 0, 90, 1, 3);
      if(y < -10) {
        angley= angley+incry;
        angley=constrain(angley, 0,180);
        myservoy.write(angley);
      }
      incry = map(abs(y), 0, 90, 1, 3);

      if (y>10){
        angley=angley-incry;
        angley=constrain(angley, 0, 180);
        myservoy.write(angley);
        {

        }
      }
    }

 

  }
}

 

Voila, si ca peut aider quelqu'un!

Le programme fonctionne impecable.



#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 octobre 2014 - 12:04

Bon ben je m'auto aide. En essayant et à coup de débogage j'ai trouvé.

 

Le programme fonctionne impecable.

Bravo ! ;) 
à voir ton code je déduis que tu utilise une arduino ;) Info qui manquait pour qu'on t'aide =) 

 

ensuite juste au vu de comment tu alloue ta mémoire, par sécurité si j'étais toi je ferais : 

 

  distancex = strtok_r(data,";",&i);    

   x = atoi(distancex);                         
  distancey = strtok_r(NULL,";",&i);    
  y = atoi(distancey);

 

mais ce n'est qu'un détail ... 

 

Après il y a plusieurs façon de faire cela, tu aurais pu faire toi même une foction qui parcourt la chaine de caractère que tu reçoit et retourne, la llongueur de la chaine et la position du séparateur ...  

En tout cas maintenant que tu as un code qui fonctionne bien je te suggère de l'encapsuler dans des fonctions ! ;) 

Bon courage pour la suite !

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#4 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 11 octobre 2014 - 07:28

Bonsoir mike118,

 

c'est noté pour la mémoire! J'ai oublié de précisé surement parce que j'étais à fond dedans^^

Je n'ai pas très bien compris pour la fonction que je renvoie et retourne. Qu'est ce que tu entends par encapsuler dans une fonction? le mettre dans un "void tracking()" par exemple ?



#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 octobre 2014 - 10:19

Qu'est ce que tu entends par encapsuler dans une fonction? le mettre dans un "void tracking()" par exemple ?

Oui c'est exactement ça ;)  
ainsi tu pourra augmenter la complexité de ton code et épurer le contenu de ta loop ;)
Et une fois que tu as un groupe de fonctions "liées" et qui fonctionnent bien, personnellement je fais rapidement un nouveau .c et .h associé, car ensuite je peux facilement les inclure dans mes prochains projets ;) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 12 octobre 2014 - 02:21

D'accord! .c et .h cest pour faire une librairie? Tu t'y prends comment pour la créer?





Aussi étiqueté avec au moins un de ces mots-clés : arduino, roborealm

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users