Servo et clavier

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 :slight_smile:

La librairie Serial pour recevoir les messages:

La librairie Servo pour piloter ton servo:

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

Merki beaucoup.
Effectivement, suffisait de chercher ^^

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

Hilsen

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 çà :

POur Processing, voir ici : Reference / Processing.org

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 :

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

A+ :wink:

Bonjour,

Merci de ta réponse :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

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.

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

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\pmwiki.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+

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

:wink:

A+