Pages: [1]   Go Down
Author Topic: Piloter 6 servos avec 6 potars via 2 cartes et 2 Xbee  (Read 1284 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.







« Last Edit: January 06, 2013, 10:34:52 am by Kevo18 » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3763
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ù smiley-wink
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Aie mon cerveau! smiley-cry
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3763
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-lol.
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!   
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3763
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon,alors voila ou j'en suis...
On ne rigole pas SVP smiley
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);
  }

}
    

« Last Edit: February 02, 2013, 08:05:06 am by Kevo18 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-cry
Quelqu'un peut il me mettre sur la voie car je désespère un peu...
Merci d'avance.
Logged

Bretagne
Offline Offline
Full Member
***
Karma: 2
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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.

Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut papybricol,
tout d'abord un grand merci pour ton message et ton aide smiley
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!
Logged

Pages: [1]   Go Up
Jump to: