Module Grove Joystick

Bonjour,

J'ai un petit problème avec un module Grove Joystick.

Tout d'abord une petite question peut-être stupide mais je n'ai pas trouvé de réponses claires et précises: Peut-on utiliser un module Grove directement sur une carte Arduino.

Si c'est possible je ne comprend pas comment cela fonctionne.

Je m'explique:

Je dois réaliser un bras articulé pour un projet scolaire. Pour cela je compte utiliser des servomoteurs commandés par ce Joystick.

J'ai déjà réalisé un câblage test avec des composants que je possédait (un autre joystick non Grove entre autre) et cela fonctionnait sans problème particuliers.

En revanche avec ce module mon programme ne fonctionne plus. Je suis censé récupérer en entrée une valeur proche de 500. Or quand j'utilise le moniteur série, la valeur affichée est de 0 (x ou y). De plus cette valeur passe à environ 70 (valeur non précise) alors que je ne touche pas le joystick.

Pouvez-vous m'aider à résoudre ce problème?

Merci d'avance

de mémoire les valeurs fournies par un Grove Joystick seront uniquement entre ~200 et ~800 - pas 0 et 1023
si vous appuyez sur le bouton alors X passe à 1023

assurez vous de bien connecter l'alimentation et la masse (même masse que sur l'Arduino si vous avez une alimentation séparée) et de lire la valeur analogique depuis la bonne pin.

C'est bien le problème. Sur l'ancienne version que j'ai réalisée, je récupère bien des valeurs autour de 500.

Seulement avec ce module, je récupère des valeurs de 0 au départ et de temps en temps des valeurs autour de 70.

Mes broches sont a priori bien connectée (je n'ai pas le montage à l'heure où je vous répond, je pourrais faire des tests demain).

Même la doc du module me dit que la valeur par défaut est autour de 500 mais cela n'est pas le cas lorsque je la visualise avec le moniteur....

J'en conclue que l'on peut utiliser un module directement avec l'Arduino sans platine mère?

En tout cas merci de votre réponse.

faudrait un lien sur votre produit... s'il ressemble à cela, il n'y a aucune raison de ne pas pouvoir l'utiliser sur votre arduino directement

il se peut bien sûr qu'il soit cassé...

C'est exactement celui-là :slight_smile:

Je posterait les résultats que j'obtiens demain avec le moniteur après avoir vérifié tous les branchements.

Si je ne trouve pas de problème, comment savoir s'il est cassé?

il y a 4 fils à brancher Vcc à 5V (attention la tension est importante entre 4.75 et 5.25), GND et X et Y par exemple sur A0 et A1

ensuite faites tourner ce code (console à 115200)

 void setup() 
{
    Serial.begin(115200);
}

void loop() 
{
    int X = analogRead(A0);
    int Y = analogRead(A1);
    Serial.print(X); Serial.print("\t"); Serial.println(Y);
    delay(200);
}

Quelles pins avez vous connecté où?

Bonjour,

Voici donc ce que j'obtiens avec mon programme:

Et voici ce que j'obtiens avec votre programme (je ne pense pas que recevoir des lettres soit une bonne chose ...):

J'ai branché X sur A0, Y sur A1, et le +5V et GND sur ma platine reliée au +5V et GND de l'Arduino.

Je comprends de moins en moins ce qui se passe avec ce Joystick ^^

PS: (Je ne suis pas un pro des forums alors je ne sais pas si j'arriverais à insérer les images ^^)

Comme mentionné plus haut - Avec mon programme il faut mettre la console série à 115200 bauds(en bas droite de votre fenêtre, dans le pop up menu à la place de 9600.)

D'une manière générale d'ailleurs il n'y a aucune raison de rester à 9600 alors que les arduino d'aujourdhui (depuis quelques années en fait) fonctionnent sans aucun pb à 115200. Ralentir les programmes surtout quand on utilise le Serial.print pour du debug peut créer d'autres problèmes

Effectivement je n'avais pas compris cette étape ^^

Donc cela fonctionne bien quand il est seul:

Je vais donc revérifier mon programme afin de voir si je trouve des erreurs.

La vitesse c'est ce que vous mettez dans Serial.begin(9600); --> autant aller 12 fois plus vite et mettre 115200 :slight_smile:

Si vous postez votre code source on peut jeter un oeil

Voila le code: (je suis débutant donc si vous voyez des aberrations c'est normal ^^)

/
/Utilisation d'une "extension" pour les servomoteurs//
#include <Servo.h> 

//Définition du nom des servos//
Servo myServo1;
Servo myServo2;
Servo myServo3;

//Définition des broches de la carte//
int const JoyPin1=A0;
int const JoyPin2=A1;
int const ServoPin1=9;
int const ServoPin2=10;
int const ServoPin3=11;
int const ButtonPin=7;
int const ButtonPin2=6;
int const MotorPin1=2;
int const MotorPin2=4;
int const MotorPWM=3;

//Définition de variables//
int x_value=500;
int y_value=500;
int x_angle=90;
int y_angle=90;
int switchstate=0;
int inc_x=10;
int inc_y=10;

//Initialisation du programme//
void setup() {
  // Code executé unze seule fois au lancement//
  
//Définition des servos sur leurs broches correspondantes//  
myServo1.attach(ServoPin1);
myServo2.attach(ServoPin2);
myServo3.attach(ServoPin3);

//Définition de l'état des broches (Entrée ou Sortie)//
pinMode(ButtonPin,INPUT);
pinMode(ButtonPin2,INPUT);
pinMode(MotorPin1,OUTPUT);
pinMode(MotorPin2,OUTPUT);
pinMode(MotorPWM,OUTPUT);


Serial.begin(9600);
}

//Programme lu en boucle//
void loop() {
  
//Définition de la vitesse du moteur//  
//analogWrite(MotorPWM,127);

//Lecture de la position du Joystick sur l'axe x//
x_value=analogRead(JoyPin1);

//Ecriture de la valeur dans un tableau//
Serial.print("x_value: ");
Serial.print(x_value);

//Attente avant de lire la valeur selon y car sinon y_value=x_value//
delay(100);

//Lecture de la position du Joystick sur l'axe y//
y_value=analogRead(JoyPin2);

//Ecriture de la valeur dans un tableau//
Serial.print(" , y_value: ");
Serial.print(y_value);


if (x_value>520)
{
  analogWrite(MotorPWM,60);
  digitalWrite(MotorPin1,HIGH);
  digitalWrite(MotorPin2,LOW);
}
else if(x_value<480)
{
  analogWrite(MotorPWM,60);
  digitalWrite(MotorPin1,LOW);
  digitalWrite(MotorPin2,HIGH);
}
else
{
  analogWrite(MotorPWM,0);
  //myServo1.write(x_angle);
}
  
if (y_value>510 && inc_y<85)
{
  myServo2.write(y_angle+inc_y);
  myServo3.write(y_angle+inc_y);
  y_angle+=inc_y;
}
else if (y_value<490 && inc_y<85)
{
  myServo2.write(y_angle-inc_y);
  myServo3.write(y_angle-inc_y);
  y_angle-=inc_y;
}
else
{
  myServo2.write(y_angle);
  myServo3.write(y_angle);
}

delay(15);

switchstate=digitalRead(ButtonPin);

if(switchstate==LOW)
{
   myServo1.write(x_angle+inc_x);
  x_angle+=inc_x;
}

if(switchstate==HIGH)
{
 myServo1.write(x_angle-inc_x);
 x_angle-=inc_x; 
}

Serial.print(" , x_angle: ");
Serial.print(x_angle);


Serial.print(" , y_angle: ");
Serial.println(y_angle);

delay(15);
}

Je n'ai pas encore recherché d'erreurs (autres travaux à faire sur ce projet ..)

Bon j'ai rebranché le Joystick et j'ai un servo qui fonctionne. J'ai changé la vitesse et depuis j'ai les bonnes valeurs qui remontent du Joystick.

Je pense qu'il me reste des erreurs de branchements car je n'ai rien vu de particulier dans le programme (un petit if qui est pas juste mais j'ai corrigé ça aussi).

EDIT:

J'ai finalement réussi à tout faire fonctionner. En fait ma platine est séparée en 2 (deux alim sont nécessaires ...)

En tout cas merci du coup de main :slight_smile:

PS: Je ne sais pas si on peut définir le sujet comme résolu je n'ai pas trouvé de commande pour.

@J-M-L
Les dernières version du moniteur série de l'IDE acceptent jusqu'à un débit de 250 000.

68tjs:
@J-M-L
Les dernières version du moniteur série de l'IDE acceptent jusqu'à un débit de 250 000.

oui mais pas tous les arduino se comportent bien à cette vitesse - enfin en tout cas pas tous les miens :slight_smile:

Je ne me sert plus que des nano CH340 328p, ça tient (sous Linux Debian Stable).
Par contre dans l'ide version Italie c'est le moniteur qui n'accepte pas au delà de 115200.

Tant que le CH340 ne sera pas supporté en standard sur mon mac, je ne suis pas partant d'aller charger des drivers qui ont des droits élevés sur ma machine du fin fond de la chine...

Sous Linux ils sont avec le noyau, je ne pense pas que les gestionnaires du noyau Linux soient des inconscients en matière de sécurité.
Il me semble que le noyau Mac a bien emprunté au noyau Linux ou free-bsd si on joue sur les mots.
Qu'Apple n'est pas jugé utile de faire comme Linux est une autre chose.

Oui sous Linux ils y sont effectivement et on peut espérer que le code a été bien regardé (suite aux pb d'il y a quelques mois avec de plusieurs pb de sécurité sur USB avec Linux). je reste plus productif sur mon mac cependant, je conserve linux pour la partie server