Aller au contenu


Photo
- - - - -

Programmation Arduino-Processing


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

#1 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 13 juin 2012 - 06:59

Bonjour à toutes et à tous!

En fait je dois contrôler un servomoteur Futaba RS304MD de telle sorte qu'il fasse une rotation de X degrés. L'angle X dépend de la distance mesurée par un capteur IR qui peut détecter une objet entre 10 et 80 cm. Plus la distance mesurée est petite, plus l'angle de rotation est élevé. J'utilise une carte Arduino et des modules Xbee, je programme avec le logiciel Arduino en langage Processing. Initialement j'avais décidé d'utiliser les "short packets" pour la configuration des angles, mais après j'ai pensé qu'une fonction mathématique linéaire serait meilleure, telle que y = -0.706*x + 180 = angle de rotation, où x est la distance mesurée par le capteur.

Voici, ci dessous, mon programme. Mon problème est que le servomoteur ne tourne que d'un seul angle quelque soit la distance mesurée, alors qu'il devrait varier en fonction de la distance. Malgré plusieurs modifications je n'arrive pas à trouver l'erreur.

Y aurait-il des habitués d'Arduino ou de Processing qui pourraient m'aider ?

Merci d'avance!

********************************************************************************************

#include <Distance.h>

Distance myDistance = Distance(4);

// Torque ON Packet
byte trqOn[] = {0xFA, 0xAF, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x24};
// Motor rotates 0 degree(doesn't rotate)
byte cw0[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x02, 0x01, 0x00, 0x00, 0x1C};
// Random Rotate and Speed Packet
byte rrs[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};

void setup() {
  Serial.begin(115200);        // if the communication speed is 115200bps
  delay(500);
  Serial.write(trqOn,9);
}

void loop() {
    myDistance.available();
  
  int x = myDistance.numberOfDistance(); // x is the distance between the object and the robot
  int y = -7,06*x + 1800; // y correspond to the angle of rotation
  
  if ((x>=32)&&(x<=255)) // 10cm<x<80cm???
 	{
        delay(1000); //delay of 1s
        rrs[7]=lowByte(y);//Little Endian
        rrs[8]=highByte(y);//Little Endian
        calcCheckSum(rrs,12);
        Serial.write(rrs,12);

        delay(1000); //delay of 1s
        rrs[7]=lowByte(-y);//Little Endian
        rrs[8]=highByte(-y);//Little Endian
        calcCheckSum(rrs,12);
        Serial.write(rrs,12);
        
 	} else {
        delay(1000); // delay of 1s
        Serial.write(cw0,10); //Motor rotates 0 degree(doesn't rotate)
 	}
  
}

void calcCheckSum(byte pkt[], byte n) {    // Setting of the checksum
  int sum = 0;
  for(int i=2; i<n-1; i++){
    sum = sum ^ pkt[i];
  }
  pkt[n-1]=sum;
}


EDIT Modération : rajout des balises [ code][ /code]

#2 ashira

ashira

    Pilier du forum

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

Posté 13 juin 2012 - 07:28

Bonjour à toutes et à tous!

En fait je dois contrôler un servomoteur Futaba RS304MD de telle sorte qu'il fasse une rotation de X degrés. L'angle X dépend de la distance mesurée par un capteur IR qui peut détecter une objet entre 10 et 80 cm. Plus la distance mesurée est petite, plus l'angle de rotation est élevé. J'utilise une carte Arduino et des modules Xbee, je programme avec le logiciel Arduino en langage Processing. Initialement j'avais décidé d'utiliser les "short packets" pour la configuration des angles, mais après j'ai pensé qu'une fonction mathématique linéaire serait meilleure, telle que y = -0.706*x + 180 = angle de rotation, où x est la distance mesurée par le capteur.

Voici, ci dessous, mon programme. Mon problème est que le servomoteur ne tourne que d'un seul angle quelque soit la distance mesurée, alors qu'il devrait varier en fonction de la distance. Malgré plusieurs modifications je n'arrive pas à trouver l'erreur.

Y aurait-il des habitués d'Arduino ou de Processing qui pourraient m'aider ?

Merci d'avance!

********************************************************************************************

#include <Distance.h>

Distance myDistance = Distance(4);

// Torque ON Packet
byte trqOn[] = {0xFA, 0xAF, 0x01, 0x00, 0x24, 0x01, 0x01, 0x01, 0x24};
// Motor rotates 0 degree(doesn't rotate)
byte cw0[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x02, 0x01, 0x00, 0x00, 0x1C};
// Random Rotate and Speed Packet
byte rrs[] = {0xFA, 0xAF, 0x01, 0x00, 0x1E, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};

void setup() {
Serial.begin(115200); // if the communication speed is 115200bps
delay(500);
Serial.write(trqOn,9);
}

void loop() {
myDistance.available();

int x = myDistance.numberOfDistance(); // x is the distance between the object and the robot
int y = -7,06*x + 1800; // y correspond to the angle of rotation

if ((x>=32)&&(x<=255)) // 10cm<x<80cm???
{
delay(1000); //delay of 1s
rrs[7]=lowByte(y);//Little Endian
rrs[8]=highByte(y);//Little Endian
calcCheckSum(rrs,12);
Serial.write(rrs,12);

delay(1000); //delay of 1s
rrs[7]=lowByte(-y);//Little Endian
rrs[8]=highByte(-y);//Little Endian
calcCheckSum(rrs,12);
Serial.write(rrs,12);

} else {
delay(1000); // delay of 1s
Serial.write(cw0,10); //Motor rotates 0 degree(doesn't rotate)
}

}

void calcCheckSum(byte pkt[], byte n) { // Setting of the checksum
int sum = 0;
for(int i=2; i<n-1; i++){
sum = sum ^ pkt[i];
}
pkt[n-1]=sum;
}


Bonjour !
Je sais pas d'ou vient ton érreur, mais une autre solution de programme pourrait te convenir ?
Utilise la librairie Servo,tu pourras indiquer l'angle de ton servo (0 a 180). Ensuite, ton capteur renvoie une info comprise entre 0 et 1024 en fonction de la distance, donc utilise la fonction "map" pour réétalonner ( 0, 1024 -> 0, 180), et tu écris "servo".Write(x); et le tour et joué :)

#3 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 14 juin 2012 - 05:10

Bonjour !
Je sais pas d'ou vient ton érreur, mais une autre solution de programme pourrait te convenir ?
Utilise la librairie Servo,tu pourras indiquer l'angle de ton servo (0 a 180). Ensuite, ton capteur renvoie une info comprise entre 0 et 1024 en fonction de la distance, donc utilise la fonction "map" pour réétalonner ( 0, 1024 -> 0, 180), et tu écris "servo".Write(x); et le tour et joué :)


Merci Ashira pour ta reponse! :thank_you:

Est-ce que ce programme correspond a ce que tu viens d'expliquer? (j'ai finalement reduit l'angle a 70 degres car les 180 etaient trop grands ^^)

***********************************************************************************
#include <Distance.h>

#include <Servo.h> // inclut la librairie Servo

Distance myDistance = Distance(4);

Servo myservo;

void setup()
{
  myservo.attach(9); // attache le servomoteur à la broche 9
  myservo.write(0);  // positionne le servomoteur à 0° (position neutre)
}

void loop()

{  
  
  myDistance.available();
  
  int x = myDistance.numberOfDistance();
  int y = map(x, 0, 1023, -70, 70); // Ré-étalonne la valeur entre 0 et 1023 sur une fourchette entre -70 et 70degres
  analogWrite(9, y);
}


#4 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 14 juin 2012 - 05:41

j'ai une question, ou as tu trouver ces servo?

pas vraiment dispo en france!

#5 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 14 juin 2012 - 07:24

j'ai une question, ou as tu trouver ces servo?

pas vraiment dispo en france!


Je suis au Japon en fait, en stage :D

#6 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 14 juin 2012 - 07:42

Je suis au Japon en fait, en stage

Il y a beaucoup de magasins axés sur la robotique/électronique là bas ? (vu que ça a l'air d'être un domaine beaucoup plus "grand public"). :Archie_07:

Au fait on attends toujours ta présentation ! :on_the_quiet: (le gars pas chiant :D).

Non, plus sérieusement, tu fais ton stage dans quel domaine/boîte ? Et bon courage ! ^^

#7 Hexa Emails

Hexa Emails

    Membre passionné

  • Membres
  • PipPipPip
  • 439 messages
  • Gender:Male

Posté 14 juin 2012 - 08:04

Salut,

je crois que tu confonds deux choses: Processing et Arduino. les 2 IDE se ressemblent mais ce n'est pas la même chose (Arduino est écrit en C, compilé sur PC puis téléchargé sur microcontroleur, afin qu'il s'execute sur microcontroleur et Processing est un langage dérivé de Java, compilé et executé sur le PC).
Ou c'est moi qui n'ai pas bien compris le système: il y a un ordinateur? pourquoi se servir de Xbee? Parce que ce que tu veux faire est "très simple" à faire s'il n'y a pas de PC ou de Xbee en jeu, mais ,ça peut vite devenir compliqué lorsqu'on rajoute des éléments...

#8 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 14 juin 2012 - 02:29

Il y a beaucoup de magasins axés sur la robotique/électronique là bas ? (vu que ça a l'air d'être un domaine beaucoup plus "grand public"). :Archie_07:

Au fait on attends toujours ta présentation ! :on_the_quiet: (le gars pas chiant :D).

Non, plus sérieusement, tu fais ton stage dans quel domaine/boîte ? Et bon courage ! ^^


oui il y a plein de grands magasins electroniques comme Yodobashi camera (tu peux regarder sur google lol)qu'on trouve dans plusieurs villes, ou un quartier Akihabara à Tokyo ou il nya que des magasins electroniques, ou de mangas etc(t'as juste envie de tout prendre avec toi :rolleyes: )... pour la robotique par contre je ne saurais te repondre car jen ai pas encore vu, mais je sais qu'il y a pas mal de robots ici, d'apres des membres de mon labo.

Lol ma presentation, t'inquiete bientot :D promis!

Je suis en deuxieme annee de DUT GEII et j'ai choisi de faire mon stage à l'etranger, grace a des partenaires de mon IUT ^_^ là je suis dans un labo d'une université, mais pas en entreprise...

#9 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 14 juin 2012 - 02:45

Salut,

je crois que tu confonds deux choses: Processing et Arduino. les 2 IDE se ressemblent mais ce n'est pas la même chose (Arduino est écrit en C, compilé sur PC puis téléchargé sur microcontroleur, afin qu'il s'execute sur microcontroleur et Processing est un langage dérivé de Java, compilé et executé sur le PC).
Ou c'est moi qui n'ai pas bien compris le système: il y a un ordinateur? pourquoi se servir de Xbee? Parce que ce que tu veux faire est "très simple" à faire s'il n'y a pas de PC ou de Xbee en jeu, mais ,ça peut vite devenir compliqué lorsqu'on rajoute des éléments...


peut etre bien que c'est moi qui les confonds, je me disais meme que c'etait bizarre d'apres des infos que j'ai eues sur le net.

J'ai utilisé les Xbee parce que je dois construire un objet apres, qui ne sera pas forcement relié a l'ordi pas un fil... est-ce que tu vois? :blink:

#10 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 14 juin 2012 - 02:48

Au fait, j'attends toujours vos réponses, est-ce que quelqu'un pourrait m'aider ? :(


:help: :help: :help: :help: :help: :help: :help:

#11 Francky

Francky

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 967 messages
  • Gender:Male

Posté 14 juin 2012 - 02:51

Au fait, j'attends toujours vos réponses, est-ce que quelqu'un pourrait m'aider ?

Dsl moi je peux pas "^^

Lol ma presentation, t'inquiete bientot promis!

Héhé (même si maintenant ça sert plus à grand chose vu que t'as déjà dit pas mal de trucs ici ;)).

oui il y a plein de grands magasins electroniques comme Yodobashi camera (tu peux regarder sur google lol)qu'on trouve dans plusieurs villes, ou un quartier Akihabara à Tokyo ou il nya que des magasins electroniques, ou de mangas etc(t'as juste envie de tout prendre avec toi )... pour la robotique par contre je ne saurais te repondre car jen ai pas encore vu, mais je sais qu'il y a pas mal de robots ici, d'apres des membres de mon labo.

Ok merci pour les infos :Archie_07:

#12 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 14 juin 2012 - 03:17

Au fait, j'attends toujours vos réponses, est-ce que quelqu'un pourrait m'aider ? :(


:help: :help: :help: :help: :help: :help: :help:



procede par etape
  • connecter le servo a l'arduino et le faire varier de position (juste par un soft embarquer dans la carte)
  • connecter l'arduino au pc en utilisant la console arduino (je te conseil de regarder pobot)
  • une fois que tu arrive a faire varier tu fais un logiciel du language que tu veux pour envyer les info a l'arduino (moi j'aime vb.net, d'autre prefere processing, tu as l'embaras du choix!)
et normalement tu devrais y arriver
c'est a quel de ces 3 etape que tu bloque ?




#13 ashira

ashira

    Pilier du forum

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

Posté 15 juin 2012 - 07:07

Salut robot01, ton programme correspond presque a ce que j'avais imaginé^^


#include <Servo.h> // inclut la librairie Servo

int pincapteur = 5; //pin ou est branché le capteur
int valeurcapteur;

 
Servo myservo;
 
void setup()
 {
 myservo.attach(9); // attache le servomoteur à la broche 9
 myservo.write(0); // positionne le servomoteur à 0° (position neutre)
 }
 
void loop()
 
{ 

valeurcapteur = analogRead(pincapteur); //tu lis ce que renvoi ton capteur
valeurcapteur = map(valeurcapteur, 0, 1024, 0, 180); // tu la réétalonnes
myservo.write(valeurcapteur); // et tu l'envoies dans le servo
} 


Voila ca devrait macher avec ca. ;)
Pour une plage de -70 à 70 degres, comme tu ne renvoies que des valeurs entre 0 et 180, tu peux utiliser 0 et 140 ou 20 et 160 par exemple.
Et tu as écris analogWrite(9,y).. ca voudrait dire que tu as branché ton servo en analogique ? Les servo se pilotent en fréquence donc c'est sur les sorties logiques que tu dois le connecter !

#14 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 16 juin 2012 - 03:52

procede par etape

  • connecter le servo a l'arduino et le faire varier de position (juste par un soft embarquer dans la carte)
  • connecter l'arduino au pc en utilisant la console arduino (je te conseil de regarder pobot)
  • une fois que tu arrive a faire varier tu fais un logiciel du language que tu veux pour envyer les info a l'arduino (moi j'aime vb.net, d'autre prefere processing, tu as l'embaras du choix!)
et normalement tu devrais y arriver
c'est a quel de ces 3 etape que tu bloque ?


Merci julkien pour ta réponse, mais je pense que là tu oublie que j'utilise les modules Xbee, je me trompe?
Je vais quand même essayer, si j'en ai la possibilité l'étape 2, car j'ai eu un nouveau problème :'( mon ordi ne reconnaît plus le port COM x du Xbee, donc je ne peux charger aucun programme là


Salut robot01, ton programme correspond presque a ce que j'avais imaginé^^

Voila ca devrait macher avec ca. ;)
Pour une plage de -70 à 70 degres, comme tu ne renvoies que des valeurs entre 0 et 180, tu peux utiliser 0 et 140 ou 20 et 160 par exemple.
Et tu as écris analogWrite(9,y).. ca voudrait dire que tu as branché ton servo en analogique ? Les servo se pilotent en fréquence donc c'est sur les sorties logiques que tu dois le connecter !


Ashira merci pour ta réponse, j'aurai bien aimé le tester mais à cause du problème que j'ai cité plus haut ça sera impossible :(

#15 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 16 juin 2012 - 09:15

Merci julkien pour ta réponse, mais je pense que là tu oublie que j'utilise les modules Xbee, je me trompe?
Je vais quand même essayer, si j'en ai la possibilité l'étape 2, car j'ai eu un nouveau problème :'( mon ordi ne reconnaît plus le port COM x du Xbee, donc je ne peux charger aucun programme là



salut
je n'ai jammais utiliser de xbee mais j'imagine que sa doit etre un port com sans fil :)


je vien de trouver untuto sur l'utilisation des xbee





Bilan
On sait à la fin de l'étape 3, que nos xbee fonctionent séparement, qu'ils
ont la bonne configuration et qu'ils se reconaissent. La liaison est donc bien
établie ! Cette liaison se teste comme une simple liaison série RS232
filaire.



donc si tu arrive avec le cable tu y arriveras par la suite avec le xbee ;)

#16 robot01

robot01

    Membre

  • Membres
  • 20 messages
  • Gender:Female

Posté 18 juin 2012 - 04:53

salut
je n'ai jammais utiliser de xbee mais j'imagine que sa doit etre un port com sans fil :)


je vien de trouver untuto sur l'utilisation des xbee



donc si tu arrive avec le cable tu y arriveras par la suite avec le xbee ;)


Le tuto est tres interessant, sauf que je bloque a l'etape 1, c'est la communication entre les deux XBee qui ne marche pas.
J'ai telecharge le logiciel X-CTU mais quand je lance le test, il m'ecrit "unable to communicate with modem"

:(

#17 fabrice54

fabrice54

    Nouveau membre

  • Membres
  • 7 messages
  • Gender:Male

Posté 05 septembre 2012 - 12:52

bonjour

je te fais parvenir un petit logiciel que j'ais écris, qui trouve le chemin le moins encombre,pour diriger le robot,à l'aide d'un transpondeur ultrasonic qui est monte sur un servo moteur le transpondeur recherche la distance la plus longue et copie dans le servo moteur de direction l'angle de la meilleure distance.
#include "Ultrasonic.h"
#include <Servo.h> 
Ultrasonic ultrasonic(12,13);//ehco patte 13 fil vert, trig patte 12
Servo myservo;//fil noire
Servo servo1;
int i=1;  
int tab[180];
int a=1;
int b=2;
void setup() {
  myservo.attach(9);
 servo1.attach(10);
 myservo.write(90); 
servo1.write(90); 
  for(i=1;i<179;i=i+1)
 {
    tab[i]=(ultrasonic.Ranging(CM));
    myservo.write(i);
    delay(10);
  }
  for(i=1;i<180;i++)
  {
  if(tab[a]<tab[b])
{
a=b;
}
else
{
b=b+1;
}
}
    servo1.write(a); 
delay(2000);
 myservo.write(90); 
 delay(1000);
}





void loop()
{
  }






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

0 members, 0 guests, 0 anonymous users