Go Down

Topic: Servo et clavier (Read 2813 times) previous topic - next topic

Pacman

Bonjour,
Je suis débutant avec arduino et son language de programmation et je ne sait pas comment controllé un servo avec le clavier c'est a dire, par exemple, le faire tourner de 10% a chaque fois que j'appuie sur la touche "a" et le faire tourné dans l'autre sens lorsque j'appuie sur B...

Voila
Merci :)

fdufnews

La librairie Serial pour recevoir les messages:
http://arduino.cc/en/Reference/Serial

La librairie Servo pour piloter ton servo:
http://arduino.cc/en/Reference/Servo

On mélange les ingrédients
Et hop ça roule !!

Pacman

Merki beaucoup.
Effectivement, suffisait de chercher ^^

Hilsen

Salut la compagnie !!!


Je suis dans le même cas que toi, j'aimerais diriger un servomoteur par l'intermédiaire du clavier de l'ordinateur.

La méthode donnée permet d'interagir avec le servomoteur par la boite de dialogue (console).
Il faut a chaque fois, entrer une valeur ou une lettre puis valider son choix pour que le servomoteur s'execute.

Ne serait-il pas possible d'interagir directement avec le servo?

Par exemple, avec les fleches gauche et droite, j'indique au moteur quand il doit tourner. Si je lache la touche, le servomoteur s'arrete...

Est-ce possible???

Merci de vos réponses ;)


Hilsen

sensor56

Salut,

pour contrôler directement le Servo depuis le PC, tu peux passer par l'interface processing : l'appui sur un "bouton" affiché à l'écran va envoyer directement une instruction série à la carte Arduino. Tu peux t'inspirer de çà :

http://arduino.cc/en/Tutorial/PhysicalPixel

POur Processing, voir ici : http://processing.org/reference/

Sinon, si tu veux absolument contrôler ton servo à partir d'un bouton, le plus simple est d'utiliser 2 Boutons poussoirs directement sur des broches de la carte Arduino. cf ici au besoin : http://arduino.cc/en/Tutorial/Button

Enfin, Processing te permet de savoir quelle touche du clavier est tapée : tu dois donc pouvoir envoyer çà à la carte sans problème...
Voir dans Processing :Menu File>examples>Basics>Input>Keyboard.

Voir aussi : l'instruction Keypressed() dans la référence Processing :
http://processing.org/reference/keyPressed_.html

Avec çà, tu devrais trouver ton bonheur et à commander ton servo directement depuis le PC soit via interface graphique, souris, ou clavier...

A+ ;)





Hilsen

Bonjour,

Merci de ta réponse ;)

Cependant, je n'arrive toujours pas a diriger le servo... :s

En réalité, j'essaie de créer un bras robot... je dois piloté 6 servos.

Voici mes programmes:
                   Arduino:

#include <servo.h>
#define INCR  1
 
// on déclare les servomoteurs comme des variables typées de la librairie servo.h
Servo servo1;  
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;

// angles actuels des servomoteurs  
int angle1 = 0;
int angle2 = 180;
int angle3 = 180;
int angle4 = 0;
int angle5 = 90;
int angle6 = 90;

//  Vérification de positionnement initial
int initialisation = 0;

// Valeur reçue lors d'un appui sur une touche clavier
char touche;

/**  
* Initialisation du programme  
*/  
void setup()  
{  
 Serial.begin(9600); // Initialise la communication serial
 
 servo1.attach(56); // le servomoteur 1 est sur le pin 56 qui correspond à ANALOG 2  
 servo1.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

 servo2.attach(59); // le servomoteur 2 est sur le pin 59 qui correspond à ANALOG 5  
 servo2.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

 servo3.attach(60); // le servomoteur 3 est sur le pin 60 qui correspond à ANALOG 6  
 servo3.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

 servo4.attach(57); // le servomoteur 4 est sur le pin 57 qui correspond à ANALOG 3  
 servo4.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

 servo5.attach(61); // le servomoteur 5 est sur le pin 61 qui correspond à ANALOG 7  
 servo5.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

 servo6.attach(58); // le servomoteur 6 est sur le pin 58 qui correspond à ANALOG 4  
 servo6.setMaximumPulse(2300); // 2,35 ms pour la valeur maximum  

}  
 
/**  
* Boucle infinie qui va gérer les mouvements du bras robot  
*/  
void loop()  
{  
/**  
* Mise en position initiale
*/  
   while (initialisation == 0)
   {
     if (angle1 > 0)            // Calcul de l'angle du servo1
     { angle1 -= INCR; }
     if (angle2 < 180)            // Calcul de l'angle du servo2
     { angle2 += INCR; }
     if (angle3 < 180)            // Calcul de l'angle du servo3
     { angle3 += INCR; }
     if (angle4 > 0)            // Calcul de l'angle du servo4
     { angle4 -= INCR; }
     if (angle5 < 135)            // Calcul de l'angle du servo5
     { angle5 += INCR; }
     if (angle5 > 135)
     { angle5 -= INCR; }
     if (angle6 < 45)            // Calcul de l'angle servo6
     { angle6 += INCR; }
     if (angle6 > 45)
     { angle6 -= INCR; }
     if (angle1 == 0 && angle2 == 180 && angle3 == 180 && angle4 == 0 && angle5 == 135 && angle6 == 45) // Vérification des angles des servomoteurs
     { initialisation += INCR; }
     delay(10);                           //
     servo1.write(angle1);         // Ce bloc permet
     servo2.write(angle2);         // la mise en
     servo3.write(angle3);         // position des
     servo4.write(angle4);         // servomoteurs
     servo5.write(angle5);         // suivant les
     servo6.write(angle6);         // angles calculés
     Servo::refresh();             //
   }

  if (Serial.available() > 0) // On detecte un appui sur une touche
  {
    touche = Serial.read(); // On lit la valeur de la touche appuyée

/**
* Retour en position initiale (touche "R" du clavier)
*/
     if (touche == 'R')
     { initialisation = 0; }
   
/**  
* Rotation du bras robot en sens anti-horaire, vers la gauche (touche "K" du clavier)
*/  
     if (touche == 'K')
     {
         if (angle1 < 180)
         { angle1 += INCR; }
     }

/**  
* Rotation du bras robot en sens horaire, vers la droite (touche "M" du clavier)
*/      
      if (touche == 'M')
     {
         if (angle1 > 0)
         { angle1 -= INCR; }
     }
   
/**  
* Extension du bras robot (touche "O" du clavier)
*/
     if (touche == 'O')
     {
         if (angle2 > 90)
         {
           angle2 -= INCR;
           angle3 -= 2 * INCR;
           angle4 += INCR;
         }
     }

/**  
* Pliage du bras robot (touche "L" du clavier)
*/    
     if (touche == 'L')
     {
         if (angle2 < 90)
         {
           angle2 += INCR;
           angle3 += 2 * INCR;
           angle4 -= INCR;
         }
     }
   
/**  
* Ouverture de la pince (touche "I" du clavier)
*/  
     if (touche == 'I')
     {
       if (angle5 < 135)
         {
           angle5 += INCR;
           angle6 -= INCR;
         }
     }
     
/**  
* Fermeture de la pince (touche "P" du clavier)
*/  
     if (touche == 'P')
     {
       if (angle5 > 90)
       {
         angle5 -= INCR;        
         angle6 += INCR;      
       }
     }
    }
   delay(10);               //
   servo1.write(angle1);         // Mise en place
   servo2.write(angle2);         // des servomoteurs
   servo3.write(angle3);         // en fonction des
   servo4.write(angle4);         // angles calculés
   servo5.write(angle5);         // dans les étapes
   servo6.write(angle6);         // précédentes.
   Servo::refresh();            //

}  


                     Processing:

import processing.serial.*;

Serial port;
String portname = "/dev/COM4";

void setup()
{
 size(100, 100);
 port = new Serial(this, portname, 9600);
}


void keyPressed()
{
   if (key == 'O' || key == 'o')
   { port.write('O'); }
   else if (key == 'P' || key == 'p')
   { port.write('P'); }
   else if (key == 'R' || key == 'r')
   { port.write('R'); }
   else if (key == 'K' || key == 'k')
   { port.write('K'); }
   else if (key == 'L' || key == 'L')
   { port.write('L'); }
   else if (key == 'M' || key == 'm')
   { port.write('M'); }
 }
}



Vois-tu ce qui ne va pas?


Cordialement

Hilsen

PRADELOU

Salut hilsen,

j'ai le même problème que toi.
Quand on est débutant c'est pas évident, mais lorsque l'on trouvera la solution on dira "pfffffff comment on n'a pas pu trouver ça plutot!!!! ;D"

le soucis vient de processing car quand tu test ton code sur serial monitor les commandes répondent.

Par contre qu'est ce qui ne va pas dans processing ' je cherche toujours'

dès que j'ai du nouveau je te tiens au courant.

PRADELOU

salut hilsen.
J'ai trouvé.
essais ça dans processing:

c'est un exemple, donc remplace ton port et les touches du clavier qui t'intéressent !!!



import processing.serial.*;      
Serial port;  
String portname = "COM4";

void setup()
{
 size(120, 120);
port = new Serial(this, portname, 19200);
}

void draw()
{
 background(0.0);
}

void keyPressed()
{
  if (key == 'w' || key == 'W')
  { port.write('w'); }
  else if (key == 's' || key == 'S')
  { port.write('s'); }
  else if (key == 'a' || key == 'A')
  { port.write('a'); }
  else if (key == 'd' || key == 'D')
  { port.write('d'); }
 }

si ça ne marche pas, remplace dans arduino la fonction void loop:
adapte mon code à tes besoins

void loop(void)
{
char val = Serial.read();
if(val!=-1)
{
switch(val)
{
case 'w'://avancer
advance (100,100); //réglage vitesse
break;
case 's'://reculer
back_off (100,100);
break;
case 'a'://tourner à gauche
turn_L (100,100);
break;
case 'd'://tourner à droite
turn_R (100,100);
break;
}
delay(4000);
}
else stop();
}



sensor56

Salut,

pour compléter une réponse que j'avais déjà faite sur ce fil, je vous met le lien vers un exemple que j'ai mis en ligne et qui permet la commande d'un servomoteur à partir du clavier du PC depuis Processing.

C'est ici :
http://127.0.0.1/pmwiki_mon_club_elec%5Cpmwiki.php?n=MAIN.ArduinoExpertServoControlePositionClavierPC

Ce n'est certes qu'une base pour un développement plus conséquent, mais çà montre le principe et surtout çà marche.

Ne pas oublier de modifier les valeurs de positions max/min au besoin... (çà dépend des servomoteurs).

A+

sensor56

Le lien ci-dessus est erroné... désolé. Le bon lien est :

http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertServoControlePositionClavierPC

;)

A+

Go Up