Go Down

Topic: commande de servo moteur avec deux switch (Read 4685 times) previous topic - next topic

incubateur

Bonjours,

je suis novice dans le domaine de la programmation, avec quelque programme a mon actif mais rien de bien compliqué. J'aurais aimé savoir comment commander un servomoteur avec une bonne précision.

Enfaite mon programme serais simple: j'appuis sur un switch ( de type KRS0612 ) le servo tournerais dans un sens puis j'appuis sur l'autre switch le moteur tournerais dans l'autre sens. sans oublier qu'a chaque impulsion sur le switch le servo doit faire une rotation d'un angle le plus petit possible ( pour plus de précision )

Merci de bien vouloir m'aider  :)

erlik

#1
Dec 23, 2010, 06:09 pm Last Edit: Dec 24, 2010, 02:56 pm by erlik Reason: 1
Hello

Arduino propose une librairie  pour la gestion des servos:
http://arduino.cc/en/Reference/Servo
Pour utiliser un bouton, se référer à http://arduino.cc/en/Tutorial/Button

Si je comprend bien ce que tu veux faire, c'est faire tourner dans un sens le servo tant que le bouton est appuié, puis l'arreter si le bouton est relacher, et enfin le faire tourner dans l'autre sens si tu réappuies, etc etc ?

Si c'est bien ça, cela donne un code du style
Code: [Select]
#include <Servo.h>

Servo myservo;

int pos = 0;    // Position au démarrage
int servoPin = 9; // Servo à la pin 9
int switchPin = 3; // switch en pin 3
int orientationState = 0; //sens de rotation - 0 pour un sens, 1 pour l'autre ...

void setup()
{
 myservo.attach(servoPin);
 pinMode(switchPin, INPUT);  

}


void loop()
{
 
 while ( digitalRead(switchPin) == HIGH ) {
   if ( orientationState == 0 && pos < 180 ) {
       pos++;
   }else if ( orientationState == 1 && pos > 0 ) {
       pos--;
   }
         myservo.write(pos);
       delay(15);
 }

 orientationState = orientationState ^ 1;
}


incubateur

Merci,

le principe est bon, mais j'aurais aimé avoir la même chose avec deux switch: un pour le sens + et un pour le sens -

j'ai fait un programme pour commander mon servo, mais ce codage ne permet pas une grande précision du servo...
ce programme ci dessous marche bien mais pas du tout précis, es que vous auriez une solution pour permettre une plus grande précision ?

#include <Servo.h>

Servo myservo;  
               

int pos = 0;  
const int buttonPin1 = 2;
const int buttonPin2 = 3;
int buttonState1 = 0;
int buttonState2 = 0;

void setup()
{
 pinMode(buttonPin1, INPUT);
 pinMode(buttonPin2, INPUT);
 myservo.attach(9);
}


void loop()
{
 buttonState1 = digitalRead(buttonPin1);
 if (buttonState1 == HIGH) {    
   

   pos = pos+ 1;
   delay(10); }
 {                                  
   myservo.write(pos);              
   //delay(6);                    
 }
 
 buttonState2 = digitalRead(buttonPin2);
 if (buttonState2 == HIGH) {    
   
 
  pos = pos -1;
   delay(10);
 }  
 {                                
   myservo.write(pos);            
   //delay(6);                    
 }
 
}



erlik

Qu'entends-tu pas "pas assez précis" ? Le servo va trop vite ? l'arret au relâchement du switch n'est pas assez rapide ? ...

Sinon, pour ton code, je te conseille de vérifier si un seul des 2 boutons est poussé :

Code: [Select]
#include <Servo.h>

Servo myservo;  

int pos = 0;

const int buttonPin1 = 2;
const int buttonPin2 = 3;

int buttonState1 = 0;
int buttonState2 = 0;

void setup()
{
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
myservo.attach(9);
}

void loop()
{
 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);
 
 if (buttonState1 == HIGH && buttonState2 == LOW)
 {
   pos++;
 }
 else if (buttonState1 == LOW && buttonState2 == HIGH)
 {
   pos--;
 }

 myservo.write(pos);
 delay(15);
}

}


incubateur

Merci pour ce programme qui est vraiment parfait,

quand je dit plus précis, je pense au pas que décrit le servomoteur,
par exemple quand j'appuie une fois sur le switch le servo décrit un angle X.
Ce que j'entend par plus précis c'est que cette angle X soit le plus petit possible. Donc je me demande si il est possible de régler cette angle pour qu'il soit le plus petit possible (sachant tout de même que le servo a des limites).

incubateur

j'aurais une autre question également,

je cherche a faire tourner deux servomoteur dans des sens opposé avec seulement ces deux switch

j'ai fait ce programme ci dessous, je ne vois pas la faute.
Sachant qu'en faisant le montage les deux servomoteur ne répondent plus au commandes et tourne dans le même sens  :o

#include <Servo.h>

Servo myservo1;
Servo myservo2;
int pos = 0;

const int buttonPin1 = 2;
const int buttonPin2 = 3;

int buttonState1 = 0;
int buttonState2 = 0;

void setup()
{
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
myservo1.attach(9);
myservo2.attach(10);
}

void loop()
{
 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);

 if (buttonState1 == HIGH && buttonState2 == LOW)
 {
   myservo1.write(pos++);
   delay(15);
   myservo2.write(pos--);
   delay(15);
 }
 else if (buttonState1 == LOW && buttonState2 == HIGH)
 {
  myservo1.write(pos--);
  delay(15);
  myservo2.write(pos++);
  delay(15);
 }

 
}

erlik

c'est simple, tu indiques aux 2 servos la même position (int pos).
Utilise 2 variables posServo1 et posServo2. Et tu peux aussi vérifier que la position ne dépasse pas des valeurs limites d'angle

Code: [Select]
#include <Servo.h>

Servo myservo1;
Servo myservo2;

int posServo1 = 0;
int posServo2 = 0;

const int buttonPin1 = 2;
const int buttonPin2 = 3;

int buttonState1 = 0;
int buttonState2 = 0;

int angleMin = 0;
int angleMax = 180;

void setup()
{
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
myservo1.attach(9);
myservo2.attach(10);
}

void loop()
{
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);

if (buttonState1 == HIGH && buttonState2 == LOW)
{
  if (posServo1 < angleMax)
    posServo1++;
  if(posServo2 > angleMin )
    posServo2--;
}
else if (buttonState1 == LOW && buttonState2 == HIGH)
{
  if (posServo1 > angleMin )
    posServo1--;
  if (posServo2 < angleMax)
    posServo2++;
}

 myservo1.write(pos--);
 myservo2.write(pos++);
 delay(15);

}

incubateur

ce pourrais t-il qu'il y ai une erreur dans le programme que vous me proposé ? car il ne fonctionne pas ...

erlik

ha oui, en effet. Remplacer
Code: [Select]

 myservo1.write(pos--);
 myservo2.write(pos++);
 delay(15);


par
Code: [Select]

 myservo1.write(posServo1);
 myservo2.write(posServo2);
 delay(15);



incubateur

ah ^^
j'avais corrigé mais pas correctement.

Merci beaucoup, pour les conseilles, je vous souhaite de bonnes fêtes :D

incubateur

j'aurais une autres questions,

je voudrais faire la même chose avec un potentiomètre
une idée du code a faire ?

erlik

Je te conseille de regarder la doc du site, tu y trouveras (presque) tjs ton bonheur ;)
http://arduino.cc/en/Tutorial/Knob

incubateur

je consulte souvent ces aides! mais j'arrive pas a faire tourné un servo a l'inverse du sens de rotation du potentiomètre, j'ai essayer de bidouillé un peu le programme proposé par la doc du site mais sans succès...

erlik

Essaye en inversant le câblage du potentiomètre.
Sinon remplace val = map(val, 0, 1023, 0, 179); par val = map(val, 0, 1023, 179, 0);, ça devrait marcher

Go Up