Demande d'aide programme Servo-moteur + joystick

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.

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

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

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

Tien mais je sais pas si ça marche

#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

@+

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 :

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

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 :

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... :~

Je parlais pas à toi :wink:

Sinon, ça marche mon programme ?

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 :

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

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

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

Ca ne fonctionnera pas, ton pin en INPUT sera flottant.
Beaucoup plus simple d'utiliser pinMode(pin,INPUT_PULLUP)

oK merci

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

Je pense que l'idée c'était un positionnement, un peu comme une grue