joystick arduino trop sensible

Bonjour, je suis dans le projet de me faire une mannette du type similaire à la ps4.

Mon objectif à terme est de pouvoir par un émetteur longue porté pilotter un drone mais le
problème actuel est que le passage du joystick de 0% à 100% est trop bref et pourtant je ne déplace qu’a peine celui ci , existe t il un moyen de le rendre moins sensible ? merci
"j ai des connaissances limité à se jour; voici le cod actuel

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

int altitude =0;
int puissance =0;
int inclinaisonX =0;
int inclinaisonY =0;

int joysticksw_1=2;
int joysticksw_2=3;
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
const int X_pinjoy2 = 2; // analog pin connected to X output
const int Y_pinjoy2 = 3; // analog pin connected to Y output
int lecturexjoystick1 = 0;


int lecturepourcalibrageX_pin;
int lecturepourcalibreageY_pin;
int lecturepourcalibrageY_pinjoy2;
int lecturepourcalibrageX_pinjoy2;

LiquidCrystal_I2C lcd(0x27,20,21);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
    lcd.init();                      // initialize the lcd 
  pinMode(joysticksw_1, INPUT);
  digitalWrite(joysticksw_1, HIGH);
    pinMode(joysticksw_2, INPUT);
  digitalWrite(joysticksw_2, HIGH);
  Serial.begin(115200);
    pinMode(23,INPUT);

    
lecturepourcalibrageX_pin= analogRead(X_pin);
lecturepourcalibreageY_pin=analogRead(Y_pin);
lecturepourcalibrageY_pinjoy2= analogRead(Y_pinjoy2);
lecturepourcalibrageX_pinjoy2= analogRead(X_pinjoy2);



delay(1000);
}


void loop()
{
int a =-10;
 int b =0;
 int c=a/b;
 
    // Serial.print("x pin : ");Serial.println (analogRead(X_pin));
//Serial.print("lecturepourcalibrageX_pin : ");Serial.println (lecturepourcalibrageX_pin);










    

 boolean TRIANGLE=digitalRead(23);// et on l’affecte à la variable "a"
   boolean CARRE=digitalRead(27);
    boolean ROND=digitalRead(29);
     boolean CROIX=digitalRead(25);
     
    boolean HAUT=digitalRead(22);
    boolean BAS=digitalRead(26);
    boolean GAUCHE=digitalRead(24);
    boolean DROITE=digitalRead(28);
    
     // boolean START=digitalRead();
     //   boolean SELECT=digitalRead();
     //     boolean R1=digitalRead();
     //       boolean R2=digitalRead();
     //         boolean L1=digitalRead();
     //           boolean L2=digitalRead();

    
    Serial.print("TRIANGLE : ");Serial.println (TRIANGLE);
    Serial.print("CARRE : ");Serial.println (CARRE);
    Serial.print("ROND : ");Serial.println (ROND);// on l'affiche sur le moniteur
    Serial.print("CROIX : ");Serial.println (CROIX);
    
      Serial.print("\n");
   
    Serial.print("HAUT : ");Serial.println (HAUT);
    Serial.print("BAS : ");Serial.println (BAS);
    Serial.print("GAUCHE : ");Serial.println (GAUCHE);
    Serial.print("DROITE : ");Serial.println (DROITE);

      Serial.print("\n");
      
  Serial.print("START : "); Serial.print("\n");
  
  Serial.print("SELECT : "); Serial.print("\n");
  
  Serial.print("R1 : "); Serial.print("\n");
  
  Serial.print("R2 : "); Serial.print("\n");
  
  Serial.print("L1 : "); Serial.print("\n");
  
  Serial.print("L2 : "); Serial.print("\n");

     
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Altitude : ");lcd.print(altitude);
  lcd.setCursor(15,0);
  lcd.print("M");
 lcd.setCursor(0,1);
  lcd.print("Puissance : "); lcd.print(puissance); 
   lcd.setCursor(15,1);
  lcd.print("%");
   lcd.setCursor(0,2);
   
  lcd.print("J1X:"); lcd.print(analogRead(X_pin)/5-lecturepourcalibrageX_pin/5); lcd.print("%"); 
  lcd.setCursor(10,2);
  lcd.print(" J2X:"); lcd.print(analogRead(X_pinjoy2)/5-lecturepourcalibrageX_pinjoy2/5); lcd.print("%");
   lcd.setCursor(0,3);
  lcd.print("J1Y:"); lcd.print(analogRead(Y_pin)/5-lecturepourcalibreageY_pin/5); lcd.print("%");
lcd.setCursor(10,3);
  lcd.print(" J2Y:"); lcd.print(analogRead(Y_pinjoy2)/5-lecturepourcalibrageY_pinjoy2/5); lcd.print("%");



  Serial.print("\n");
Serial.print("clickjoystick 1 : ");
  Serial.println(digitalRead(joysticksw_1));
  
  Serial.print("clickjoystick 2 : ");
  Serial.println(digitalRead(joysticksw_2));
  Serial.print("\n");


  
  Serial.print("joy1 X-axis: ");
  Serial.print(analogRead(X_pin)-lecturepourcalibrageX_pin);                                    //Serial.print(analogRead(X_pin)-507);
  Serial.print("\n");
  Serial.print("joy1 Y-axis: ");
  Serial.println(analogRead(Y_pin)-lecturepourcalibreageY_pin);
  Serial.print("");

  
Serial.print("joy2 x-axis: ");
  Serial.print(analogRead(X_pinjoy2)-lecturepourcalibrageX_pinjoy2);  
  Serial.print("\n");
  Serial.print("joy2 Y-axis: ");
  Serial.println(analogRead(Y_pinjoy2)-lecturepourcalibrageY_pinjoy2);
   
 

 
delay(200);
 Serial.print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
delay(200);
  lcd.clear();

}

existe t il un moyen de le rendre moins sensible ?

C'est quoi ton joystick ?

Tu devrais faire un petit code tout simple de quelques lignes pour lire le joystick et afficher les valeurs lues en fonction de la position, et faire une fonction qui te donne un pourcentage qui ne varie pas trop vite.

Ensuite, quand ce sera au point, tu la mettras dans ton programme

voici les joystick

à 50% d’appui celui ci m affiche la valeur a 100%

les valeurs vont de 0 à 1020
1020 arrive à 50% d appuis, les autre 50% de pression en plus n augmente pas la valeur à + de 1020

#include <Wire.h> 

const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
const int X_pinjoy2 = 2; // analog pin connected to X output
const int Y_pinjoy2 = 3; // analog pin connected to Y output
int joysticksw_1=2;
int joysticksw_2=3;

void setup() {
 // put your setup code here, to run once:
 pinMode(joysticksw_1, INPUT);
 digitalWrite(joysticksw_1, HIGH);
   pinMode(joysticksw_2, INPUT);
 digitalWrite(joysticksw_2, HIGH);
 Serial.begin(115200);
   pinMode(23,INPUT);
}

void loop() {
 // put your main code here, to run repeatedly:
Serial.print("\n");
Serial.print("clickjoystick 1 : ");
 Serial.println(digitalRead(joysticksw_1));
 
 Serial.print("clickjoystick 2 : ");
 Serial.println(digitalRead(joysticksw_2));
 Serial.print("\n");


 
 Serial.print("joy1 X-axis: ");
 Serial.print(analogRead(X_pin));                                    //Serial.print(analogRead(X_pin)-507);
 Serial.print("\n");
 Serial.print("joy1 Y-axis: ");
 Serial.println(analogRead(Y_pin));
 Serial.print("");

 
Serial.print("joy2 x-axis: ");
 Serial.print(analogRead(X_pinjoy2));  
 Serial.print("\n");
 Serial.print("joy2 Y-axis: ");
 Serial.println(analogRead(Y_pinjoy2));
  



delay(200);
}
[\code]

Essaye sans les lignes digitalWrite du setup

les valeurs vont de 0 à 1020
1020 arrive à 50% d appuis, les autre 50% de pression en plus n augmente pas la valeur à + de 1020

en théorie elles pourraient aller à 1023.. mais donc c'est que votre joystick ne se comporte pas comme étant à 512 au milieu, 1023 à fond et 0 au min... ce qui est (plus ou moins) sous entendu dans votre formule.


corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

Verifier la qualité de la connection GND

Si je fais une pression maximal vers le bas j obtien 0
si je laisse au repos j ai 500
si je met une pression maximal vers le haut j obtiens 1023

le problème est que pour atteindre ses valeurs maximal "0 &1023" je n ai pas besoin d émetre une pression à plus de 50% de la capacité de mouvement du joystick :confused:
le probleme c est que du coup passer de 0 à 1023 se fait sur un tout petit mouvement :blush: et comme je vais me faire un drone apres ...
, pour ce qui est du controle du GND je vais vérifier se soir mais je crois que tout est en ordre là :blush: j ai brancher les pattes du joystick sans incorporer tout autre composant , il n y a pas besoin d une resistance entre ?

Bonjour,

Il n'y a pas de solution. C'est du à la conception de ce joystick, il y a une zone morte assez importante de chaque coté.
On ne peut pas trop en demander à un joystick à 1$.

Je vois pleins de prix mais globalement c est entre 1 à 2 euro il y en a 16 euro donc je ne sais pas trop

j ai aussi un joystick sortie d un pack arduino starter et la zone morte est de la meme grandeur :confused:
je travail avec une atmega

malox56:
Je vois pleins de prix mais globalement c est entre 1 à 2 euro il y en a 16 euro donc je ne sais pas trop

j ai aussi un joystick sortie d un pack arduino starter et la zone morte est de la meme grandeur :confused:
je travail avec une atmega

Bonjour
avant de penser comment utiliser ton joystick avec un arduino , la bonne question à te poser est :

  • quelle est la résistance globale de la piste du potentiomètre ?
  • quelle est la resistance mesurée entre curseur et chacune des extrémités du potentiometre pour un positionnement du joystick
  • centré
  • 1/4 debut
  • 1/4 fin

pas besoin d'arduino pour çà ! :wink:

retour aux fondamentaux un simple ohmetre , papier crayon et çà suffit à faire un simple relevé

bon l'arduino peut aussi faire "ohmmètre"... et vous pourriez intégrer un "étalement" des valeurs sur la zone sensible...

mais j'ai pas trop envie de rentrer dans les détails vu que vous ne corrigez pas vos posts pour utiliser les balises...

Si le joystick n'est pas utilisable, il peut être remplacé par un potentiomètre et des boutons s'il faut cliquer. La différence c'est que le potentiomètre ne revient pas au milieu si on le lâche

"Artouste" je ne m'y connais pas là :s en réponse voici en vidéo les valeurs , en position 20k sur le multimetre j'ai au repos -17.88; à fond -0.10 et au 3/4 0.11 donc je pense que c est au niveau matériel le joystick a une zone morte assé important :confused:

"J-M-L" Merci pour m'avoir partagé la balise pour [.code] j'ai lut trop vite dans le train avant de répondre , mon précédent commentaire à été modifier.

Je reste cependant curieux de se que tu veux parler par étalement , je l'ais précédemment fais en terme de pourcentage allant du -100% à + 100% non ?

"lesept" , merci ce serais une solution mais de secour, mon but premier est d'utiliser un joystick

Si votre joystick n’a une zone sensible qu’étroite au lieu de faire une fonction linéaire sur toute sa course prenez une fonction Polynomiale bien adaptée pour gérer une dynamique dans la valeur lue

Ça n’inventera pas des valeurs après le point Max mais ça changera le ressenti entre le point neutre et le point Max

Vous pourrez aussi mettre une butée physique sur le joystick pour sentir ce point Max (suivant son design)

malox56:
"Artouste" je ne m'y connais pas là :s en réponse voici en vidéo les valeurs , en position 20k sur le multimetre j'ai au repos -17.88; à fond -0.10

Je regarderais ta video demain
mais déjà une valeur negative rendu par un ohmmètre , çà m'interpelle... un peu :smiley:

Petit réponse tardive car je rencontre exactement même problème.

En réaliser c'est simplement des potentiomètres non linéaire, se que l'on appelle la resistance taper.

Ce n'est pas un défaut ou une mauvaise qualité mais simplement une caractéristique du potentiomètre.

Il te faudrait trouver la datasheet de ton potentiomètre et regarder la courbe de la resistance taper et tu comprendrais de suite. Si tu fais un relever avec un ohmmètre tu vas voir que tu passe de 18 ohm à 500 ohm sur une débattement de 50% de +Y et 50 autre % tu passe de 400ohm à 4,7Kohm

J'ai chercher vite fais j'ai pas trouver.

Sur ton potentiomètre tu as écrie B (= profil de la courbe de résistance) 103 (= valeur max résistance).

On pourrais regarder les courbes des resistance taper d'une autre datasheet et associer la lettre B à une courbe mais il semblerait que en fonction des pays et norme les lettres puisse correspondre à des resistance taper différente.

Mon conseille achète des potentiomètres Alpine (RKJXV/RKJX2 Series - Potentiometer Type Multi Control Device - Alps Alpine)

Tu as 5 modèles différents et vraiment il sont pas excessif. En plus tu as des datasheet à jour avec une resistance taper linéaire qui te permet utiliser 90% du débattement. (10% de zone morte)

Ou si tu veux te prendre la tête, avec des math il est possible de lissé la courbe de la resistance taper mais pour ça il te faut soit la datasheet soi faire des relever toi même, tracer la courbe avec excel qui te donnera l'équation, puis tu demandera à l'arduino de la calculer. Mais bon il vas mettre beaucoup plus de temps.