Problème de Diaphonie?

Salut tous le monde ! :raised_hand_with_fingers_splayed:

Dans une ancienne version de mon projet, je pilotai deux moteurs pas à pas a l’aide d’un joystick :joystick:(celui-ci ICI) avec une carte Arduino méga.

J’ai réussi. :ok_hand:

Pour des questions techniques j’ai du passé ensuite sur une carte Arduino DUE (E/S 3,3v)

Depuis je rencontre un nouveau problème :

Lorsque que j’actionne l’axe X du joystick, cela à une légère incidence sur l’axe Y (environ +100 [CAN à 12bits]) quand je lis les valeurs avec analogRead().

Mais pas l’inverse (Axe Y n’a pas d’incidence sur Axe X).

Après recherche, ce problème se nommerait « Cross-Talk ».

Je ne pense pas que cela vienne des branchements, ou du code, car je n’avais pas se problème avant le changement de carte.

Est-ce que cela pourrait venir du joystick en lui même ? Non adapté au 3,3v ? :thinking:
Il n'y a pas d'info techniques sur l'annonce...

Qu'en pensez vous?

Je viens de démonter mon boitier de commande, et je lis "B5K-FO" sur les deux potentiomètres du joystick, je vais chercher si je trouve une datasheet :face_with_monocle:

Bon du coup j'ai refait quelques tests :man_mechanic:.
J'ai en fait des "pics" dans les deux axes.
Quand j'actionne par accous l'axe X, j'ai des "pics" de variation sur l'axe Y pouvant allé certain jusqu'à 700 (et inversement sur l'axe X, mais moins important environ 100).

Du coups j'ai essayer des brancher deux condensateur 10µF 50V entres les pins condensateur/Analogique-Arduino et le GND.

Résultat les pics sont beaucoup moins important, et cela est couvert par ma zone morte de 500.

Au finale j'ai toujours des "pics", mais qui semble ne plus se voir car comprise dans ma zone morte.

Avez vous une idées de la provenance de ces pics? :thinking:

Faites vous un double analogRead() (en jetant le premier) ?

Salut J-M-L! :raised_hand_with_fingers_splayed:

Je crains ne pas avoir bien saisi ta question...

Au cas où, dans mon code dans le loop, au niveau de la lecture du joystick, j'ai ceci :

  // Lire la valeur de l'axe X et Y du joystick
  int joyXval = analogRead(joyX);
  int joyYval = analogRead(joyY);

  // MAP X-Y 12bits: Convertissez la valeur du joystick en vitesse pour les moteurs
  int motorSpeedX = map(joyXval, 408, 3780, -vitesseXY, vitesseXY); // X mini - X max
  int motorSpeedY = map(joyYval, 500, 3803, vitesseXY, -vitesseXY); // Y mini - Y max

Je ne sais pas si j'ai répondu à ta question :eyes:

Il n'y a pas de cross talk

Il y a de la diaphonie.

Salut 68tjs

Je pensais que c'était la même chose non?

Oui, mais je suis un v*** c*** qui aime bien quand on écrit en français sur un forum français.

A d'accord :+1:

Titre changé :wink:

J-M-L, je pense avoir compris.
C'est lire deux fois la valeur analog read et ne garder que la deuxième lecture?

Je me suis renseigné sur cette technique :

  • Temps de stabilisation
  • Réduction du bruit
  • Synchronisation des ADC

J'essayerai demain, merci ! :+1:

(PS j'ai aussi vu une technique logiciel : La moyenne glissante ou moyenne mobile. Tu en pense quoi?)

C'est bien pour faire de la réduction de bruit.

Ici, on est plutôt dans un problème causé par la commutation d'une entrée analogique à une autre et au temps nécessaire à ce que le niveau à l'entrée de l'ADC se stabilise.

Oui c’est cela.

Sur nos arduino on n’a pas plusieurs ADC, il n’y en a généralement qu’un seul derrière un multiplexeur.

Quand vous faites analogRead(A0) le code arduino demande au multiplexeur de choisir l’entrée A0 pour l’envoyer vers le condensateur d’echantilllonage de l’ADC qui va être ensuite analysé par l’ADC pour voir à quelle tension il était.

Si vous alternez rapidement entre deux entrées, A0 et A1 et que l’impédance du circuit est assez importante et la différence de tension forte entre les deux entrées, il se peut que le petit condensateur de l’ADC (constante de temps) n’ait pas le temps de se charger à fond et donc vous vous retrouvez avez une mauvaise lecture.

En faisant deux fois la lecture, le premier analogRead() sert à basculer l’entrée du multiplexeur qui met en charge le condensateur et pour la seconde lecture la tension aux bornes du condensateur a largement eu le temps de se stabiliser à la bonne valeur et la lecture est correcte.

Si vous ne lisez qu’une fois pour faire la moyenne avec les précédentes vous ne lisez à chaque fois qu’une valeur possiblement erronée donc ce n’est pas une bonne idée.

Si vous faites la double lecture la tension d’entrée au niveau de l’ADC a pu se stabiliser et ensuite la moyenne glissante ou toute autre technique de filtrage est bonne à prendre si vous voulez amortir plus ou moins les modifications