Controle de potentiomètres numérique

Bonjour tout le monde, j'aurais besoin de savoir dans un premier temps si il était juste possible de contrôler plusieurs potentiomètres numériques avec un seul arduino ?

Ce besoin s'inscrit dans le cadre de la fabrication d'un préampli guitare à lampes, contrôlé numériquement via midi (comme pour n'en citer que quelques uns le Mesa Boogie Triaxis, Marshall JMP-1, ADA MP-1...).

Dans ce projet j'aurai besoin de 5 ensembles de potentiomètres numériques (un ensemble de potentiomètres numérique = plusieurs potentiomètres numériques ayant la même valeur (en pourcentage de course, pas forcément en résistance comme par exemple un potentiomètre quadruples avec ou non des valeurs de résistances identiques selon le potentiomètre numérique choisi et le besoin).

Donc voilà pour la petite question, j'espère déjà avoir été compréhensible dans ma demande, et je vous remercie par avance pour vos réponses si il y en a.

Il y a deux types de potentiomètres:
− les numériques qui délivrent des impulsions 0/Vcc que l'Arduino doit compter pour ne pas perdre la position. Ils n'ont pas de résistances. Il faut deux entrées numériques par potentiomètre, on est limité par le nombre d'entrées/sorties de la carte. On peut donc en mettre 5 sur toutes les cartes.
− les potentiomètres analogiques constitués d'une piste résistive et qui vont délivrer une tension analogique entre 0 et Vcc. Pour avoir la valeur il faut une entrée analogique et le convertisseur numérique analogique du micro va convertir cette tension en nombre entre 0 et 1023 par exemple. On peut donc mettre autant de potentiomètres qu'il y a d'entrées analogiques. 5 n'est donc pas un problème.
J'ai l'impression qu'il y a un mélange des deux.

Avec une référence, une pub d'achat, on peut en dire plus.

Merci pour la réponse mais il semblerait que je me sois mal exprimé, je voudrais que mon arduino contrôle des potentiomètre numériques et non l'inverse.

que je définisse une valeur (via un encodeur rotatif, bouton poussoir ou midi ou peu importe) et que l'arduino définisse la position d'un (enfin de plusieurs du coup) potentiomètres numériques (en SPI ou I2C ou peu importe).

le but étant le contrôle numérique d'un circuit analogique (avec par la suite une possibilité d'enregistrements de presets et de recall).

Bonjour pn0707

Un début de piste ici, à noter que ces potentiomètres CP41100 sont commandés via un BUS SPI, c'est à dire qu'ils auront les signaux Horloge et Datainput en commun et il faudra autant de Chip Select que de potentiomètres.
Je n'ai jamais essayé, mais je pense que ce circuit est adapté, pour ton projet.

PS: Dans le même genre il y a les MCP41xxx.

Cordialement
jpbbricole

Une autre piste qui donne pas mal d'information.
Tu peux en plus utiliser la recherche de composant pour voir quel protocole de contrôle est supporté

Merci beaucoup pour la réponse c'est un excellent début merci je vais creuser ça.

Si j'ai bien compris je définis dans le code pour chaque potentiomètre numérique un CS sur un pin différent de l'arduino et je pourrai commander individuellement chaque potentiomètre numérique ?

Et dans le sens ou je veux commander plusieurs blocs de plusieurs potentiomètres numériques il me suffit donc de connecter les potentiomètres numériques que je veux commander ensembles sur le même CS ?

Même si cela doit être possible, je ne sais pas si c'est une bonne idée de regrouper plusieurs esclaves sur le même "cable select".

Tu compte avoir autant de potar numériques que ça?
Tu as combien de potar en tous avec tes 5 blocs?

Il devra y avoir 5 blocs avec au maximum 4 potentiomètre numérique par bloc

ci-joint un petit diagram de ce qu'il faut.

Concrètement il me faudra commander les réglages de GAIN, BASS, MID, TREBLE et LEVEL indépendamment mais pour les trois canaux (clean, crunch et lead) du préampli simultanément et en plus avoir un potentiomètre numérique supplémentaire (par réglage) qui me servira de retour de valeur qui sera mesurée par un autre arduino pour l'affichage de cette valeur via des cercles de leds autour de chaque encodeur rotatif correspondant.

ça parait beaucoup, est-ce faisable à votre avis ?

Aussi, il me faudra passer par le protocole I2C et non SPI car la seule référence de potentiomètre numérique double de 1M que j'ai trouvé (du moins sur Mouser) est en I2C.

En tout cas merci infiniment pour vos réponses.

Le problème de l'I2C est qu'il faut pouvoir configurer l'adresse de chaque potentiomètre pour qu'il n'y ait pas de chevauchement.

Du coup il te faut 20 sortie numérique en plus des entrées pour tes encodeurs rotatif et de donnée du SPI.
Un arduino Mega aura suffisamment d'entrée sortie, je ne sais pas si un plus petit pourrait aussi convenir?

Sinon il faut passer par un registre à décalage, je pense?

Bonjour pn0707

Oui, c'est possible en i2C, avec des AD5242xxxx, tu peux en mettre 4, sélectionnés par AD0 et AD1, sur le bus i2C.
image

Ensuite tu multiplies les bus i2C avec un TCA9548 ce qui te donnes la possibilité de 16 x 4 potentiomètres.

Cordialement
jpbbricole

Un expenseur genre MCP23017 serait plus souple d'emploi.

Un document TI qui conseille comment câbler l'I2C.

Je pense qu'avec 20 potentiomètres numériques il va y avoir beaucoup de câblage.
Il se trouve que l'I2C n'a été conçue que pour faire dialoguer les CI sur une même carte.

À l'usage, elle peut faire beaucoup mieux, mais il ne faut pas lui demander la Lune non plus.

En deux mots le problème.
En I2C on utilise des transistors à collecteur (transistor bipolaire) ou drain (transistor FET) ouvert. Ce qui revient à faire fonctionner ce transistor en montage émetteur (ou source) commun.
Avec un tel montage, on démontre que l'impédance de sortie est égale à la résistance de collecteur (ou drain) qui fait entre 5 k et 10 k.
Les fils de câblage et les entrées de composants apportent de la capacité. La constante de temps infernale R*C écroule les fronts du signal.

Solutions :

  • baisser la valeur de la résistance pour diminuer le produit R * C.
  • baisser la fréquence de l'horloge de l'I2C pour redonner du temps à la période du signal : ce n'est pas documenté dans la bibliothèque Wire mais c'est prévu et c'est simple à faire.

Aux qu'elles, j'ajoute : bien lire le document joint, faire des essais : commencer par le chemin le plus long, prendre des marges parce qu'il ne faudra pas qu'avec 10 °C de plus dans la salle cela tombe en rideau. Ajouter au besoin des répéteurs I2C .

Cela nécessite que tu connaisses ton câblage afin de pouvoir déterminer le chemin critique.

Bonjour 68tjs

Dans les faits, cette norme est largement dépassée, même sur ce forum, on trouve un exemple de bus i2C à 9 mètres avec 2 MCP23017 (appelés expanders dans l'article). Une vidéo explicite.
Moi même, jen ai fait de 4 mètres sans problème.

En fait pas tant que ça, si on utilise un TCA 9548 on recrée d'autres bus i2C, ce qui en raccourci la longueur.

Cordialement
jpbbricole

Je ne dis pas ce qu'il faut faire,
je ne dis pas que cela ne marchera pas,

Je mets en garde.
Je suggère que si cela ne fonctionne pas il est possible d'utiliser des répondeurs I2C, je ne dis pas qu'il faut en mettre.
Je ne fais pas du clé en main.

Tout va dépendre de comment le câblage va être réalisé.
Un câblage comme on voit sur youtube style, perchoir à mouche avec des câbles de 20 cm alors que 5 cm suffisent et ce pourra être une catastrophe avec 20 esclaves.

C'est une mise en garde !

Notre ami fera ce qu'il veut.

S'il trouve que ce que je lui dis n'est pas inutile, tant mieux.
S'il trouve que je suis un pinailleur, tant pis, je n'en ferais pas une maladie, de toute façon je sais déjà que j'en suis un.

En attendant quand, à cause de la valeur trop élevée de la constante de temps RC, les temps de montée et de descente du signal sont trop longs par rapport à la période du signal, surtout celui de l'horloge, le maitre ou les esclaves ne comprennent plus rien et ça ne marche plus.

Tant mieux pour tes 9 m, c'est une belle réussite, mais il serait bien de préciser dans quelles conditions afin d'en faire profiter l'assistance.
Nombre d'esclaves ? type d'esclaves ? type de câble ? Valeur des résistances de collecteur ? etc ....

Bonsoir 68tjs

Il suffit de lire le post que j'ai indiqué, tout ou presque est dedans, je résume
1 Arduino Mega
1 hub i2C
2 expanders, MCP23017, dont 1 à 9 mètres.

Pour les conditions, il suffit de regarder la vidéo et pour ce qui est de la câblage, c'est aussi dans la vidéo de 4:50 à 5:50

Cordialement
jpbbricole

Merci tout le monde pour vos précieux éclairages !!!

pour ce qui est du multiplexer I2C c'est fantastique je ne savais pas qu'une telle chose éxistait hahaha voilà qui va certainement me sauver !

pour le câblage pas de soucis à ce faire (je me suis certainement mal exprimé aussi à ce sujet désolé je ne savais pas comment être clair sans faire un pavé) mais le système de contrôle sera bien sur le même circuit que le préampli (je fabrique tout de A à Z y compris le préampli ^^)

Une dernière petite question me taraude : pour ce qui est séparer et adresser différemment les blocs de potentiomètre numériques si j'ai bien compris je me sers de 5 bus I2C sur 8 du multiplexer, mais pour ce qui est des potentiomètres numériques qui doivent réagir ensemble de la même façon (au sein du même bloc) je branche tout en parallèle (SDA et SCL) ?

Demain, je te fais un topo, basé sur ton schéma du post#8.

Bonne soirée
Cordialement
jpbbricole

Ce n'est pas comme ça.

En I2C tous les composants, maître et esclaves, sont reliés en parallèle. SCL d'un coté, SDA de l'autre.
Pour actionner un esclave particulier le maître envoie sur SDA une entête avec l'adresse de l'esclave à qui il veut parler. Puis quand l'esclave à répondu qu'il était pret le maître envoie un ordre.
Un esclave ne peut que répondre au maître, un esclave ne peut pas prendre l'initiative d'une communication.

Le micro ne sait qu'enchaîner les ordre les uns a la suite des autres.
Les potentiomètre seront commandés les uns après les autres.

Mais à l'échelle humaine qu'est-ce cela voudra dire ?
Une carte type Uno/nano/pro-micro/Méga tourne avec une horloge à 16 MHz un cycle horloge dure 62,5 ns => 62,5 milliardième de seconde.

Au total il faudra plus d'un cycle horloge mais même avec 100 cycles (valeur au pif) ce sera indécelable.

La différence entre I2C et SPI

  • I2C
    un fil horloge, un fil Data sur lequel parlent le maître et l'esclave : on dit qu'elle est bidirectionnelle.
    Chaque esclave est muni d'une adresse.
    Dans l'ordre le maître parle pour avertir l'esclave à qui il veut parler, les autres esclaves se taisent, l'esclave sélectionné répond au maître.

  • SPI
    une horloge, une ligne MOSI (MasterOut Slave In), une ligne MISO (Master In Slave Out)
    Le maître envoie ses ordres sur MOSI, l'esclave répond sur MISO.
    Au lieu d'avoir une adresse chaque esclave est rendu actif par une ligne CS ChipSelect.

Bonjour pn0707

Un petit topo sur l'architecture du montage.
Chaque bloc de potentiométres (BP) est raccordé sur une branche (TCBR) du TCA9548 (TC) (SD0-SC0, position 0 à SD7-SC7, position 7)
image

Chaque TCBR est un bus i2C indépendant des 7 autres.

Un BP est connecté sur une TCBR et est composé de potentiomètres numériques (PN) au nombre maximum de 4 (contingence AD524n), les adresses (AB), sur le bus i2C sont de 0x2C (44) à 0x2F (47).
Ainsi chaque PN est accessible via le numéro de sa TCBR / AB.

Dans le cas où 2 PN doivent être commandés "en même temps", il n'est pas nécessaire qu'ils soient dans le même BP, il suffit de les commander simultanément, commandePN(BP, AB, valeur). Ainsi, pour commander ces 2 blocs
image
les commandes simultanées sont:

commandePN(0, 0x2E, valeur)`
commandePN(1, 0x2C, valeur)`

Pour ce qui est de PN single ou dual, je pense, pour des problème de gestion, qu'il faudrait prendre que des dual (à voire avec les outils de programmation (bibliothèque), mais comme je n'en ai pas...

En espérant avoir été assez clair... :wink:
A ta disposition pour tout complément.

Cordialement
jpbbricole

Wouaaaah merci beaucoup je comprends BEAUCOUP MIEUX !!! merci infiniment !

Autre question aussi, est-il possible de lire la valeur I2C des PN?
En fait dans le sens ou je veux contrôler les PN via des encodeurs rotatifs, il faudrait faire un relevé des valeurs I2C avant une quelconque incrémentation ou décrémentation non ?
De plus comme je veux faire un préampli programmable avec des présets que j'enregistre et rappelle via un contrôle midi, pour l'enregistrement de ces présets en mémoire, il me faut du coup enregistrer ces dites valeurs I2C pour tous les bus et toutes les adresses pour que lors du recall via midi, tous les bus I2C se remettent aux bonnes valeurs.

Et aussi avec se type de PN le changement de valeur est-il instantané (ce que je veux dire c'est est-ce que le PN peut passer d'une valeur de par exemple 10 à 186 directement ou alors il va faire 10->11->12->...->186) ?

Désolé ça fait beaucoup de questions mais le monde du PN et de l'I2C est encore obscure pour moi :slight_smile: