Go Down

Topic: Piloter 6 servos avec 6 potars via 2 cartes et 2 Xbee (Read 1 time) previous topic - next topic

Kevo18

Jan 06, 2013, 04:24 pm Last Edit: Jan 06, 2013, 04:34 pm by Kevo18 Reason: 1
Bonjour à tous,

Je suis:Bien loin de tout savoir sur Arduino et sur le C!
Tout nouveau dans le monde de la programmation et de la robotique mais avec une forte envie d'apprendre et de comprendre.
J'ai réussi a: faire clignoter la LED 13 avec le PC (youpi!),faire clignoter une LED sur une carte avec le BP sur l'autre carte via Xbee(youpiiii!),piloter un servomoteur(180°) sur une carte en tournant un potentiomètre sur une autre carte via Xbee(youpi!,youpi!).
Je ne réussi pas à faire tourner 2 servomoteurs(180°) sur une carte en tournant 2 potentiomètres sur une autre carte via Xbee (pas Youpi...).

Mon projet: la réalisation d'un robot radiocommandé mobile comportant 1 bras articulé sur support rotatif.
concrètement: un aspirateur traineau pouvant se déplacer et manœuvrer son tuyau sous l'influence d'une télécommande.
Son but:Acteur sur scène!  

Techniquement:
1 Tête articulée en bout de bras (2servos)
1 bras articulé (3servos)
1 embase rotative(1servo)
2 moteurs (droit et gauche fonctionnant comme un tank)
une radiocommande  

Matériel:
Coté robot:
1Arduino Romeo V1.1,1shield Xbee,1Xbee, 6 Servomoteurs, 2 moteurs CC, 2batteries(7.2V servoPWR,11.1V Vin).
Coté radiocommande:
1Arduino Uno R3,1 Shield Xbee,1Xbee,9 potars (6 pour servomoteurs et 3 pour moteur et direction),1batterie 7.2V(Vin).
Coté logiciel:Arduino 1.0.3,X-CTU (Xbee).

Mon probléme:
Je précise que pour l'instant je me borne à la commande de 2 des servomoteurs(que l'on nommera serv_1 et serv_2) par 2 potentiomètres (potar_1 et potar_2) étant dit que le potentiomètre 1 commande le servo1 et que le potentiomètre 2 commande le servo2 en passant par la liaison série.
Il m'est impossible "d'isoler" les commandes de chacun...
J'ai compris comment contrôler un servo par la liaison série mais deux...Pas moyen!
Quelqu'un peut-il me mettre sur la voie s'il vous plait?
Merci d'avance pour votre aide.








B@tto

T'as plusieurs solution. Moi côté émetteur j'émettrais une trame genre "Potar1,Potar2", mais en gardant exactement le même nombre de caractères quelque que soit la valeur mesurée, par exemple "010,123" ou "001,004". Ainsi côté récepteur, tu récupères ta trame dans un tableau de char, et tu sais qui est où ;)

Kevo18

Merci pour ta réponse B@tto.
Ok pour le principe.Par contre je suis vraiment débutant et du coup...Ben je sais pas trop comment mettre tout çà en application :smiley-roll:
Sinon, les autres solutions que tu évoques?Plus simples ou plus compliquées?
En tout cas je me mets en quête de documentation pouvant m'aider à comprendre ;)
Aie mon cerveau! =(

B@tto

Le deuxieme lien ici : http://arduino.cc/forum/index.php/topic,102618.0.html

Il y a pleins de tutos dont un qui permet justement de transmettre les trois couleurs d'une LED RGB. La tu as une manière assez compliquée de le faire (moi même je l'ai utilisé longtemps sans comprendre à 100% xD). Tout dépend après de ce que tu veux faire, de tes besoins ... Après une fonction bien faîte, tu t'en resserviras toute ta vie j'ai envie de dire, donc ça peut valoir le coup de faire un truc bien une fois pour toute


Kevo18

J'étais déjà tomber sur ton post au travers de mes (nombreuses) recherches.
J'avais charger le premier livret mais je me suis découragé pour le second à cause de l'anglais :smiley-fat:
Je viens de le survoler et effectivement il y aurait bien des choses très intéressantes pour moi XD.
Et puis finalement en anglais je m'en sors pas mal du tout!
Je te suis dans ton raisonnement,mieux vaut partir sur de bonnes bases si l'on veut évoluer et j'ai bien l'intention de ne pas m'arrêter à un robot radiocommandé.
Encore merci en tous cas!   

B@tto

Disons que moi je me sers de la même fonction depuis des années, et elle couvre n'importe quel besoin ;)

Kevo18

#6
Jan 13, 2013, 02:25 pm Last Edit: Feb 02, 2013, 02:05 pm by Kevo18 Reason: 1
Bon,alors voila ou j'en suis...
On ne rigole pas SVP :)
J'avoue que je me suis fortement inspiré...Mais j'ai compris presque tout ce que j'écrivais!
En consultant le moniteur série(recepteur),j'ai bien mes valeurs de potar comprises entre 0 et 179 qui varient en fonction du déplacement de mes potars.
Les valeurs sont écrites comme suit:potar_1,107potar_2,99potar_1,107potar_2,99potar_1,107 ect...
Maintenant çà ne fonctionne toujours pas...
Je pense que mon soucis vient en partie de la variable "Ans" que j'ai essayer d'écrire de cette maniére:
Ans = map (Ans,0,179,0,179);
Mais pas de changement...
Comme je l'ai dis plus haut,je ne suis pas un dieu de la prog alors je passe certainement à coté de quelque chose...

Coté émetteur:
Quote

void setup()
{
Serial.begin(9600);
}

void loop()
{
int ana1 = analogRead(2);
delay(10);
int ana2 = analogRead(3);
delay(10);
int val1 = map(ana1, 0, 1023, 0, 179);
int val2 = map(ana2, 0, 1023, 0, 179);
Serial.print("a");
Serial.print(val1);

Serial.print("b");
Serial.print(val2);

delay(5);
}









Coté récepteur:

Quote

#include <Servo.h>
char buffer [18];
Servo serv_1;
Servo serv_2;

int servopin_1= 8;
int servopin_2= 9;


void setup()
{
 Serial.begin(9600);
 serv_1.attach( 8 );
 serv_2.attach( 9 );
}

void loop()
{
 if (Serial.available() > 0){
   int index=0;
   delay(5);
   int numchar = Serial.available ();
   while (numchar--) {
     buffer[index++] = Serial.read();
 }
     splitString(buffer);
}
}
 void splitString (char* data){
 Serial.print("Data entered: ");
 Serial.println(data);
 char* parameter;
 parameter = strtok (data, ",");
 while (parameter != NULL) {
   servSet (parameter);
   parameter = strtok (NULL, ",");
 }
for (int x=0; x<16; x++) {
 buffer[ x ] ='\0';
}
Serial.flush();
}
void servSet(char* data) {
 if (data[0] == 'a'){
   int Ans = strtol (data+1, NULL, 10);
   Ans = map (Ans,0,179,0,179);
   serv_1.write( Ans);
   Serial.println(Ans);
 }
 //Serial.flush();
 if (data[0] == 'b'){
   int Ans = strtol (data+1, NULL, 10);
   Ans = map (Ans,0,179,0,179);
   serv_2.write(Ans);
   Serial.println(Ans);
 }

}
   



Kevo18

Salut à tous;
Depuis mon dernier passage sur le forum il y a un peu de progrès...
J'ai maintenant le servo 1 qui fonctionne et le servo 2 qui fait un peu ce qu'il veut ( il suit les consignes mais vraiment quand ça le chante).
J'ai remis à jour les codes postés plus haut avec la version que j'utilise pour l'instant.
Je ne cache pas que je ne sais plus trop comment faire avancer mon probléme... =(
Quelqu'un peut il me mettre sur la voie car je désespère un peu...
Merci d'avance.

papybricol


Bonjour,

Avec les print c'est pas simple. Tu n'es pas le premier à ramer pour décoder la trame reçue.
Les "String" seraient même l'ennemi du bien... :smiley-mr-green:

Si tu bloques vraiment, alors essaie d'utiliser les write ( transmission de byte donc de 0 à 255)
En suivant les conseils de Super_Cinci, et en adaptant à ton sujet:  (réponse #16)
http://arduino.cc/forum/index.php/topic,126987.15.html

Les valeurs de tes potars étant de 0 à 180, utilise les nombres 200,201,...pour désigner les servos

Exemple de trame:   201  55   202  103  203  89 .....signifiera:
  servo1 à 55
  servo2 à 103
  servo3 à 89.....

et choisis un code de début de trame et un de fin (ex:   240  et 245...)
Le delay en fin d'émission est important.

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Kevo18

Salut papybricol,
tout d'abord un grand merci pour ton message et ton aide :)
J'ai une très nette amélioration en éliminant tout ce qui concerne la lecture de données par le moniteur série sur le récepteur.C'était certes très pratique de pouvoir lire la trame reçue mais (je pense) que cela créé une boucle entre l'émetteur et le récepteur en mettant au passage une belle pagaille...
Bref,sur mes deux servos,un fonctionne parfaitement et l'autre ne veux plus rien savoir quand j'arrive presque en butée sur le premier...Là y'a encore un drôle de schmillblick! :smiley-roll:
Quoi qu'il en soit, j'avais déjà bossé  sur les "write" dans un premier programme mais j'avais rencontré un probléme (dont je ne me souviens plus).
Je vais ressortir tout çà des cartons et me repencher dessus en essayant tes conseils.
Merci encore!

Go Up