Aller au contenu


Photo
- - - - -

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

ADC multiplexeur arduino analogique potentiometre

7 réponses à ce sujet

#1 Bacab

Bacab

    Nouveau membre

  • Membres
  • 69 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
  • 8 388 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

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 ! 

 

Les réalisations de Mike118  

 

 

 


#3 Bacab

Bacab

    Nouveau membre

  • Membres
  • 69 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
  • 4 815 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

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. :(


https://www.facebook.com/Exploration-Robotisée-de-notre-patrimoine-564661773904152/

 

Objectif : Explora85 doit rouler dans l'été et une exploration avant la fin de l'année 2020.


#5 Bacab

Bacab

    Nouveau membre

  • Membres
  • 69 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
  • 4 815 messages
  • Gender:Male
  • Location:Vendée
  • Interests:Robotique, informatique, architecture et patrimoine...

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.


https://www.facebook.com/Exploration-Robotisée-de-notre-patrimoine-564661773904152/

 

Objectif : Explora85 doit rouler dans l'été et une exploration avant la fin de l'année 2020.


#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 388 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

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 ! 

 

Les réalisations de Mike118  

 

 

 


#8 Bacab

Bacab

    Nouveau membre

  • Membres
  • 69 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 !





Répondre à ce sujet



  



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

0 members, 0 guests, 0 anonymous users