Programme Joystick Arduino

Bonjour
Je souhaite programmer un joystick pour commander deux moteur DC avec la shield adafruit.

J’ai commencé le programme, mais je me trouve confronter à quelques petits soucis.

Le programme :

// Librairie Adafruit
#include <AFMotor.h>

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A4;
const int yMin = 0;
const int yMax = 1023;
AF_DCMotor motor_dc_1(1, MOTOR12_2KHZ);
AF_DCMotor motor_dc_2(2, MOTOR12_2KHZ);

// Définition des variables 
int lecX, lecY, calX, calY, retX, retY;

void setup () {
// Initialisation port serie
Serial.begin(9600);

}

void loop() {

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(lecX, xMin, xMax, -255, 255);
retY = map(lecY, yMin, yMax, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();

}

Jusque là tout fonctionne, mais le soucis c’est que le joystick n’est pas calibré au départ en 0,0

Donc j’ai ajouté cela au programme :

// Librairie Adafruit
#include <AFMotor.h>

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A4;
const int yMin = 0;
const int yMax = 1023;
AF_DCMotor motor_dc_1(1, MOTOR12_2KHZ);
AF_DCMotor motor_dc_2(2, MOTOR12_2KHZ);

// Définition des variables 
int lecX, lecY, calX, calY, retX, retY;

void setup () {
// Initialisation port serie
Serial.begin(9600);

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);


}

void loop() {


[b]// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;[/b]

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, xMin, xMax, -255, 255);
retY = map(calY, yMin, yMax, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();

}

Mais plus rien ne fonctionne.

Ce que je souhaite, c’est que lorsque le joystick est au repos les valeurs soit 0,0 et quand on l’actionne en x et y les valeurs max soit -255, 255.

Le premier programme fonctionne bien, mais au repos le joystick n’a pas les valeurs 0,0 car avec le temps les ressorts des potentiomètres s’usent et il y a un léger jeu.

Merci de votre aide

Edite ton message et mets le code entre les balises code

c’est fait et c’est mieux :wink:

tu as inversé "cal" et "lec"

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;

Ca fonctionne. Merci

Reste le plus complexe. Calculer la vitesse des moteurs en fonction de la position du joystick.

Je reviendrais si j’ai un soucis :wink:

Bonsoir

encore un petit soucis dans mon code. Pour information : la shield pour les moteurs est la shield adafruit v1.2.

Au niveau de la vitesse, ça fonctionne. Là, où ça coince c’est le code pour inverser les moteurs dans leur sens de marche en fonction de la position du joystick, donc la fin du programme. J’ai mis le code en entier et en dessous la partie qui pose problème.

Si je prends une seule partie test, les moteurs tournent dans le bon sens, si je prends une autre partie test les moteurs s’inversent bien, mais dès que je cumule deux voire plus de partie test, les moteurs ne tournent plus que dans un sens.
Je me trompe où ?

// Librairie Adafruit
#include <AFMotor.h>

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A4;
const int yMin = 0;
const int yMax = 1023;
AF_DCMotor motor_dc_1(1, MOTOR12_2KHZ);
AF_DCMotor motor_dc_2(2, MOTOR12_2KHZ);

// Définition des variables
int lecX, lecY, calX, calY, retX, retY, vit;

void setup () {
// Initialisation port serie
Serial.begin(9600);

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);
}

void loop() {

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;


// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, xMin, xMax, 0, 512);
retX= constrain(calX, -255, 255);
retY = map(calY, yMin, yMax, -255, 255);
retY = constrain(calY, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();
delay(50);

if (abs(retX) > abs(retY))
{
vit = abs(retX);
}
else
{
vit = abs(retY);
}


//Vitesse et direction moteurs
if (((lecX) > (1)) && ((lecY) < (-1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(FORWARD);
}

else if (((lecX) < (-1)) && ((lecY) < (-1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(BACKWARD);
}
else if (((lecX) < (-1)) && ((lecY) > (1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(FORWARD);
}

else if (((lecX) > (1)) && ((lecY) > (1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(BACKWARD);
}
else
{
motor_dc_1.setSpeed(0); 
motor_dc_1.run(RELEASE);
motor_dc_2.setSpeed(0); 
motor_dc_2.run(RELEASE);
}
}
if (abs(retX) > abs(retY))
{
vit = abs(retX);
}
else
{
vit = abs(retY);
}


//Vitesse et direction moteurs
if (((lecX) > (1)) && ((lecY) < (-1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(FORWARD);
}

else if (((lecX) < (-1)) && ((lecY) < (-1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(BACKWARD);
}
else if (((lecX) < (-1)) && ((lecY) > (1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(FORWARD);
}

else if (((lecX) > (1)) && ((lecY) > (1)))
{
motor_dc_1.setSpeed(vit); 
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit); 
motor_dc_2.run(BACKWARD);
}
else
{
motor_dc_1.setSpeed(0); 
motor_dc_1.run(RELEASE);
motor_dc_2.setSpeed(0); 
motor_dc_2.run(RELEASE);
}

}

bonjour
exemple d’un code simple permettant d’inverser le sens de rotation et la vitesse d’un moteur CC
avec un pont en H avec un simple potentiometre , arret au centre , max aux extremités .
c’est facilement transposable à d’autres types de motorisation

// Vmax CCW <--->stop<---->Vmax CW
// pour utilisation d'un pont en H avec un moteur CC 
// un pin pour le sens , un pin pour la vitesse 

int pwm = 9;           //   pwm Vitesse
int hyst=5; // hysteresis soft (zone morte) 
int sensorPin = A0;    // entree ana , connecter un pot curseur sur A0 , extrem sur VCC et GND 
int ledPin = 13;      // Sortie sens sur 13 pour visu 
                      
word vpm=0;

word sensorValue = 0;  
void setup()
{
  pinMode(pwm, OUTPUT); 
  pinMode(ledPin, OUTPUT); 
 Serial.begin(9600); 
}

void loop()
{
sensorValue = analogRead(sensorPin); 
vpm=sensorValue/2;
if (vpm > 255) 
{
  digitalWrite(ledPin, HIGH); // CW
vpm=vpm-256; 

}
else
{
  digitalWrite(ledPin, LOW); //CCW
vpm=255-vpm;
}

if (vpm < hyst) vpm=0; // application hysteresis soft 
  Serial.println(vpm, DEC);
  analogWrite(pwm, vpm);  
}

Merci Artouste, mais le problème ne se situe pas à ce niveau car la librairie Adafruit le permet très facilement.

Le problème si situe au niveau du repérage de la position joystick

J’ai trouvé la solution en ajoutant une valeur absolue à la variable vit
motor_dc_1.setSpeed(abs(vit));

Mais je ne comprends pas bien pourquoi car avant je définis vit en valeur absolue. Alors je ne vois pas pourquoi je dois à nouveau remettre abs.

Si dessous l’ancien code. Pour que cela fonctionne, je dois ajouter abs devant vit pour tout le morceau de code dans //Vitesse et direction moteurs

Il est où mon soucis. Je me débrouille mal avec la définition de vit avant ?

if (abs(retX) > abs(retY))
{
vit = abs(retX);
}
else
{
vit = abs(retY);
}


//Vitesse et direction moteurs
if (((lecX) > (1)) && ((lecY) < (-1)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(FORWARD);
}
else 
else
{
motor_dc_1.setSpeed(0);
motor_dc_1.run(RELEASE);
motor_dc_2.setSpeed(0);
motor_dc_2.run(RELEASE);
}

}