Pages: [1]   Go Down
Author Topic: Servo et clavier  (Read 2557 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3566
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !!
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merki beaucoup.
Effectivement, suffisait de chercher ^^
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Hilsen
Logged

France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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+ smiley-wink




Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Merci de ta réponse smiley-wink

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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();
}


Logged

France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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+
Logged

France - Morbihan
Offline Offline
Newbie
*
Karma: 0
Posts: 42
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 smiley-wink

A+
Logged

Pages: [1]   Go Up
Jump to: