Go Down

Topic: Erreur dans code pour controller des servomoteurs (Read 4172 times) previous topic - next topic

lesaccrosduvol

Jan 19, 2014, 09:58 pm Last Edit: Jan 19, 2014, 10:00 pm by lesaccrosduvol Reason: 1
Salut à tous

Je me suis enfin lancer dans la conception de mon projet, après avoir déjà fait plusieurs exercices et après commencer à apprendre les bases de l'arduino je commence à faire quelque progrès. Mon projet est assez simple il consiste à contrôler plusieurs servomoteurs (je ne ses pas encore combine mais au moins 6 je pense) avec l'ordinateur en utilisant les touches du clavier ( par la suite j'utiliserais le logiciel "XPPADER" afin de le contrôler avec une manette de jeu " dans un premier temps je souhaite contrôler ses servomoteurs en restant relier par le câble à l'ordinateur mais par la suite j'espère pouvoir utiliser un émetteur et un récepteur 2.4 G. Hz ( je me Susi vaguement renseigné, j'ai juste constaté qu'il me faudra un deuxième ardu ino si j'ai bien compris)

Enfin bref je me suis d'abord lancer avec se tuto http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertServoControlePositionClavierPC
Le concept mon bien plus :)

Les choses ont commencé à se compliquer quand il a fallu contrôler deux servomoteurs sous ce même principe . J'ai tourné en rond pendant 1-2 semaines .

J'ai finalement pris mon courage à deux mains je me suis plongé tout le week-end dans les librairies et le programme déjà existant ( Je n'avais jamais programmé au auparavant, Cela fait moins 1 mois que je possède mon arduino et jamais je n'avais fait de programme)
J'ai réussi à pondre ceci
Le Code ARDUINO
Code: [Select]

// --- Inclusion des librairies utilisées ---

#include <Servo.h> // librairie pour servomoteur

// --- Déclaration des constantes ---
const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur
                      // POS_MIN=550 pour futaba S3003
const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur
                                                // POS_MAS=2330 pour futaba s3003

// --- constantes des broches ---

const int broche_servo=2; //declaration constante de broche
const int broche_servo1=3; //declaration constante de broche

// --- Déclaration des variables globales ---
// variable position du servomoteur en degré
int position_servo=0;
int position_servo1=0;

// variable de stockage des valeurs reçues
int OctetReception=0;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo1;  // crée un objet servo pour contrôler le servomoteur


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()


Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

mon_servo.attach(broche_servo, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur
mon_servo1.attach(broche_servo1, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur

// ------- Broches en sortie -------  

pinMode(broche_servo, OUTPUT); //met la broche en sortie
pinMode(broche_servo1, OUTPUT); //met la broche en sortie

// ------- position initiale du servomoteur
mon_servo.write(position_servo);
delay(200);

mon_servo1.write(position_servo1);
delay(200);

}


//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal ---

if (Serial.available()>0) { // si un octet en réception

 OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
 OctetReception=OctetReception-48; // isole valeur numerique 0-9 à partir valeur ASCII
 
 // calcule la nouvelle position
 position_servo=map(OctetReception,0,9,0,180);
 position_servo1=map(OctetReception,0,9,0,180);
 
 //positionne le servomoteur
 mon_servo.write(position_servo);
 mon_servo1.write(position_servo1);
 
 //entre chaque changement de position
 delay (200);
 
 }// fin gestion octet en réception

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---


infobarquee

AUCUNE AIDE PAR MP

lesaccrosduvol

VOICI LA SUITE CAR SINON JE DEPASSAIS LE NOMBRES DE CARATERE AUTORISE   :smiley-sweat:

Le Code PROCESSING
Code: [Select]

// inclusion librairies utilisées
import processing.serial.*; // importe la librairie série processing

// déclaration variables

//--- variables utiles tracé vumètre

float Y_ref=220; // ordonnée de ligne de référence dessin rectangle

float largeur=50;
float hauteur=180; //180 représente 100% (0 à 9 = 10 positions)

int SendValue=0; // valeur envoyée à Arduino
float niveau=100; // 0% au départ

float Y_ref1=220; // ordonnée de ligne de référence dessin rectangle

float largeur1=50;
float hauteur1=180; //180 représente 100% (0 à 9 = 10 positions)

int SendValue1=0; // valeur envoyée à Arduino
float niveau1=100; // 0% au départ

Serial MySerialPort; // variable désignant le port série

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

 size(300,250); //dimensionne la fenêtre processing à 200x200 (largeur x hauteur) // 1ère instruction de Setup
 // si Size() oublié => fenêtre 100x100 par défaut --

 //---- initialisation port série ---

 println(Serial.list()); // liste et affiche tous les ports disponibles

 // Open whatever port is the one you're using.
  MySerialPort = new Serial(this, Serial.list()[1], 115200); // vérifier si c'est le bon port qui est utilisé
  delay (100); // pause  

 background (255,255,255); // fixe la couleur du fond - format RGB
 stroke(255,0,0); // fixe la couleur du trait de dessin et bordure - format RGB
 //nostroke(); // Désactive trait de dessin et bordure

 // dessin des 2 rectangles du niveau de démmarrage (=50%)
 stroke (0); // trait de contour
 fill(255,255,255); // remplissage
 rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

 stroke (255,0,0); // trait de contour
 fill(255,0,0); // remplissage rouge
 rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

// dessin des 2 rectangles du niveau de démmarrage (=50%)
 stroke (0); // trait de contour
 fill(255,255,255); // remplissage
 rect (200,Y_ref1-hauteur1,largeur1, hauteur1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

 stroke (255,0,0); // trait de contour
 fill(255,0,0); // remplissage rouge
 rect (200,Y_ref1-niveau1,largeur1, niveau1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

//----- initialisation valeur série ----
 MySerialPort.write(48);   // valeur initiale 0+ 48 pour format ASCII
 delay (100); // pause  
 
}

void  draw() { // fonction exécutée en boucle

 //--- nb : la vitesse de rafraîchissement de l'écran est de 60 par seconde apr défaut  - cf frameRate()

}

// fonction de gestion des évènements

//----- clavier --------

void keyPressed() {// cette fonction est exécutée quand un touche est appuyée...

if (key == CODED) { // si appui d'une touche particulière (les touches spéciales up, down, etc.. cf Keycode)

   if (keyCode == UP) { // si touche Haut appuyée

     niveau=niveau+(hauteur/9); // /9 pour avoir 10 niveaux
     if (niveau>=hauteur)niveau=hauteur; // ne pas dépasser hauteur

     SendValue=SendValue+1; // incrémente SendValue
     if (SendValue >=9) SendValue=9; // Empêche débordement variable SendValue

     MySerialPort.write(SendValue+48);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
     delay (100); // pause  
   }
   else if (keyCode == DOWN) {// si touche BAS appuyée

   niveau=niveau-(hauteur/9); // /9 pour avoir 10 niveaux
   if (niveau<=0)niveau=0; // ne pas dépasser 0

    SendValue=SendValue-1; // décrémente SendValue
     if (SendValue<=0) SendValue=0;// ne pas dépasser 0

     MySerialPort.write(SendValue+48);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
     delay (100); // pause  

   }
   if (keyCode == RIGHT) { // si touche droite appuyée

     niveau1=niveau1+(hauteur1/9); // /9 pour avoir 10 niveaux
     if (niveau1>=hauteur1)niveau1=hauteur1; // ne pas dépasser hauteur

     SendValue1=SendValue1+1; // incrémente SendValue
     if (SendValue1 >=9) SendValue1=9; // Empêche débordement variable SendValue

     MySerialPort.write(SendValue1+48);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
     delay (100); // pause  
   }
   else if (keyCode == LEFT) {// si touche gauche appuyée

   niveau1=niveau1-(hauteur1/9); // /9 pour avoir 10 niveaux
   if (niveau1<=0)niveau1=0; // ne pas dépasser 0

    SendValue1=SendValue1-1; // décrémente SendValue
     if (SendValue1<=0) SendValue1=0;// ne pas dépasser 0

     MySerialPort.write(SendValue1+48);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
     delay (100); // pause  

   }
}

// dessin des 2 rectangles du niveau
 stroke(0); // contour noir
 fill(255,255,255); // remplissage blanc
 rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

  stroke(255,0,0); // contour rouge
 fill(255,0,0); // remplissage rouge
 rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

// dessin des 2 rectangles du niveau
 stroke(0); // contour noir
 fill(255,255,255); // remplissage blanc
 rect (200,Y_ref1-hauteur1,largeur1, hauteur1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

  stroke(255,0,0); // contour rouge
 fill(255,0,0); // remplissage rouge
 rect (200,Y_ref1-niveau1,largeur1, niveau1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

}



Les programmes sont fortement inspirés du lieu ci -joint

Mon problème est donc le suivant j'ai bien les deux vumètres bougés bien quand j'appuie sur les les "HAUT" et "BAS) pour celui de gauche et pour le vumètre de droite il bouge bien quand j'appuie sur les touches " GAUCHE" et "DROITE" le moment où se coince c'est quand les servomoteurs doivent bouger normalement chacun devrait bouger quand il est commandé mais là les deux bouges en même temps que j'appuie sur n'importent qu'elle touche "HAUT" "BAS" "GAUCHE" "DROITE" c'est comme s'il recevait le même signal alors que chacun doit recevoir son signal de position qui n'est pas forcément le même que le deuxième

Merci d'avance de vos réponse

fdufnews

Pas trop étonnant
Code: [Select]
  OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
  OctetReception=OctetReception-48; // isole valeur numerique 0-9 à partir valeur ASCII
 
  // calcule la nouvelle position
  position_servo=map(OctetReception,0,9,0,180);
  position_servo1=map(OctetReception,0,9,0,180);

Tu reçois un octet de commande et tu le mets dans les 2 variables position_servo et position_servo1. Donc ils ont tous les 2 la même consigne.
En même temps le problème de fond c'est que rien ne distingue la consigne pour un servo de la consigne pour l'autre.
Il faudrait peut être prévoir quelque chose pour ça. Par exemple la consigne pour un servo serait une lettre majuscule et pour l'autre serait une lettre minuscule.
A l'émission au lieu d'ajouter 48 au code envoyé tu pourrais par exemple ajouter 65 (le code du A) pour les commandes à servo et ajouter 97 (le code du a) pour les commandes à servo1.
A la réception tu testes si le caractère reçu est inférieur à 97
          alors c'est une commande pour servo et tu récupères la consigne en soustrayant 65 et tu mets le résultat dans position_servo
        sinon c'est une commande pour servo1 et tu récupères la consigne en soustrayant 97 et tu mets le résultat dans position_servo1

lesaccrosduvol

Merci de votre réponse
Voilà ce que j'ai fais mais il doit y avoir une erreur les servo se positionne une fois que 3-4 fois sur 10

Arduino
Code: [Select]
// --- Inclusion des librairies utilisées ---

#include <Servo.h> // librairie pour servomoteur

// --- Déclaration des constantes ---
const int POS_MIN=550; // largeur impulsion pour position 0° servomoteur
                       // POS_MIN=550 pour futaba S3003
const int POS_MAX=2330; // largeur impulsion pour position 180° servomoteur
                                                 // POS_MAS=2330 pour futaba s3003

// --- constantes des broches ---

const int broche_servo=2; //declaration constante de broche
const int broche_servo1=3; //declaration constante de broche

// --- Déclaration des variables globales ---
// variable position du servomoteur en degré
int position_servo=0;
int position_servo1=0;

// variable de stockage des valeurs reçues
int OctetReception=0;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo1;  // crée un objet servo pour contrôler le servomoteur


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()


Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

mon_servo.attach(broche_servo, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur
mon_servo1.attach(broche_servo1, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur

// ------- Broches en sortie ------- 

pinMode(broche_servo, OUTPUT); //met la broche en sortie
pinMode(broche_servo1, OUTPUT); //met la broche en sortie

// ------- position initiale du servomoteur
mon_servo.write(position_servo);
mon_servo1.write(position_servo1);
delay(200);




}


//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal ---

if (Serial.available()>0) { // si un octet en réception

  OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
  OctetReception=OctetReception-0; // isole valeur numerique 0-9 à partir valeur ASCII
 
  // calcule la nouvelle position
  position_servo=map(OctetReception,0,9,0,180);
 
 
  //positionne le servomoteur
  mon_servo.write(position_servo);
 
 
  //entre chaque changement de position
  delay (200);
}
  if (Serial.available()>0) { // si un octet en réception

  OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
  OctetReception=OctetReception-190; // isole valeur numerique 0-9 à partir valeur ASCII
 
  // calcule la nouvelle position
  position_servo1=map(OctetReception,0,9,0,180);
 
  //positionne le servomoteur
  mon_servo1.write(position_servo1);
 
  //entre chaque changement de position
  delay (200);
 
  }// fin gestion octet en réception

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---
 




lesaccrosduvol

Processing
Code: [Select]
// inclusion librairies utilisées
import processing.serial.*; // importe la librairie série processing

// déclaration variables

//--- variables utiles tracé vumètre

float Y_ref=220; // ordonnée de ligne de référence dessin rectangle

float largeur=50;
float hauteur=180; //180 représente 100% (0 à 9 = 10 positions)

int SendValue=0; // valeur envoyée à Arduino
float niveau=0; // 0% au départ

float Y_ref1=220; // ordonnée de ligne de référence dessin rectangle

float largeur1=50;
float hauteur1=180; //180 représente 100% (0 à 9 = 10 positions)

int SendValue1=0; // valeur envoyée à Arduino
float niveau1=0; // 0% au départ

Serial MySerialPort; // variable désignant le port série

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

  size(300,250); //dimensionne la fenêtre processing à 200x200 (largeur x hauteur) // 1ère instruction de Setup
  // si Size() oublié => fenêtre 100x100 par défaut --

  //---- initialisation port série ---

  println(Serial.list()); // liste et affiche tous les ports disponibles

  // Open whatever port is the one you're using.
   MySerialPort = new Serial(this, Serial.list()[1], 115200); // vérifier si c'est le bon port qui est utilisé
   delay (100); // pause 

  background (255,255,255); // fixe la couleur du fond - format RGB
  stroke(255,0,0); // fixe la couleur du trait de dessin et bordure - format RGB
  //nostroke(); // Désactive trait de dessin et bordure

  // dessin des 2 rectangles du niveau de démmarrage (=50%)
  stroke (0); // trait de contour
  fill(255,255,255); // remplissage
  rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

  stroke (255,0,0); // trait de contour
  fill(255,0,0); // remplissage rouge
  rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

// dessin des 2 rectangles du niveau de démmarrage (=50%)
  stroke (0); // trait de contour
  fill(255,255,255); // remplissage
  rect (200,Y_ref1-hauteur1,largeur1, hauteur1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

  stroke (255,0,0); // trait de contour
  fill(255,0,0); // remplissage rouge
  rect (200,Y_ref1-niveau1,largeur1, niveau1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

//----- initialisation valeur série ----
  MySerialPort.write(0);   // valeur initiale 0+ 48 pour format ASCII
  delay (100); // pause 
    MySerialPort.write(190);   // valeur initiale 0+ 48 pour format ASCII
  delay (100); // pause 
 
}

void  draw() { // fonction exécutée en boucle

  //--- nb : la vitesse de rafraîchissement de l'écran est de 60 par seconde apr défaut  - cf frameRate()

}

// fonction de gestion des évènements

//----- clavier --------

void keyPressed() {// cette fonction est exécutée quand un touche est appuyée...

if (key == CODED) { // si appui d'une touche particulière (les touches spéciales up, down, etc.. cf Keycode)

    if (keyCode == UP) { // si touche Haut appuyée

      niveau=niveau+(hauteur/9); // /9 pour avoir 10 niveaux
      if (niveau>=hauteur)niveau=hauteur; // ne pas dépasser hauteur

      SendValue=SendValue+1; // incrémente SendValue
      if (SendValue >=9) SendValue=9; // Empêche débordement variable SendValue

      MySerialPort.write(SendValue+0);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 
    }
    else if (keyCode == DOWN) {// si touche BAS appuyée

    niveau=niveau-(hauteur/9); // /9 pour avoir 10 niveaux
    if (niveau<=0)niveau=0; // ne pas dépasser 0

     SendValue=SendValue-1; // décrémente SendValue
      if (SendValue<=0) SendValue=0;// ne pas dépasser 0

      MySerialPort.write(SendValue+0);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 

    }
    if (keyCode == RIGHT) { // si touche droite appuyée

      niveau1=niveau1+(hauteur1/9); // /9 pour avoir 10 niveaux
      if (niveau1>=hauteur1)niveau1=hauteur1; // ne pas dépasser hauteur

      SendValue1=SendValue1+1; // incrémente SendValue
      if (SendValue1 >=9) SendValue1=9; // Empêche débordement variable SendValue

      MySerialPort.write(SendValue1+190);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 
    }
    else if (keyCode == LEFT) {// si touche gauche appuyée

    niveau1=niveau1-(hauteur1/9); // /9 pour avoir 10 niveaux
    if (niveau1<=0)niveau1=0; // ne pas dépasser 0

     SendValue1=SendValue1-1; // décrémente SendValue
      if (SendValue1<=0) SendValue1=0;// ne pas dépasser 0

      MySerialPort.write(SendValue1+190);   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 

    }
}

// dessin des 2 rectangles du niveau
  stroke(0); // contour noir
  fill(255,255,255); // remplissage blanc
  rect (10,Y_ref-hauteur,largeur, hauteur); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

   stroke(255,0,0); // contour rouge
  fill(255,0,0); // remplissage rouge
  rect (10,Y_ref-niveau,largeur, niveau); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

// dessin des 2 rectangles du niveau
  stroke(0); // contour noir
  fill(255,255,255); // remplissage blanc
  rect (200,Y_ref1-hauteur1,largeur1, hauteur1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

   stroke(255,0,0); // contour rouge
  fill(255,0,0); // remplissage rouge
  rect (200,Y_ref1-niveau1,largeur1, niveau1); // trace un rectangle de hauteur voulue
//à partir du point x,y (rect(x,y,larg,haut)) en se basant sur ordonnée de référence

}



Vraiment désolé si c'est une faute stupide

Cordialement

fdufnews

Tu ne testes pas la valeur reçue et tu l'affectes arbitrairement à l'un ou à l'autre des servos.
Relis mon précédent post.

lesaccrosduvol

Bonsoir

Je suis vraiment désolé " fdufnews"  mais merci de te donner autant de mal pour moi . Sois je suis trop fatigué , sois je suis complètement largué et donc c'est pour cela que je ne comprend absolument rien de ce que tu me raconte  :(   

Si tu avais la gentillesse de me réexpliquer avec des terme vraiment peut technique voir même complètement pas .
Sincèrement j'ai l'impression que tu me parle chinois pourtant j'ai relue bien une cinquantaine de fois en essayant de le prendre par tout les sens c'est comme si je ne saisissais  pas tout les termes que tu emploi et donc je tape complètement à coté

Avec toutes mes excuses

infobarquee

ce qu'il veut te dire, c'est que dans ton 1 er post, tu appliques la même valeur recue aux 2 servos (OctetReception)

donc il a conseillé d'envoyer en plus pour chaque servo un caractère distinct
A pour le 1er servo avec une valeur => A50
a pour le second avec une valeur => a100

dans la réception du Serial, tu dois lire la chaine recue ( A50 ou a100 )
si c'est un A => servo 1 et valeur 50
si c'est un a => servo 2 et valeur 100

ceci dans le but de piloter les moteurs séparément.
ca pourrait être A et Z pour différencier les servos.
tu peux aussi mettre un séparateur comme A=50 et a=100
après tu prends ta chaine recue, tu "parse" en prenant comme marker le =


dans ton second code, tu ne fais que lire la chaine recues encore, MAIS ne regarde pas la lettre.
c'est plus clair?
AUCUNE AIDE PAR MP

fdufnews

#9
Jan 21, 2014, 09:32 am Last Edit: Jan 21, 2014, 12:54 pm by fdufnews Reason: 1
C'est pas tout à fait ça. C'est encore plus simpliste cela reprend la méthode utilisée par le code d'origine.

Son soft (coté émission) envoie une consigne sous la forme d'une valeur de 0 à 9. Pour que la consigne soit un caractère imprimable, elle est envoyé sous la forme d'un caractère ASCII donc il ajoute 48 à la consigne ce qui correspond aux caractères 0 à 9. Mais cela ne permet pas de distinguer à qui est destiné la consigne.
Ce que je propose c'est d'envoyer la consigne sous 2 formes distinctes suivant la destination.
Caractères de A à J (en ajoutant 65 à la consigne) pour un servo et de a à j (en ajoutant 97 à la consigne) pour l'autre.
A l'arrivée on teste si le caractère fait partie des majuscules ou des minuscules pour aiguiller la consigne vers le bon destinataire.
Suivant le destinataire on retire la constante ajoutée à l'émission (soit 45, soit 97) et on la passe au servo concerné.

lesaccrosduvol

Bonsoir
Tout d'abord merci à vous deux

Je pense avoir compris, il faut que je face sa ?

Code Processing
Code: [Select]


//----- initialisation valeur série ----
  MySerialPort.write(65);   // valeur initiale 0+ 48 pour format ASCII
  delay (100); // pause 
    MySerialPort.write(97);   // valeur initiale 0+ 48 pour format ASCII
  delay (100); // pause 
 
}

void  draw() { // fonction exécutée en boucle

  //--- nb : la vitesse de rafraîchissement de l'écran est de 60 par seconde apr défaut  - cf frameRate()

}

// fonction de gestion des évènements

//----- clavier --------

void keyPressed() {// cette fonction est exécutée quand un touche est appuyée...

if (key == CODED) { // si appui d'une touche particulière (les touches spéciales up, down, etc.. cf Keycode)

    if (keyCode == UP) { // si touche Haut appuyée

      niveau=niveau+(hauteur/9); // /9 pour avoir 10 niveaux
      if (niveau>=hauteur)niveau=hauteur; // ne pas dépasser hauteur

      SendValue=SendValue+1; // incrémente SendValue
      if (SendValue >=9) SendValue=9; // Empêche débordement variable SendValue

      MySerialPort.write("j(SendValue+65)");   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 
    }
    else if (keyCode == DOWN) {// si touche BAS appuyée

    niveau=niveau-(hauteur/9); // /9 pour avoir 10 niveaux
    if (niveau<=0)niveau=0; // ne pas dépasser 0

     SendValue=SendValue-1; // décrémente SendValue
      if (SendValue<=0) SendValue=0;// ne pas dépasser 0

      MySerialPort.write("a(SendValue+65)");   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 

    }
    if (keyCode == RIGHT) { // si touche droite appuyée

      niveau1=niveau1+(hauteur1/9); // /9 pour avoir 10 niveaux
      if (niveau1>=hauteur1)niveau1=hauteur1; // ne pas dépasser hauteur

      SendValue1=SendValue1+1; // incrémente SendValue
      if (SendValue1 >=9) SendValue1=9; // Empêche débordement variable SendValue

      MySerialPort.write("J(SendValue1+97)");   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 
    }
    else if (keyCode == LEFT) {// si touche gauche appuyée

    niveau1=niveau1-(hauteur1/9); // /9 pour avoir 10 niveaux
    if (niveau1<=0)niveau1=0; // ne pas dépasser 0

     SendValue1=SendValue1-1; // décrémente SendValue
      if (SendValue1<=0) SendValue1=0;// ne pas dépasser 0

      MySerialPort.write("A(SendValue1+97)");   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
      delay (100); // pause 

    }
}


Arrêtez moi si je me trompe  :(

Par contre que faut-il mettre exactement dans le code arduino et où.

Si ce que j'ai fait ci-dessus est bon, je pense que c'est la seul chose qu'il me reste à faire

Cordialement

fdufnews

Comme je te l'ai expliqué plus haut, maintenant que tu as envoyé 2 consignes différentes il faut faire le tri à l'arrivée pour les aiguiller vers le bon servo.

lesaccrosduvol

#12
Jan 21, 2014, 09:39 pm Last Edit: Jan 22, 2014, 08:13 am by lesaccrosduvol Reason: 1

Comme je te l'ai expliqué plus haut, maintenant que tu as envoyé 2 consignes différentes il faut faire le tri à l'arrivée pour les aiguiller vers le bon servo.



D'accord merci déjà sa c'est pas mal j'ai fait 1/2 , mais maintenant je suis encore perdu (toute ces information me dépasse un peu  :~ )  j'ai fait sa. Mais rien les servomoteurs ne bouge  pas je suppose que sa de devrai pas être mit là . Je pense que celà vien du faite que je ne comprend pas du tout comment je peu aiguiller les information  donc je fais une peu n'importe quoi

Code: [Select]
if (Serial.available()>0) { // si un octet en réception

 OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
 OctetReception=(OctetReception,"a","j",-65); // isole valeur numerique 0-9 à partir valeur ASCII
 
 // calcule la nouvelle position
 position_servo=map(OctetReception,0,9,0,180);
 
 
 //positionne le servomoteur
 mon_servo.write(position_servo);
 
 
 //entre chaque changement de position
 delay (200);
}
 if (Serial.available()>0) { // si un octet en réception

 OctetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
 OctetReception=(OctetReception,"A","J",-97); // isole valeur numerique 0-9 à partir valeur ASCII

 // calcule la nouvelle position
 position_servo1=map(OctetReception,0,9,0,180);
 
 //positionne le servomoteur
 mon_servo1.write(position_servo1);
 
 //entre chaque changement de position
 delay (200);



Cordialement

lesaccrosduvol

Bonsoir
je suis désespéré toute  la journée j'ai chercher ou je pouvait le mettre j'ai toute essayer dans le programme mais à chaque fois j'avais une erreur si quelqu'un pouvait m'indiquer juste l'endroit ou écrire mon "A ," "J"  et "a" , "j"  afin de pouvoir aiguillier mon information vers le bon servo.

Je pense que la je ais droit dans le mur si sa se trouve je suis complètent à coté et je continu  sans même le savoir.
Peut être que une fois l'endroit où ,il faut que je mettent mes informations   "A ," "J"  et "a" , "j" m'auront été indiquer je comprendrai mieux

merci d'avance

fdufnews


A l'arrivée on teste si le caractère fait partie des majuscules ou des minuscules pour aiguiller la consigne vers le bon destinataire.
Suivant le destinataire on retire la constante ajoutée à l'émission (soit 65 (A), soit 97(97)) et on la passe au servo concerné.

Code: [Select]
if (Serial.available()>0) { // si un octet en réception

 OctetReception=Serial.read(); // Lit l'octet reçu et le met dans la variable
 if ((OctetReception>='A')&&(OctetReception<='J')){    // Si l'octet est une lettre majuscule
 OctetReception=OctetReception-'A'; // extrait la valeur numerique 0-9 à partir valeur ASCII
  // calcule la nouvelle position
 position_servo=map(OctetReception,0,9,0,180);
  //positionne le servomoteur
 mon_servo.write(position_servo);
 }
 if ((OctetReception>='a')&&(OctetReception<='j')) {    // Si l'octet est une lettre minuscule
 OctetReception=OctetReception-'a'; // extrait la valeur numerique 0-9 à partir valeur ASCII
  // calcule la nouvelle position
 position_servo1=map(OctetReception,0,9,0,180);
  //positionne le servomoteur
 mon_servo.write(position_servo1);
 }
 
 //entre chaque changement de position
 delay (200);
}

Go Up