Accueil > Forum > Electronique > Arduino > Ajout Joystick

Ajout Joystick

Fredblock Fredblock 20 Messages
Bonjour à toute et à tous

Etant en période de confinement (saleté de coronavirus), je passe le temps sur l'arduino, et donc sur mon drone.
Malgré le fait que se soit un stade beaucoup trop avancée pour mon niveau débutant, je m'y aventure tout de même.

Bref, aujourd'hui je n'ai malheureusement pas l'ensemble des composants nécessaires pour la réalisation complète de ma version personnel de drone (toujours lié au coronavirus, mes composants NRF24 ne sont pas arrivés à temps ...). je m'amuse donc, pour le moment, à faire un drone version filaire (haha oui pas commun).

Donc avant de configurer le capteur MPU selon le chapitre 7 et d'essayé de comprendre l'asservissement, il me faut remplacer l'accélérateur que j'avais précédemment (potentiomètre) par un Joystick.
Seulement je rencontre un problème.

Après avoir écrit mon code, compilé et téléversé, j'ouvre le moniteur série pour vérifier les bornes du joystick et la c'est le drame.
Il y a un mix entre la valeur moyenne (509) et 1000.
Lorsque je pousse le Joystick vers sa valeur max, il m'indique un mix 1000/1023
et vers sa valeur min, il m'indique un mix 0/1000.
Comme ceci :  (illustration pour le point 0 de joystick, centre)

7DxBd6W
J'ai d'abord pensé à un problème de faux contact. Mais après changement de joystick, maquettage sur breadboard vs uno, changement des fils : BIS REPETITA.

Il est donc possible que se soit mon code le défaut.
Le voici :

#include <Servo.h> //Appel de la library Servo.h
int joystick; //Variable joystick
int valeur = 0; 
Servo esc1 ; //Variable de type servo et de nom esc
Servo esc2 ; //Variable de type servo et de nom esc
Servo esc3 ; //Variable de type servo et de nom esc
Servo esc4 ; //Variable de type servo et de nom esc

void setup() {
  esc1.attach(4); //attribution de la pin 4 à la variable esc
  esc2.attach(5); //attribution de la pin 5 à la variable esc
  esc3.attach(6); //attribution de la pin 6 à la variable esc
  esc4.attach(7); //attribution de la pin 7 à la variable esc

  esc1.writeMicroseconds(1000); //attribution de la valeur mini
  esc2.writeMicroseconds(1000); //attribution de la valeur mini
  esc3.writeMicroseconds(1000); //attribution de la valeur mini
  esc4.writeMicroseconds(1000); //attribution de la valeur mini

  Serial.begin(115200);
}

void loop() {
  joystick = analogRead(A0);
  Serial.println(joystick);
  int valeuresc = map (valeur , 0 , 1023 , 1000 , 2000);
  esc1.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc
  esc2.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc
  esc3.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc
  esc4.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc
  Serial.println(valeuresc);
}

Je suis sur que vous voyez déjà le problème alors pouvez-vous m'orienter s'il vous plais ?

Merci par avance pour votre temps et votre patience.

Fred
lobodol lobodol 688 Messages BIG BOSS
Salut, tu peux donner la référence de ton joystick stp ?
A première vue je ne vois rien d'anormal  dans ton code.

Comment as-tu câblé ton bâton de joie à l'entrée analogique ?
Fredblock Fredblock 20 Messages
Hello

J'avais commandé sur banggood 2 joystick. Malheureusement j'en ai reçu 2 différents (merci banggood).
Le 1er avec 5 pins ( GND/+5V/VRX/VRY/SW) et le 2nd avec 9 pins ( SY/VCC/GND, SX/VCC/GND, SK/VCC/GND)
sur les 2, il n'y a qu'une seule inscription : B103 267.
Dans ma commande, il était notifié modèle KY-023 de chez KEYES.

Pour le câblage, j'ai branché le Y sur le pin A0 analog de la carte UNO.

Fred
lobodol lobodol 688 Messages BIG BOSS
Ok, du coup le câblage et le code ne sont pas bons.
Jette un œil à ce tuto : https://arduinomodules.info/ky-023-joystick-dual-axis-module/
Fredblock Fredblock 20 Messages
Hello

Merci pour ta réponse. J'ai résolu le problème, qui était le code. Je me suis inspiré du lien que tu m'as donné
Voici le code :


#include <Servo.h> //Appel de la library Servo.h
int valeur = 0; //Variable joystick
Servo esc1 ; //Variable de type servo et de nom esc1
Servo esc2 ; //Variable de type servo et de nom esc2
Servo esc3 ; //Variable de type servo et de nom esc3
Servo esc4 ; //Variable de type servo et de nom esc4

void setup() {
  esc1.attach(4); //attribution de la pin 4 à la variable esc1
  esc2.attach(5); //attribution de la pin 5 à la variable esc2
  esc3.attach(6); //attribution de la pin 6 à la variable esc3
  esc4.attach(7); //attribution de la pin 7 à la variable esc4

  esc1.writeMicroseconds(1000); //attribution de la valeur mini
  esc2.writeMicroseconds(1000); //attribution de la valeur mini
  esc3.writeMicroseconds(1000); //attribution de la valeur mini
  esc4.writeMicroseconds(1000); //attribution de la valeur mini

  Serial.begin(115200);
}

void loop() {
  valeur = analogRead(A0);
  Serial.print("Y");
  Serial.print(valeur);
  int valeuresc = map (valeur , 515 , 1023 , 1000 , 2000); //515 = un poil au dessus de la valeur correspondant à la position repos du potard, sur l'axe Y 
  esc1.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc1
  esc2.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc2
  esc3.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc3
  esc4.writeMicroseconds(valeuresc); //attribution de la variable mappée à l'esc4
  Serial.println(valeuresc);
}


Cela fonctionne.
Je ne m'y attendais pas, mais dans le moniteur, les inscriptions sont du type : Y/valeur du joystick entre 510 et 1023 / valeur mapé esc entre 1000 et 2000.
par exemple : Y5101000.
Ce n'est pas gênant.

Retour d'expérience intéressant : après essais sur le drone, il est plutôt difficile d'être précis avec le joystick, surtout dans les bas régime. Mais j'imagine que dans la pratique, c'est à dire drone en vol, nous sommes rarement en bas régime.
Mais la sensibilité au joystick est importante, j'imagine qu'elle vient avec le temps et la pratique lors de nombreux vols.

Je remarque une chose également, cela n'est pas lié au joystick, mais j'ai l'impression que les 20 ou 30 dernier % de gaz ne servent à rien.
A l'oreille il n'y aucune différence de régime à partir des 70 ou 80 % de gaz.
Je remet en cause l'apprentissage

Fred
lobodol lobodol 688 Messages BIG BOSS
Cool. Par contre tu n'as branché que l'axe Y du joystick, exact ?
Je ne m'y attendais pas, mais dans le moniteur, les inscriptions sont du type : Y/valeur du joystick entre 510 et 1023 / valeur mapé esc entre 1000 et 2000.
Oui c'est normal. Tu fais des "Serial.print" à la suite sans espaces, donc tout est collé.

En effet, on est assez rarement en bas régime. On y passe juste pendant les phases de décollage/atterrissage.
Fredblock Fredblock 20 Messages
Hello

Jusqu'à présent oui, je m'y attèle à partir de maintenant :)
J'ai déjà essayé d'espacer les "Serial.print", même des les séparer par la ligne "valeur = analogRead(A0);".
Sans succès.

En tout cas cette découverte du Joystick est intéressante, Je m'aperçois que la sensibilité est complètement différente. Il va falloir le manier avec grande précaution.

Fred
lobodol lobodol 688 Messages BIG BOSS
Tu dois mettre les espaces dans les Serial.print :


void loop() {
  Serial.print("un espace ici           ");
  Serial.println("Un autre là : ");
}

ce qui donnera

un espace ici           Un autre là : 
un espace ici           Un autre là : 
un espace ici           Un autre là : 
...
Kendy545 Kendy545 3 Messages
Salut, je m'introduis dans cette discussion parce que je constate que la commande se fait avec la librairie servo !

Faute de matériel disponible, je dois commander mon drone par l'appli Blynk (et un arduino MEGA wemos wifi) et en utilisant absolument cette libraire ! Dis, comment tu gères l'asservissement avec cette librairie ?

Chez moi j'ai essayé ; environ 5 secondes après le démarrage à 1100 us le tout s'arrête et les moteurs bippent.

Le code que j'ai utilisé c'est celui que tu nous a proposé au dernier chapitre sur le drone.
Vous devez être connecté pour pouvoir répondre à ce sujet.
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪