Utilisation d'un multiplexeur analogique CD74HC4067

Bonsoir, pour la création d'un HOTAS de vol pour de la simulation je comptais utiliser une arduino uno mais :

dû au manque d'entrée analogique de l'arduino UNO, j'ai donc ajouté un multiplexeur analogique CD74HC4067 entre autre, et je me posais les questions suivantes : est-ce que la communication entre les composants et l'arduino est assez réactif pour rapidement changer de cap au besoin ? Si non, puis-je utiliser les peu d'entrées qu'il me reste en tant qu'entrées numériques, comme des boutons ou des interrupteurs. aussi dans ce dernier cas faut il prévoir des résistances de pull-up (ou down).

Merci d'avance de vos réponses.

Yoch85

Bonjour,

A mon humble avis ça dépand de ce que toi tu appelle réactif, et ça dépand aussi de la maniére que tu ècris le code pour scruter les entrées analogiques du multiplexeur.

Tu parle je présume des entrés inutilisées du multiplexeur?

Une entrées analogiques peut se "digitaliser" simplement avec effectivement un PULLUP ou un pulldown si tu utilise des BP ou INTER ou même un transistor, tout dépand de ce que tu branche dessus (pour les composants mécaniques, produisant du rebond, il faut prévoir un anti-rebond, par exemple 1 condensateur).

A toi aprés de traiter, en soft, le niveau de l'entrée, pour définir si c'est un niveau définit comme étant HIGH ou LOW.

Donc oui c'est possible

+1
Je complete en disant qu’Arduino fait une grossière erreur de communication en appelant ces entrées ”analogiques”.

Ce sont des E/S tout ce qu’il y a de numérique, elles sont reliées au Port C, elles ont des pull-up.
Elles ont une seconde fonction qui est la mesure analogique.
Cette seconde fonction n’est activée qu’avec l’appel d’un analogRead.

Note :
Si tu as des impératifs de vitesse, saches que la configuration de la chaine de mesure analogique choisie par Arduino est très conservatrice.

Il est possible de rendre cette chaine plus véloce moyennant certaines precautions. Tout est expliqué dans la datasheet du microcontroleur l’atmega328p. Modification manuelle des registres obligatoire.

Autre point également indiqué dans la datasheet : si tu changes quoi que ce soit dans la chaine de mesure, par exemple passer de A0 à A5, une mesure était probablement en cours, tu aura un melange de A0 et de A5.
Dans ce cas il faut, très logiquement, rejetter la première mesure sur A5.

Un multiplexeur analogique a un temps de réponse, le signal est disponible x ms ou x ns après l’ordre de commutation. Cette information est disponible dans la datasheet du mutiplexeur analogique.
Un multiplexeur analogique a une résistance série résiduelle, indiquée dans la datasheet ( due aux Rdson des xfets).
La référence que tu as trouvé est très vieille, il existe des produits plus récents et plus performants. N’utilisant pas ce produit je n’ai pas de référence a te proposer, gogole ou duckduckgo seront tes copains.

Bonjour,

C'est toujours très instructif toutes vos considérations.

Ça m'amène à une question.
Dans le cadre du multiplexage, l'entrée Arduino à laquelle serra connectée la sortie du multiplexeur va se comporter comment face aux commutations, comme 1 filtre passe bas je présume, ce qui sous entendrait une limitation de fréquence de commutation non?
De quel ordre à peu prés ?

Je ne comprends pas bien la question.

Est-ce en mode analogique ou en mode numérique ?
Dans tous les cas, il reste que sans les caractéristiques du multiplexeur, il est difficile de conclure.

idem pour la question de @yoch85 :

A exposé vague, il ne peut y avoir que des réponses vagues.

La seule réponse possible est : peut-être bien que oui, peut-être bien que non.
Pour répondre, il faut que, @yoch85, tu précises ton besoin :

  • "réactif" sans une indication de temps en secondes ne veut rien dire.
  • Réagir le plus vite possible n'a aussi aucune signification.
  • Réagir en 1 ms ou en 3 h a une signification.

NB : c'est quoi un "HOTAS de vol ?
Une explication ou un lien "cliquable" dans le premier message aurait été la bienvenue.

Mes propos ne sont absolument pas agressifs, je sais que le plus difficile dans un projet c'est sa définition avec l'établissement d'un cahier des charges "réaliste".
Réaliste veut dire contraintes minimum plus une marge de sécurité.

Je pense que la réponse à ma question est peut-être là:

Si par exemple @yoch85 connecte toutes les sorties de son joystick de compétition sur les entrés du multiplexeur, et la sortie du multiplexeur à une entrée "analogique" de l'Arduino, et qu'il espère une grande réactivité de mesure en scrutant en boucle les entrées de son multiplexeur, il sera limité pour la vitesse de scrutation par la bande passante de l'ADC (100K Ohms 14 p Farrads, f = 1/RC...?)

Le problème est que tout dépend de l'impédance de la source à mesurer.
Le condensateur de 14pF retient l'échantillon à mesurer, pendant un certain temps. Si l'impédance de la source est élevée, l'échantillon sera mémorisé plus longtemps et faussera la mesure de l'échantillon suivant provenant d'une autre source.
La limite se situe aux alentours de 10KΩ.

2. Augmenter la précision dynamique

voici le câblage potentiel de l'HOTAS : https://wokwi.com/projects/402120068553463809 donc au choix je mets tout les potentiomètres donc commandes de l'avion et commandes de gaz, et j'aurais peut être x temps de latence pour chaque commande, soit je mets comme sur le wokwi, et j'ai 5 broches inutilisées, soit j'en profite pour mettre 5 bouton ou interrupteur pour économiser de la place. le dernier cas est il possible ?

en effet, je te renvoie donc vers un lien pour imager un peu plus : Mains sur manche et manette — Wikipédia

eh bien, ça dépend, que la commande des moteurs réagisse à 0.5s près n'est pas dérangeant, par contre dans le cas d'un dogfight, il faudrait que le temps de réaction du joystick de vol soit moindre, je n'est pas d'ordre d'idée, environ un Δt d'à peu près 100ms serait assez bien.

c'est à dire ? j'aurais donc une limitation de vitesse au niveau de l'arduino et/ou du multiplexeur ? dû à quoi ? d'après ce que je comprends avec le lien de @hbachetti il y aurait une modification des valeurs réelle à cause de l'impédence du circuit ?

j'ai choisi le multiplexeur avec lequel il y a le plus de tutos et autres au cas où.

Sans vouloir couper les cheveux en 4 (dans le sens de l'éoaisseur) il y a tout d'abord une chose qui me perturbe énormément, c'est que le datasheet du convertisseur semble dire 'impédance d'entrée variant de 1 à 100k Ohms.

Je n'ai pas regardé dans les détails le schéma de la carte Arduino, mais si un signal dit analogique entre sur une entrée d'impédance 1k, par exemple un potentiométre de joystick 10k entrant sur une impédance 1k, bonjour la distorsion!

J'en déduis que ce n'est pas comme cela que ça se passe, qu'il y a un étage intermédiaire.

@yoch85
Si tu a compris les RC, le temps de charge, la fréquence de coupure.

Imagine, tu a 16 entrées sur ton multiplexeur à faire lire successivement à ton entrée analogique sur la carte Arduino.

Ton entrée analogique à besoin d'un certain temps pour charger sa capacité et mesurer le signal une fois cette capa chargée
To = RC, (admettons que To = 1,4 micro secondes) on dit qu'il faut 3 à 5 To (5 To = 7 microsecondes) pour que C soit chargée à la valeur à mesurer, conclusion, pour scruter tes 16 entrés multiplexeur, il ne faut pas aller trop vite, il faut je pense laisser disons 10 microsecondes à la capa pour se charger avant de faire la mesure,

A l'échelle du temps Arduino, c'est peut-être beaucoup, peut-être peu, mais c'est je pense à prendre en compte.

Il y a aussi le temps de boucle à prendre en compte

Par exemple si à t=t1 tu mesure la voie X de ton potentiométre et que le temps de boucle est 100 (je ne met pas d'unités exprés), la prochaine fois que tu lira la voix X, se serra à t1+100.

Et si toi manuellement, entre temps, tu a changé 10 fois de position sur la voie X, tu n'aura pas lesuré ces 10 changements de position, et toi joueur, tu va trouvé ton systéme peu réactif.

Le temps de boucle, c'est aussi le codeur, par son algorithme, qui le définit.

To = RC ? RC est un type de circuit mais que signifie To ?

To, c'est la lettre greque utilisée par les "académicien de l'électronique" pour désigner le temps de charge d'un circuit RC, RL etc ...

C'est un truc physique (pas que mathématique) très proche de la réalité.

C'est un temps = à la valeur de R X par la valeur de C.

Et les physiciens et mathématiciens démontrent que au bout de t = To, la capa c'est chargé à 2/3 de sa valeur finale, et si ma mémoire est bonne, à t = 3 To, elle est chargée à 90% de sa valeur finale

donc si je comprend, sur 11 voies, la première voies est actualisée toutes les 10ms * 11 voies ? donc 110ms entre chaque mesure de la première voie.

encore faut-il être bon codeur :rofl: et ca va pas être gagner cette histoire là, je pense

1 microsecondes = 0.000001 seconde
1 millisecondes = 0.001 seconde.

Des très bons codeurs qui pourront t'aider, ici ça ne manque pas :wink:

Les broches appelées A0 à A5, qui peuvent, dans un usage numérique, tout à fait officiellement s'appeler D14 à D19 sont individuellement reliées :

  • soit au port C,
  • soit à une entrée du multiplexeur analogique à 10 entrées interne à la puce du micro.

Cet aiguillage est commandé par des registres.
Ce sont les fonctions digitalWrite/digitalRead d'une part, et analogRead d'autre part qui écrivent les bonnes valeurs dans les registres.

Ce qu'il faut retenir, c'est que dans un microcontrôleur, il n'y a qu'un seul ADC associé à un multiplexeur analogique.
On n'a pas à se soucier de ce multiplexeur, ses performances sont prises en compte dans la datasheet, c'est réglé par Atmel.

La seule chose dont on a à se soucier, c'est que quand on change d'entrée au niveau du boîtier il faut systématiquement rejeter la première mesure, j'ai déjà expliqué pourquoi.

Un Convertisseur Analogique Digital (CAD ou ADC) fonctionne selon un principe de charge de condensateurs internes.

Pour que, ce ou ces condensateurs (je ne connais pas le fonctionnement interne) aient le temps de se charger completement (circuit RC) il faut que l'impédance de sortie du générateur connecté à une entrée soit compatible avec la fréquence d'échantillonage.
Il n'y a pas une valeur max unique pour la résistance, il y a des couples (impédance du signal/frequence d'échantillonage)

Il y a un fichier Arduino qu'on ne voit jamais, mais qui s'exécute systématiquement au démarrage du micro : le fichier init() (voir dans les fichiers de l'IDE le fichier main.cpp).

C'est dans ce fichier qu'Arduino fait des configurations des différents périphériques internes.
Par exemple, c'est dans ce fichier que sont configurées les PWM à environ 1kHz et environ 500 Hz, alors que la PWM peut aller jusqu'à 62,5 kHz.

De la même façon, la fréquence d'échantillonnage de l'ADC est choisie la plus basse parce que cela permet de ne pas avoir de contrainte sur la résistance du générateur d'entrée.
De mémoire, c'est très loin pour moi maintenant, avec le réglage arduino on devrait pouvoir accepter jusqu'à un megohm => à vérifier ! !

Donc oui s'il y a un problème avec l'ADC le micro atmega328p peut faire mieux que ce que lui fait faire Arduino.

Mais avant de se lancer dans des grandes manœuvres il faut faire la preuve que l'existant est insuffisant.

Parce là c'est :

  • lecture de la datasheet.
  • Décorticage du fichier init() [il faut déjà réussir à le trouver] pour trouver les configurations Arduino.
    Ou faire un petit programme qui lit tous les registres qui concernent l'ADC
  • A partir de la valeur des registres déterminer les choix Arduino en comparant les valeurs Arduino des registres avec la datasheet.
  • Déterminer des nouveaux réglages plus performant , mais également contrôler qu'ils sont compatibles avec le restant de l'électronique.

C'est du très lourd, il est préférable de bien réfléchir avant et de faire l'effort de donner des temps en secondes plutôt qu' "en virons". Le "viron" n'est pas une bonne unité.

Une info qui peut être utile : impédance de sortie d'un potentiomètre.
L'impédance max de sortie d'un potentiomètre est égale au 1/4 de la valeur du potentiomètre.
Elle correspond à la position milieu du curseur.
Exemple potentiomètre 10 k, la valeur max vue du curseur sera égale à 2,5 k.
Cette impédance est nulle quand le curseur est à la masse ou à Vcc.

Autre point :

Le premier problème est la carte UNO qui est très mal conçue pour les mesures analogiques.
À cause d'une mauvaise implantation et d'un mauvais choix de brochage, la mesure analogique est très bruitée et il faut faire un moyennage sur au moins 10 mesures : c'est ballot pour aller vite.

La carte nano est mieux implantée, si tu tiens a conserver la UNO je peux t'indiquer "un truc" : souder un condensateur de 100 nF sur le support du micro (c'est à dire au verso) entre la broche correspondant à Aref (celle du micro bien sûr, pas celle de bord de carte) et la broche voisine Gnd.

Étonnant Atmel, sachant cette partie de circuit délicate, a placé une sortie masse juste à côté de Aref pour créer les conditions idéales de filtrage et Arduino a placé le condensateur à l'autre bout de la carte !

Bonsoir yoch85

Combien d'entrées analogiques tu dois mesurer, je peux te faire des mesures de temps nécessaire pour lire 16 entrées, par exemple.

Oui, le ou les multiplexeur(s) utilisera A0, par exemple, il te reste A1 à A5 comme entrées digitales exactement au même titre que les entrées de 0 à 14, ceci, pour autant que tu n'as pas besoin du bus i2C qui lui utilise A4 et A5. Les entrées du multiplexeur peuvent, bien sûre, être "digitales", tu lira 0 et 1023 au lieu de 0 et 1, à toi de convertir.

Pull-up est mieux, ainsi tu n'as besoin d'amener qu'un GND à tes divers contacts ou boutons.

A+
Cordialement
jpbbricole

[ Humour ]
Je ne l'ai pas non plus trouvé dans le Système d'unités pifométriques.pdf (145,4 Ko)
[/ Humour ]

EDIT : En fait il y est, voir au paragraphe 4.11-Unités Aéronautiques

Bonsoir,

Merci, c'est super, dans mon deuxième message il y a lien avec le schéma potentiel, dans tout les cas, ça sera soit 11, soit 16.

Oups en effet j'ai lu un peu trop vite :sweat_smile:

Je suis curieux, qu'est ce que le port c ? d'après ce que je comprend le micro contrôleur possède déjà un convertisseur analogique numérique est ça ?

Il serait donc préférable de partir sur la nano qui si elle est plus performante, est aussi plus petite.

Je parlais des broches inactives sur le multiplexeur, peut il envoyer, par exemple, 11 entrées analogiques sur 16 et les 5 restantes pour du numérique. C'est à dire que pour un même multiplexeur il peut m'envoyer des données numérique et analogique

Bon tant mieux, si j'utilise la pin 3 en pull up de l'arduino, je n'aurai pas besoin de prévoir une résistances de tirage externe ?

Si vous avez d'autres questions, je vous y répondrez, mais lorsque que vous employer des termes techniques ou difficile à appréhender, serait il possible d'avoir des liens vers des explications ou tout simplement ajouter plus de détails pour qu'un débutant puisse comprendre :wink:.

Je vous remercie de vos retours en espérant que vous pourriez m'éclairer un peu plus sur ce sujet ci.

Quand on parle de millisecondes ou microsecondes, on ne parle pas de "virons", n'exagérons pas.

Quand à l'impédance de sortie face à la fréquence d'échantillonage, OK, si la fréquence d'échantillonnage est assez basse ("assez", c'est de quelle unité?) on a pas à se soucier de l'impédançe de sortie du générateur.

Par contre non, l'impédance de sortie n'est pas sans influence par rapport â l'impédance d'entrée de ce que vous appelez "le boîtier" qui varie de 1 à 100k selon la datasheet

Bonjour yoch85

Non, la PULLUP interne doit suffire. Par contre, les pin digitales prises sur le multiplexeur devront en être équipées.

La Nano n'est pas plus performante, c'est identique.
Pour ce qui est de l'encombrement, une fois toute équipée, la Nano est aussi encombrante qu'une UNO, si ce n'est plus. J'en utilise que rarement, je préfère une UNO avec un shield à souder comme ceci,
image

le tout est compact et est déjà équipé pour une alimenmtation externe (jack). Quand aux "défauts" de la partie analogique de la UNO cités plus haut, cela m'étonnerai beaucoup que cela impacte ton projet, tu peux les ignorer.

J'ai fait des chronométrages pour ce qui concerne le temps de lecture d'un port et de 16 ports, cela donne:

Channel 0: 	224 uS 	0
Channel 1: 	136 uS 	1023
Channel 2: 	128 uS 	710
Channel 3: 	132 uS 	642
Channel 4: 	136 uS 	28
Channel 5: 	132 uS 	77
Channel 6: 	136 uS 	66
Channel 7: 	132 uS 	83
Channel 8: 	132 uS 	0
Channel 9: 	128 uS 	34
Channel 10: 	132 uS 	40
Channel 11: 	132 uS 	62
Channel 12: 	136 uS 	95
Channel 13: 	132 uS 	118
Channel 14: 	128 uS 	99
Channel 15: 	128 uS 	112

Lecture 16 canaux en microsecondes: 	2064 uS

La lecture d'un canal prend ~130 microsecondes et le tout, 16 canaux, 2 millisecondes.
Le test est réalisé avec la bibliothèque:
image

et le programme:

#include <light_CD74HC4067.h>     // https://github.com/SunitRaut/Lightweight-CD74HC4067-Arduino

//            s0 s1  s2 s3: select pins
CD74HC4067 mp(4,  5, 6,  7);  // create a new CD74HC4067 object with its four select lines

uint32_t start, stop, startFull, stopFull;

const int mpAnalogPin = A0;
int mpAnalogValue = 0;     // Valeur lue sur port analogique

void setup()
{
	Serial.begin(115200);
	
	for (uint8_t ch = 0; ch < 16; ch ++)     // Lecture de 16 valeurs analogiques
	{
		start = micros();
		mp.channel(ch);
		mpAnalogValue = analogRead(mpAnalogPin);
		stop = micros();
		Serial.print("Channel ");
		Serial.print(ch);
		Serial.print(": \t");
		Serial.print(stop - start);
		Serial.print(" uS \t");
		Serial.println(mpAnalogValue);
		delay(100);
	}

	startFull = micros();
	for (uint8_t ch = 0; ch < 16; ch ++)
	{
		mp.channel(ch);
		mpAnalogValue = analogRead(mpAnalogPin);
	}
	stopFull = micros();
	Serial.print("\nLecture 16 canaux en microsecondes: \t");
	Serial.print(stopFull - startFull);
	Serial.println(" uS");
}

void loop()
{
}

A+
Cordialement
jpbbricole