Poll
Question: comment commander un servoteur avec précision?
2 switch ( rotation +/- ) - 0 (0%)
précision - 0 (0%)
Total Voters: 0

Pages: [1]   Go Down
Author Topic: commande de servo moteur avec deux switch  (Read 4444 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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;
}
« Last Edit: December 24, 2010, 08:56:52 am by erlik » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}
 
}

Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

  
}
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
 
}
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ha oui, en effet. Remplacer
Code:
 myservo1.write(pos--);
  myservo2.write(pos++);
  delay(15);

par
Code:
 myservo1.write(posServo1);
  myservo2.write(posServo2);
  delay(15);

Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Merci beaucoup, pour les conseilles, je vous souhaite de bonnes fêtes smiley-grin
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'aurais une autres questions,

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: