impossible de récupérer valeurs multiplexeur (Arduino Uno)

Salut tout le monde :slight_smile: ! premier poste (après des recherches vaines), je vous expose mon petit problème et vais essayer de faire au mieux.

Débutant en électronique mon premier projet etait un controleur midi-usb à 3 potentiomètres (j'utilise loop be 1 et hairless midiserial bridge pour la connexion midi usb, puis mapping sur ableton).

Aujourd'hui je tente avec 8 potentiomètres à l'aide d'un multiplexeur 8 voie (le CD4051BE).
Le montage multiplexeur-potards fonctionne, je retrouve bien dans le moniteur série mes 8 valeurs de potards différents.

le problème est pour récupérer les valeurs de chaque voie du multiplexeur afin de les utiliser pour transmettre un message midi. j'utilise cette fonction (accompagné d'une librairie midi)qui fonctionnait dans mon ancien projet :

val2 = analogRead(0)/8;   
  MIDImessage(176,2,val2);

Je pense que le problème vient du fait que chaque potard passe par la même voie analogique, je ne sais pas comment selectionner d'une autre manière la valeur de chaque voie indépendamment..
Quelqu'un peut-il m'éclairer svp ... ? Voici le code :

(je ne travaille que sur trois potard, j'ai reliés les autres à la masse le temps de régler le problème ^^)

//potards
int val = 0;  
int val2 = 0;
int val3 = 0;

// Les pins utilisés (multiplexeur)
#define entreeAnalogique A0
#define pinS2 5
#define pinS1 4
#define pinS0 3

void setup()
{
  Serial.begin(9600);

  pinMode(pinS2, OUTPUT);
  pinMode(pinS1, OUTPUT);
  pinMode(pinS0, OUTPUT);
}

void loop()
{
  // lecture du capteur relié a l'entrée Y0 du CD4051
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, LOW);   
  Serial.print(analogRead(A0));
  Serial.print("  "); 

  val = analogRead(0)/8;   // divise par 8 pour avoir un rang de 0-127 pour le midi
  MIDImessage(176,1,val);  // 176 = CC command (channel 1 control change), 1 = Which Control, val = value read from Potentionmeter 1 NOTE THIS SAYS VAL not VA1 (lowercase of course)
  

  // lecture du capteur relié a l'entrée Y1 du CD4051
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, LOW);
  digitalWrite(pinS0, HIGH);
  Serial.print(analogRead(A0));
  Serial.print("  "); 

  val2 = analogRead(0)/8;   
  MIDImessage(176,2,val2);     


  // lecture du capteur relié a l'entrée Y2 du CD4051
  digitalWrite(pinS2, LOW);
  digitalWrite(pinS1, HIGH);
  digitalWrite(pinS0, LOW);
  Serial.print(analogRead(A0));
  Serial.print("  "); 

  val3 = analogRead(0)/8;   
  MIDImessage(176,3,val3);

void MIDImessage(byte command, byte data1, byte data2) //pass values out through standard Midi Command
{
   Serial.write(command);
   Serial.write(data1);
   Serial.write(data2);
}

J'espère avoir été assez clair et merci d'avance si quelqu'un réussi à m'aider .. ! :smiley:

Bonjour,

Je ne vois pas bien ou est le problème. Si la valeurs s'affichent correctement sur le moniteur série alors les acquisitions se font bien.
Une fois tu utilises analogRead(A0) et la fois suivante tu utilises analogRead(0), ce n'est pas ça le problème car les deux doivent fonctionner, mais ce n'est pas cohérent et source de doute. De toute façon ce n'est pas une bonne pratique de lire une valeur, de l'afficher et de relire la valeur pour la traiter (qu'est ce qui garanti que c'est la même?). Il faut lire la valeur dans une variable, afficher cette variable et traiter la valeur rangée dans la variable.

On ne voit pas ton image. Le lien référence une image sur ton ordinateur et on n'a pas accès à ton ordinateur :). Il faut que tu héberges ton image sur un hébergeur d'images par exemple http://www.hostingpics.net/. Tu peux aussi la mettre en piece jointe.

Un mux analogique ce n'est pas une bête de course. Il possède des temps d'établissement et de stabilisation --> renseignements que l'on peut obtenir dans la datasheet du mux.
Je ne dis pas que c'est la cause mais c'est une piste qui mérite être confirmée ou infirmée.

Une bonne démarche de mise au point avec le matériel quand les résultats ne correspondent pas aux attentes est d'intercaller des delay() de mise au point.
Le but n'est pas de mettre des delay() pour le plaisir d'en mettre mais de voir si le programme n'est pas trop rapide pour le matériel.
Par la suite il faudra retirer tout ceux qui sont inutiles et réduire au strict minimum tout ceux qui sont nécessaire au bon fonctionnement du montage.