Aller au contenu


Photo
- - - - -

Problème avec un multiplexeur analogique et l'ADC de l'Arduino

ADC multiplexeur arduino analogique potentiometre

19 réponses à ce sujet

#1 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 25 janvier 2020 - 12:54

Bonjour,

 

Il y a quelques temps j'ai finis de fabriquer une "boîte à boutons" que je souhaiterais utiliser avec mes simulateurs d'avions sur mon ordinateur. La boîte comporte 16 boutons et 6 axes. Grâce au projet Unojoy j'ai pu reprogrammer mon Arduino pour la faire reconnaître comme un joystick par mon ordinateur et cela fonctionne très bien.

 

DSC_0032.JPG

 

Pour avoir 16 entrées numériques et 6 entrées analogiques j'ai utilisé un shield DFRobot qui utilise un multiplexeur géré par I2C. Par conséquent 2 entrées analogiques (A4 et A5 si je ne dis pas de bêtise) ne sont pas accessible et j'ai ajouté un multiplexeur analogique CD4051B pour quand même avoir mes six axes. L'entrée A1 de l'Arduino est donc toujours celle qui est lue. Comme les potentiomètres sont des 100k linéaires (erreur de ma part à la commande) j'ai mis 2 lectures consécutives de l'ADC et je ne garde que la seconde pour laisser le temps au condensateur de l'ADC de se charger (à ma connaissance il n'est pas possible de ralentir l'ADC de l'Arduino au delà de la valeur par défaut puisque le prescaler a 128 pour valeurs max.).

 

Je rencontre néanmoins un problème lorsque certains axes sont dans certaines positions. J'ai remarqué que si je mets un des axes à sa position maximum (1023 sur l'ADC) un autre axe se met à contrôler tous les axes en même temps. Autre bizarrerie : si je mets tous les axes à ~50% les lectures deviennent complètement erratiques (variation des valeurs lues très rapide entre 0 et 1023).

 

J'ai, en premier lieu, suspecté un court-circuit mais je ne le trouve pas. Est-ce qu'il y a une autre piste à explorer ?

 

Je vous remercie par avance pour votre aide.

 

Le code :

#include <clsPCA9555.h>
#include "UnoJoy.h"

int time_delay = 10;
int i = 0;
int prev_value[6] = {128,128,128,128,128,128};
PCA9555 ioport(0x20);

void setup()
{
  setupPins();
  setupUnoJoy();
}

void loop()
{
  delay(time_delay);
  // Always be getting fresh data
  dataForController_t controllerData = getControllerData(i, prev_value);
  prev_value[0] = controllerData.x_axis;
  prev_value[1] = controllerData.y_axis;
  prev_value[2] = controllerData.z_axis;
  prev_value[3] = controllerData.r_x_axis;
  prev_value[4] = controllerData.r_y_axis;
  prev_value[5] = controllerData.r_z_axis;
  setControllerData(controllerData);
  
  i++;
  if(i==6)
  {
    i=0;
  }
}

void setupPins(void)
{
  ioport.begin();
  ioport.pinMode(ED0, INPUT);
  ioport.pinMode(ED1, INPUT);
  ioport.pinMode(ED2, INPUT);
  ioport.pinMode(ED3, INPUT);
  ioport.pinMode(ED4, INPUT);
  ioport.pinMode(ED5, INPUT);
  ioport.pinMode(ED6, INPUT);
  ioport.pinMode(ED7, INPUT);
  ioport.pinMode(ED8, INPUT);
  ioport.pinMode(ED9, INPUT);
  ioport.pinMode(ED10, INPUT);
  ioport.pinMode(ED11, INPUT);
  ioport.pinMode(ED12, INPUT);
  ioport.pinMode(ED13, INPUT);
  ioport.pinMode(ED14, INPUT);
  ioport.pinMode(ED15, INPUT);
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
}

dataForController_t getControllerData(int axis_to_read, int* data_to_save)
{
  dataForController_t controllerData = getBlankDataForController();
  controllerData.x_axis   = data_to_save[0];
  controllerData.y_axis   = data_to_save[1];
  controllerData.z_axis   = data_to_save[2];
  controllerData.r_x_axis = data_to_save[3];
  controllerData.r_y_axis = data_to_save[4];
  controllerData.r_z_axis = data_to_save[5];
  switch(axis_to_read)
  {
    case(0):
      // cas 0 = 000
      digitalWrite(A0, LOW);
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.x_axis = analogRead(A1)>>2;
      break;
    case(1):  
      // cas 1 = 001
      digitalWrite(A0, HIGH);
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.y_axis = analogRead(A1)>>2;
      break;
    case(2):
      // cas 2 = 010
      digitalWrite(A0, LOW);
      digitalWrite(A2, HIGH);
      digitalWrite(A3, LOW);
      analogRead(A1);
      controllerData.z_axis = analogRead(A1)>>2;
      break;
    case(3):
    // cas 4 = 100
      digitalWrite(A0, LOW);
      digitalWrite(A2, LOW);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_x_axis = analogRead(A1)>>2;
      break;
    case(4):
      // cas 5 = 101
      digitalWrite(A0, HIGH);
      digitalWrite(A2, LOW);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_y_axis = analogRead(A1)>>2;
      break;
    case(5):
      // cas 7 = 111
      digitalWrite(A0, HIGH);
      digitalWrite(A2, HIGH);
      digitalWrite(A3, HIGH);
      analogRead(A1);
      controllerData.r_z_axis = analogRead(A1)>>2;
      break;
  }
  
  controllerData.btn_01 = !ioport.digitalRead(ED0);
  controllerData.btn_02 = !ioport.digitalRead(ED1);
  controllerData.btn_03 = !ioport.digitalRead(ED2);
  controllerData.btn_04 = !ioport.digitalRead(ED3);
  controllerData.btn_05 = !ioport.digitalRead(ED4);
  controllerData.btn_06 = !ioport.digitalRead(ED5);
  controllerData.btn_07 = !ioport.digitalRead(ED6);
  controllerData.btn_08 = !ioport.digitalRead(ED7);
  controllerData.btn_09 = !ioport.digitalRead(ED8);
  controllerData.btn_10 = !ioport.digitalRead(ED9);
  controllerData.btn_11 = !ioport.digitalRead(ED10);
  controllerData.btn_12 = !ioport.digitalRead(ED11);
  controllerData.btn_13 = !ioport.digitalRead(ED12);
  controllerData.btn_14 = !ioport.digitalRead(ED13);
  controllerData.btn_15 = !ioport.digitalRead(ED14);
  controllerData.btn_16 = !ioport.digitalRead(ED15);
  
  return controllerData;
}

Le schéma du montage (je n'ai mis que la partie analogique) :

schema_electrique.JPG

 

Contrairement à ce qui est affiché sur le schéma c'est bien un CD4051 que j'utilise (pas trouvé de schéma pour Spice donc j'ai mis un circuit équivalent). Le voltmètre avec la résistance d'un Meg en parallèle représente l'ADC de l'Arduino Uno.



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 25 janvier 2020 - 03:46

rajoute des petites résistances de chaque côté de tes potentiomètre. 
Avec un tel schémas tu n'as pas le droit d'aller en buté sur tes potientiomètres... Sinon c'est comme si tu court-circuit tes autres potentiomètres... 

Avec les petites résistance de chaque côté tu pourras aller en buté ça ne fera pas de court-circuit.  


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 25 janvier 2020 - 05:58

rajoute des petites résistances de chaque côté de tes potentiomètre. 
Avec un tel schémas tu n'as pas le droit d'aller en buté sur tes potientiomètres... Sinon c'est comme si tu court-circuit tes autres potentiomètres... 

Avec les petites résistance de chaque côté tu pourras aller en buté ça ne fera pas de court-circuit.  

Merci pour ta réponse mais je ne comprends pas pourquoi il y aurait-il un court circuit ? Peut importe la position du curseur la résistance entre la pin 1 (+5V) et la pin 3 (GND) de chaque potentiomètre est de 100k. Il n'y a que la pin 2 qui, lorsque le curseur est à 0, est directement reliée à l'entrée ADC de l'Arduino (si cette entrée est celle qui est transmise par le multiplexeur).



#4 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2020 - 06:04

Tu a pris quoi comme arduino ?

Pour faire quelque chose de similaire, j'ai pris une arduino Leonardo, plus adaptée pour ça, et elle a 12 entrées analogique donc même si j'en perds 2 il m'en reste encore mais pourquoi j'en perdrais :D .

Par contre je ne comprend pas pourquoi tu as ce problème avec la position des potentiomètres. :(


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#5 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 25 janvier 2020 - 06:18

Tu a pris quoi comme arduino ?

Pour faire quelque chose de similaire, j'ai pris une arduino Leonardo, plus adaptée pour ça, et elle a 12 entrées analogique donc même si j'en perds 2 il m'en reste encore mais pourquoi j'en perdrais :D .

Par contre je ne comprend pas pourquoi tu as ce problème avec la position des potentiomètres. :(

J'utilise une Arduino Uno car c'est ce que j'avais sous la main lorsque j'ai commencé ce projet. Au départ je n'avais pas saisi que le shield d'extension d'entrées numériques me priverait de deux entrées analogiques.

Je pensais que le plus dure serait de reprogrammer la puce qui fait la communication entre l'Arduino et le PC mais au final, grâce au code d'UnoJoy, je n'ai mis qu'un WE pour faire reconnaître l’Arduino comme un joystick à 6 axes et 24 boutons (seul 16 sont utilisés).



#6 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 25 janvier 2020 - 06:31

J'ai découvert seulement le mois dernier que l'arduino Leonardo était simple à utiliser pour faire ça en achetant un magazine de simulation, avant je ne pensais même pas que c'était possible.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 26 janvier 2020 - 02:01

Mea culpa  j'ai mal lu le schemas et fais un amalgame avec la lecture de la description du problème rencontré . 

Personnellement juste à la lecture du problème rencontré je chercherais à voir si il y a pas un décalage entre le schémas et la réalisation ... Genre un potentiomètre qui aurait eu deux fils inversé ...
Pour cela, sous tension, prendre un multimètre et vérifier manuellement chacune des voies sur l'ensemble de la plage du potentiomètre en mode " lecture du voltage " 

Ou bien hors tension, en mode lecture de la valeur de la résistance. 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#8 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 26 janvier 2020 - 11:18

Mea culpa  j'ai mal lu le schemas et fais un amalgame avec la lecture de la description du problème rencontré . 

Personnellement juste à la lecture du problème rencontré je chercherais à voir si il y a pas un décalage entre le schémas et la réalisation ... Genre un potentiomètre qui aurait eu deux fils inversé ...
Pour cela, sous tension, prendre un multimètre et vérifier manuellement chacune des voies sur l'ensemble de la plage du potentiomètre en mode " lecture du voltage " 

Ou bien hors tension, en mode lecture de la valeur de la résistance. 

 

Bon ben je connais le programme du week-end prochain. Merci !



#9 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 25 mars 2020 - 08:59

Au final il y avait bien un court circuit et je ne l'avais pas trouvé car les sondes de mon multimètres ne fonctionnaient plus. J'ai changé les sondes et ça va beaucoup mieux. Et comme les PCB chinois c'est pas chère j'ai fini par en faire faire un pour ce montage aussi simpliste soit-il (ce qui fait gagner accessoirement beaucoup de place en réduisant le nombre de fils !).

Par contre avec la crise sanitaire j'ai attendu longtemps mon PCB mais bon il a fini par arriver, j'ai soudé et testé et c'est nickel :DSC_0037.JPG

 



#10 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 25 mars 2020 - 10:36

Du coup il y avait bien un écart entre le schémas et le réel ? Et quand tu mettais un potentiomètre en butté tu faisais un court circuit ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#11 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 25 mars 2020 - 05:46

Du coup il y avait bien un écart entre le schémas et le réel ? Et quand tu mettais un potentiomètre en butté tu faisais un court circuit ? 

Il y avait sans doute un écart entre le schéma et le circuit que j'avais fait sur une carte pastillée de prototypage. Mettre un potentiomètre en butée causait certaines fois un problèmes mais pas tout le temps. Et de temps à autres il y avait des oscillations. Je me suis demandé s'il était possible qu'entre 2 pattes une capacité ait pu apparaître.



#12 Snyp54

Snyp54

    Membre

  • Membres
  • 32 messages

Posté 26 mars 2020 - 03:59

Sympa comme projet, tu aurais une vidéo en action avec ton "jeu" ?



#13 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 27 mars 2020 - 01:40

Sympa comme projet, tu aurais une vidéo en action avec ton "jeu" ?

J'en ferai une dés que l'habillage sera terminé : malgré mes efforts le PCB ne s'aligne pas correctement avec le panneau donc je dois refaire ce dernier ce qui va me prendre jusqu'à la fin de la semaine je pense.



#14 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 27 mars 2020 - 06:44

Quand je fais un PCB je commence toujours par positionner les 4 trous de fixations et dessiner le contour de ma carte ... 

Ou quand j'ai des composants qui se fixent dans un panneau je commence par placer ces composants en premier ... 

 

C'est quoi qui ne s'aligne pas dans ton cas? 

 

C'est toi qui a fait ton panneau ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#15 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 27 mars 2020 - 07:33

Quand je fais un PCB je commence toujours par positionner les 4 trous de fixations et dessiner le contour de ma carte ... 

Ou quand j'ai des composants qui se fixent dans un panneau je commence par placer ces composants en premier ... 

 

C'est quoi qui ne s'aligne pas dans ton cas? 

 

C'est toi qui a fait ton panneau ? 

Oui c'est moi qui ait fait le panneau. Ça ne s'alignait pas car je n'avais pas prévu d'avoir recours à un PCB au début (juste une plaquette de prototypage et des fils libres). J'ai fait le PCB après (pour résoudre une fois pour toutes ces problèmes de court-circuit) et à 1 mm près il ne s'alignait pas avec le panneau déjà imprimé. Ça plus une bourde de ma part (le PCB fait pile la taille du premier panneau, difficile de l'insérer dans sa boîte comme ça). Je suis donc partis pour réimprimer la boîte aussi. Mais ça avance :



#16 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 27 mars 2020 - 07:51

Du coup autant ne faire que réimprimer plutôt que refaire le pcb non ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#17 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 27 mars 2020 - 09:23

Du coup autant ne faire que réimprimer plutôt que refaire le pcb non ? 

Ben justement c'est ce que je fais, je réimprime le panneau et je garde le PCB. Par contre c'est long : la panneau 7h d'impression et la boîte 14 h.



#18 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 27 mars 2020 - 11:11

Si tu mets ça en perspective par rapport au temps pour avoir le pcb je trouve ça court :P 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#19 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 28 mars 2020 - 09:28

Si tu mets ça en perspective par rapport au temps pour avoir le pcb je trouve ça court :P

C'est pas faux :)



#20 Bacab

Bacab

    Membre occasionnel

  • Membres
  • Pip
  • 108 messages
  • Gender:Male

Posté 05 avril 2020 - 06:06

Voila le projet fini en utilisation :

J'ai fait ça un peu à l'arrache donc on voit pas super bien sur quoi j'appuie parce que j'ai la main dessus. N'hésitez pas à lire la description de la vidéo qui contient plus d'informations.





Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : ADC, multiplexeur, arduino, analogique, potentiometre

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users