Instabilité des pins analogiques sur Arduino Mega

Bonjour à tous et toutes !

C'est mon premier post ici après avoir passé quelques temps à lurker pour chercher (et trouver !) des réponses à diverses questions. Mais cette fois je crois que je vais avoir besoin d'un peu d'aide car je n'arrive pas à trouver la source de mon problème même après des recherches diverses un peu partout.

Je suis en train de bricoler un clavier MIDI avec un Arduino Mega (un clone Elegoo ATMEGA2560 R3) et je rencontre des difficultés avec les pins analogiques.

Pour le contexte, j'ai connecté sur les pins numériques les nappes du clavier (une matrice 8x8 avec 8 lignes en INPUT_PULLUP et 8 colonnes en OUTPUT), 4 boutons poussoirs simples, une LED d'état, un afficheur 4x7 digits connecté via un registre à décalages 74HC565N et un port MIDI 5 pins branché sur le port série TX1. Le tout fonctionne très bien, j'arrive à envoyer des notes, changer des paramètres via les boutons et afficher des caractères sur l'afficheur à digits, rien à signaler.

J'ai mis le code à disposition sur github ici mais pas encore réalisé le schéma. J'ai une photo ici pour donner une idée mais je suis conscient que ce n'est pas idéal.

Pour en venir au sujet principal du topic, j'ai deux molettes (pitch et modulation) qui sont des potentiomètres 10k classiques et que j'ai branché aux pins analogiques A0 et A1. J'ai géré le code qui permet de lire et de mapper les valeurs correctement en évitant de lire trop souvent et en lissant les valeurs lues. Ça fonctionne bien également, j'arrive à envoyer les signaux attendus via le port MIDI.

Je rencontre par contre un problème lorsque je manipule le clavier ou les boutons et/ou que l'afficheur s'allume, des valeurs parasites sont détectées sur les pins analogiques alors que les potentiomètres ne sont pas touchés. J'ai essayé plusieurs choses côté code sans succès (dans les méthodes checkValue de Modulation.cpp et PitchWheel.cpp) et surtout je me suis rendu compte que ça se produisait même si je débranchais les potentiomètres complètement et que rien n'était branché sur les pins A0 et A1. De ce que j'ai pu observer, le problème se produit depuis que j'ai ajouté l'afficheur à digits. Est-ce que ça peut être lié à l'utilisation des diodes PN2222A pour l'alimentation de l'afficheur ? (ici le lien du schéma que j'ai utilisé pour cette partie). Ou au fait que l'alimentation soit faite par USB ?

J'ai un niveau plutôt correct en programmation mais pas tellement en électronique et j'ai du mal à comprendre ce qui peut créer ce phénomène et comment l'éviter...

Est-ce que quelqu'un aurait une idée de ce que j'ai pu mal faire et de comment corriger ça ? Ou est-ce que ça peut être lié à une carte défectueuse ? Je n'en ai malheureusement pas d'autre à disposition tout de suite pour tester :confused:

Merci d'avance pour votre aide :slight_smile:

des diodes PN2222A

Pas de chance ce sont des transistors :grin:

Déjà parler d'instabilité sans chiffrer l'instabilité ne permet pas de donner de l'aide.
Le convertisseur analogique digital du microcontrôleur n'a pas la qualité d'un voltmètre.
Valeurs min, max, centrée ?

La stabilité dépend principalement de la stabilité de la référence de tension.
Si la référence de tension est bruité la mesure sera instable.

Pour la mesure analogique dans une carte Mega il y a 4 sources de tension possibles pour la références de tension du convertisseur.

  • l'alim Vcc provenant de l'USB ou du régulateur de la carte
  • l'entrée référence externe (Aref)
  • les 2 références internes du microcontrôleur (1,1V et 2,5V me semble-t-il je n'ai jamais utilisé de Mega).
    => voir analogReference() pour changer de référence de tension.

Si tu n'as pas changé la référence du convertisseur à la mise sous tension du micro tu es en référence à Vcc.
Si ce que tu ajoutes pollue l'alim Vcc la mesure sera dégradée.

Tu peux vérifier ce point en utilisant la sortie 3,3V comme référence externe ( en y connectant les potentiomètre aussi au lieu du 5V.

Si cela améliore la stabilité l'étape suivante sera de s'intéresser de près aux câblages et aux composants ajoutés.

Ps: essaye de ne pas mélanger les cartes en montrant des dessins de câblage avec une Uno alors que tu parles de Mega, cela serait mieux.

A propos de "dessins de câblage" ce que tu fournis ne nous aide pas vraiment car ce n'est pas un schéma électrique.

Ne change rien ou vraiment pas grand chose :
D'habitude on part du schéma électrique pour aller vers le schéma de câblage, Fritzing travaille à l'envers mais tout n'est pas perdu. La prochaine fois tu regardera dans les menus de Fritzing il est capable de fournir un schéma électrique à partir du schéma de câblage : c'est ce schéma électrique qui nous est utile.

Salut 68tjs, merci pour ta réponse détaillée !

Bien vu pour le transistor, j'avais prévenu que je ne suis pas trop calé côté électronique, je me suis emmêlé les pinceaux :slight_smile: Pour le schéma fritzing fourni, c'est un que j'ai trouvé ici sur le github du guide qui allait avec mon kit Elegoo. Il y a également le bon schéma ici si ça peut t'être plus utile. C'est pour un UNO mais j'ai respecté les mêmes câblages et ça fonctionne. J'avais même testé sur un nano avant de l'ajouter à mon montage complet pour valider le bon fonctionnement sans perturber le reste.

Et tu as raison je n'ai pas très bien détaillé l'instabilité ! Pour l'expliquer simplement, quand l'affichage est activé, je reçois une valeur qui oscille à peu près entre 0 et 15. Je dis à peu près car c'est ce que j'en déduis de la sortie du port série qui m'envoie une série de 0 et de 1 très rapidement jusqu'à ce que l'afficheur s'éteigne. Et comme mon algorithme évite d'envoyer deux fois de suite la même valeur et qu'il ne prend en compte que les écarts supérieurs à 8 (puisque je mappe le 0-1023 en 0-127), ça correspond à ces variations. Je sais aussi que l'algorithme en question ne pose pas de problèmes car quand je désactive la lecture des pins analogiques, je ne reçois plus aucun de ces messages via le port série. J'ai aussi remarqué que le problème s'estompe avec le temps (les composants chauffent et se stabilisent ?)

J'ai essayé en utilisant la pin 5V et la pin AREF mais ça m'a donné le même résultat. Mais je n'ai pas testé la sortie 3.3V, ça peut être une bonne piste en effet, j'ai un peu honte de ne pas y avoir pensé. J'avais regardé analogReference() mais sans trop savoir comment bien l'utiliser, je vais m'y intéresser un peu plus.

Si je comprends bien, c'est possible que le signal 5V soit perturbé par les composants qui tirent un peu de jus comme les transistors par exemple ?

Désolé je fais des messages un peu longs mais j'ai du mal à exprimer clairement les choses, c'est pas simple à détailler.

En tout cas je vais au moins tester la pin 3.3V et faire des tests de lecture pour voir ce que ça donne. Merci pour les conseils !

Le nouveau schéma que tu as transmis est exactement ce qu'il nous faut.

Je te mets en garde contre les courants consommés.
On lit beaucoup de bêtises sur internet (les auto proclamés experts ne sont pas une espèce en voie de disparition).

Le juge de paix c'est la datasheet du micro controleur et non pas l'univers arduino.
Cette datasheet dit :

  • pas plus de 40mA sur une sortie ocasionnellement et pendant un temps très court.
    Atmel donne toutes ses caractéristiques pour 20 mA au maximum.

  • pas plus de 200 mA sur le gnd ET/OU sur le Vcc. Sachant qu'à vide le micro consomme à lui tout seul environ 40 mA.

  • plus une série de limitation sur les "ports" qui sont des groupes de sorties (maximum 8 sorties avec le micro de la Mega).

Je pense que tu devrais faire un bilan des courants.
Si tu consomme trop il est normal que le Vcc ne soit pas stable.

Hello,

Après quelques jours, j'ai pu refaire des tests et des modifications. Je n'ai rien eu à changer niveau code ou niveau composants.

Par contre j'utilise 2 breadboards et j'alimentais tout via une pin 5V et une pin GND de l'Arduino puis je faisais des ponts entre chaque "gouttière" +/- des 2 breadboards. J'ai juste réparti les breadboards sur 2 pins 5V et GND de l'Arduino pour éviter d'avoir trop de ponts (et j'imagine de pertes qui allaient avec) et mon problème a miraculeusement disparu.

Merci pour tes explications en tout cas :slight_smile: