Go Down

Topic: Demande d'aide programme Servo-moteur + joystick (Read 6235 times) previous topic - next topic

Pierrot63000

Jan 07, 2014, 10:00 am Last Edit: Jan 07, 2014, 10:04 am by Pierrot63000 Reason: 1
Bonjour, dans le cadre de mon Projet de Terminale je souhaite créer un programme Arduino qui permet de faire tourner un servo-moteur grâce à un joystick ( 2 servos en réalité , un sur chaque axe du joystick).
Pour l'instant j'ai réussi a faire tourner mon servo avec le joystick en utilisant le programme Knob prévu pour un potentiomètre et cela marche bien, mon problème est que lorsque je lâche le joystick et qu'il revient en position initiale, le servo revient aussi en position initiale, or je veux qu'il reste en place à sa dernière position.

Ce que je voudrais c'est un programme qui ferait qu'a chaque fois que je met un à-coup à gauche ou à droite, le servo incrémente de x degrés dans un sens ou dans l'autre et qu'il ne revienne pas en position initiale quand je relache le joystick. Etant un grand débutant en programmation je ne trouve vraiment pas comment faire, je vous demande donc un peu d'aide, si quelqu'un pouvait poster un programme simple qui puisse faire ça, ca m'aiderait beaucoup, je pourrais tester le programme cette après-midi en PPE car je n'ai pas le matériel chez moi.

Merci d'avance, Pierre.

EBanou

Bonjour,

Si ton servo revien à sa position initiale, tu as sans doute acheter un servo avec retour automatique. Normalement c'est un servo a rotation qu'il faudrait acheter

Pierrot63000

Le servo convient bien puisque quand je l'utilise avec le potentio il reste bien en place, c'est une histoire de programmation

EBanou

En fait quand tu relache le joystick c'est comme si tu bougeait le potentiomètre donc le servo retourne à la valeur initiale de ton potentiomètre

EBanou

Tien mais je sais pas si ça marche

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

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin
int total = 0; // variable de calcul
int tensionbouton = 13;
int valbouton = 14;

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode (tensionbouton, OUTPUT);
  pinMode (valbouton, INPUT);
  digitalWrite (tensionbouton, HIGH);
}

void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  total = total+val;
  myservo.write(total);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there

if (valbouton == 1){
total = 0;
}}

Comme tu le vois j'ai rajouté un bouton poussoir pour remettre le servo à sa position initiale

@+

B@tto

C'est quand même pas bien compliqué ... Il suffit juste, au lieu d'utiliser directement la variable qui correspond à la tension du potar, d'insérer une variable intermédiaire qui s'incrémentera ou se décrémentera. Dans l'idée ça donne :

Code: [Select]
x=analogRead(AxeX);
if(x>520) ConsigneServoX++;
if(x<500) ConsigneServoX--;
ConsigneServoX=constrain(ConsigneServoX,0,1023);
// et tu commandes ton servo avec ConsigneServoX au lieu de x
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

EBanou


C'est quand même pas bien compliqué ... Il suffit juste, au lieu d'utiliser directement la variable qui correspond à la tension du potar, d'insérer une variable intermédiaire qui s'incrémentera ou se décrémentera. Dans l'idée ça donne :

Code: [Select]
x=analogRead(AxeX);
if(x>520) ConsigneServoX++;
if(x<500) ConsigneServoX--;
ConsigneServoX=constrain(ConsigneServoX,0,1023);
// et tu commandes ton servo avec ConsigneServoX au lieu de x


Ouai mais bon, je l'aimais bien mon prog...  :~

B@tto

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

EBanou


B@tto

C'est presque bon : tel qu'il est total ne peut qu'augmenter puisque val ne peut être que positif (en plus que les 180 on s'en fiche un peu, il faut un incrément + constrain). Donc il faudrait plus quelque chose comme :

Code: [Select]

#include <Servo.h>
#define Increment 20;

void loop()
{
 val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
 val = map(val, 0, 1023, -Increment, Increment);    

 total = total+val;
total=constain(total,0,180);

 myservo.write(total);                  // sets the servo position according to the scaled value
 delay(15);                           // waits for the servo to get there

if (valbouton == 1){
total = 0;
}}


Et j'ai pas compris ce que tu voulais faire avec ton setup() et tensionbouton :

Code: [Select]
void setup()
{
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 pinMode (tensionbouton, OUTPUT);
 pinMode (valbouton, INPUT);
 digitalWrite (tensionbouton, HIGH);
}

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

EBanou

En gros je met une tension sur une groche de l'arduino qui est relié au bouton et le cable qui resort du bouton est relié à une autre broche qui mesurre la tension

B@tto

Ca ne fonctionnera pas, ton pin en INPUT sera flottant.
Beaucoup plus simple d'utiliser pinMode(pin,INPUT_PULLUP)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org


fdufnews

Ce serait pas plus simple de garder le programme du début et de virer le ressort de rappel du joystick.

B@tto

Je pense que l'idée c'était un positionnement, un peu comme une grue
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Go Up