Contrôler plusieurs servomoteurs via PC.

Bonjour à tous

Je suis l’heureux possesseur d’une ardu ino « Uno » .

Je débute dans le domaine mais j’ai déjà quelques connaissances.

Mon objectif en ce moment est de contrôler 2 servomoteurs voir plus avec mon ordinateur.
Je m’inspire de ce « tuto » : Contrôler la position d'un servomoteur à partir du clavier PC. - Mon Club Elec

J’ai déjà réussi à le faire, même à changé les touche de commande (utiliser les flèches gauche et droite du clavier au lieu de haut et Bas) .
Mais là je suis face à un mur je veux pour voir contrôlé deux servomoteurs de façon séparés, un avec les touches au et bas, et le deuxième avec les touches droite et gauche .Cela fait bien 2 jours que je travaille dessus et aucun succès même le plus infime

Si quelqu’un avait la solution afin de pouvoir me débloquer et enfin pouvoir continuer mon projet.

Merci d’avance.

Cordialement

Bonsoir,
Tu dois avoir une erreur ligne 14. Je plaisante bien sur, il faut mettre ton code pour voir ce qui se passe.
@+

Bonsoir
Tout d'bord je tien à te remercier de ta réponse.

Le problème est bien là pour le moment la seule chose que j'ai réussie à faire c'est essayer de "bricoler" le code d'origine sans aucun succès et j'ai refait la manipulation plusieurs fois déjà. Je pense que cela dépasse de beaucoup mes connaissances actuelles.

Donc si quelqu'un aurait un code qui se rapprocherait de près ou de loin à l'objectif que je me suis fixé je suis preneur afin de pouvoir comprendre le fonctionnement et m'en inspirer

cordialement

Bonjour,
As-tu réussi à faire fonctionner, sans bricolage, le code que tu sites en référence ?
@+

icare:
Bonjour,
As-tu réussi à faire fonctionner, sans bricolage, le code que tu sites en référence ?
@+

Bonjour

Oui le code de référence j'ai réussi facilement à le faire fonctionner sans rien changer du tout

Cordialement

Bonjour,
En survolant rapidement le code de référence, il faut que tu déclares 2 objets servo (par exemple mon_servo et mon_servo2 qui sont sur des pins différentes) le processus de traitement de mon_servo2 est similaire à mon_servo.
Lors de la réception des ordres via le port série, il faut que tu fasses la différence entre les ordres pour mon_servo et mon_servo2 (par exemple les touches haut et bas commandent mon_servo et les touches droite et gauche commande mon_servo2).
Un peu de réflexion et tu trouveras la similitude des lignes de programme.
Si tu as des difficultés, n'oublie pas de mettre ton programme dans le prochain post
@+

icare:
Bonjour,
En survolant rapidement le code de référence, il faut que tu déclares 2 objets servo (par exemple mon_servo et mon_servo2 qui sont sur des pins différentes) le processus de traitement de mon_servo2 est similaire à mon_servo.
Lors de la réception des ordres via le port série, il faut que tu fasses la différence entre les ordres pour mon_servo et mon_servo2 (par exemple les touches haut et bas commandent mon_servo et les touches droite et gauche commande mon_servo2).
Un peu de réflexion et tu trouveras la similitude des lignes de programme.
Si tu as des difficultés, n'oublie pas de mettre ton programme dans le prochain post
@+

Bonjour

D'accord. Merci à toi je comprends mieux maintenant c'est le code processing qui me pose problème (le sort s'acharne ]:smiley: )
Je ne vois pas comment mettre un deuxième rectangle que je contrôlerai avec les touches gauche et droite

// programme Processing
// par X. HINAULT - 02/2010
// www.mon-club-elec.fr

// Interface Vumètre réglable par clavier HAUT/BAS et envoi série vers arduino valeur 0-9

// 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; // 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(100,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

  //----- 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  

    }

} // fin if key==coded

// 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

}

//------- souris -------
//void mousePressed() { // est appelée à chaque fois qu'un bouton de la souris est appuyé

//  }

//------- gestion du port Série ------

 //void serialEvent (Serial myPort) {



 // }  // fin gestion port série

Pour le moment j'ai juste réussi à utiliser le touche gauche et droite en changeant deux petits trucs dans le code mais je n'ai pas réussi à le faire fonctionner avec les touches haut et bas en même temps et indépendamment les une des autres.

Cordialement

Bonjours et Bonne Année à tous

Alors j'ai fait des recherche et j'ai trouver sa Contrôler la rotation de 2 servomoteurs (tourelle pan/tilt) à partir d'une interface Processing - Mon Club Elec
C'est pas tout à fait ce que je voulais mais je peu essayer .

Problème j'ai un problème avec le code

Quand je fais vérifier il me détecte une erreur au niveau de "chaineReception=chaineReception.trim(); // enlève les espaces" (désolé je n'arrive pas à l'afficher sur le post )

Si quelqu'un à la solution à mon problème

Cordialement

Bonsoir,
Côté processing, je ne peux pas t'aider, je n'ai aucune pratique.
Par contre, côté Arduino, lorsque que tu reçois un octet sur le port série, il faut que tu analyses le caractère reçu si c'est un gauche, droite, haut ou bas.
Si c'est le caractère haut ou bas alors tu traites le cas 1
Si c'est le caractère gauche ou droite alors tu traites le cas 2
@+

Bonjours

Parle tu de ce code là ?
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertServoPanTiltControlePositionProcessing?action=sourceblock&num=1

Parce que je pense l'utiliser puis changer le code proccesing par la suite afin de le contrôler avec le clavier mais pour le moment je bloque au niveau de" chaineReception=chaineReception.trim(); // enlève les espaces "

Je vais déjà essayer de faire fonctionner celui là pour ensuite entreprendre des choses plus difficiles

Cordialement

bonjours

Pour ceux que cela pourrait intéresser , voici un lien qui explique d'où venait le problème chaineReception=chaineReception.trim(); // enlève les espaces

http://forum.snootlab.com/viewtopic.php?f=24&t=504

cordialement