Go Down

Topic: 4051 en entrée numérique (Read 4942 times) previous topic - next topic

vohu

Bonsoir,

J'ai un petit problème avec le composant 4051.

Je voudrais l'utiliser en tant qu'entrée numérique... les seuls exemples que je trouve l'utilise en sortie :(

Je voulais savoir comment on fait pour lire les informations sur les 3 fils qu'on branche sur l'arduino.
Je suppose qu'un des 3 correspond à CLOCK, et que le signal passe dans les 2 autres.

Par contre, je n'ai aucune idée de comment récupérer l'information. que ce soit sous forme binaire ou décimale

J'ai branché les 8 entrées du 4051 sur des interrupteurs avec une résistance de pull-up.



skywodd

Salut,

Pour utiliser un CD4051 c'est trés simple, imagine toi 8 interrupteurs, avec chacun un numéro, avec les trois broche A, B, C tu choisi (en binaire) le numéro de l'interrupteur que tu veux "fermer" et tout les autres seront ouvert.

Que ce soit en entrée ou en sortie c'est la même chose, dit toi que c'est un "bête" interrupteur/sélecteur ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

vohu


bbs

#3
Dec 08, 2011, 08:56 pm Last Edit: Dec 08, 2011, 09:07 pm by bbs Reason: 1
Hello,

Le 4051 n'est pas un composant synchrone, pas d'horloge. Tu donne une "adresse" sur les pin 9(S2), 10(S1) et 11(S0) et tu lis la valeur de la broche Yx sur la 3 (Z).
En fait la seule chose à compter c'est le temps de propagation (Cf le datasheet).
Exemple avec un MC14051 (ceux que j'utilise), le temps max est de 90ns.

Pour info tu devrais être en mesure d'utiliser la res de pullup intégré sur la pin de lecture :)

D.

[Edit: c'est malin on a fait un cross post]
I've lost my mind, but I've a backup tape ... somewhere

skywodd


oui mais comment on lit ?

Tu place les broches A, B, C selon le mot binaire qui va bien pour sélectionner la broche que tu veux du CD4051, une fois que c'est fait le CD4051 se comporte comme un interrupteur entre la broche sélectionnée et la broche de l'arduino, en gros c'est comme si tu avait un fil.
Pour lire digitalRead() ou AnalogRead() selon le cas, au niveau de la broche Z du CD4051.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

vohu

pwaaa... je comprends rien... je vais faire un shémas.. je reviens

Artouste


oui mais comment on lit ?


bonsoir
c'est dans le but de retrofiter votre "orgue" ?
si oui , je ne suis pas sur que ce soit le compo le plus adapaté !

mais pour ce qui serait d'interfacer un 4051 sur un arduino
c'est assez simple
3 bits en sortie d'arduino pour positionner l'adresse
et lire ensuite si en sortie il y qq chose , soit sur une entrée digital (0/1) soit sur une entrée ana (le 4051 est un pseudo inter ), de l'arduino

vohu

#7
Dec 08, 2011, 09:20 pm Last Edit: Dec 08, 2011, 09:23 pm by vohu Reason: 1
oui c'est ça :$

j'ai fait des shémas ici : http://arduino.cc/forum/index.php/topic,81596.15.html


en fait, ce que je comprends pas avec ce 4051, c'est qu'il a bien 8 broches, qui sont soit des entrées soit des sorties.

j'ai bien compris qu'en envoyant sur A B C  un courant ou non, on transforme ce signal 3 bits, en une sortie sur 8 bits dont un seul sera sur 1.

par contre pour lire.

si j'ai bien compris on ne lit pas sur A B C, mais sur Z, et selon qu'on lit le signal avec analogRead ou digitalRead, on récupére dans un cas une valeur entre 0 et 255, mais dans l'autre ??


moi j'espérais qu'en envoyant sur les broches 1 à 8 avec les intérupteurs, "10101101" il renvoie à l'arduino  "173"

bbs

Comme son nom (digital) l'indique un zero ou un un :)


D.
I've lost my mind, but I've a backup tape ... somewhere

osaka

#9
Dec 08, 2011, 09:44 pm Last Edit: Dec 08, 2011, 10:28 pm by osaka Reason: 1
Imagine 3 bit (111) représenté par ABC, 3bit ça donne 8 possibilité donc en décimal l'équivalent serait les nombres de 0 à 7.

000 = 0 = 000
001 = 1 = 00C
010 = 2 = 0B0
011 = 3 = 0BC
100 = 4 = A00
101 = 5 = A0C
110 = 6 = AB0
111 = 7 = ABC

Code: [Select]

    #define A  3 //sortie digitale 3 -> so0
    #define B  4 //sortie digitale 4 -> so1
    #define C  5 //sortie digitale 5 -> so2

    #define Z 0 //entrée analogique 0 -> z
   
    pinMode(A, OUTPUT);
    pinMode(B, OUTPUT);
    pinMode(C, OUTPUT);

    //activation du canal 5 (101)
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);

    analogRead(Z);



moi j'espérais qu'en envoyant sur les broches 1 à 8 avec les intérupteurs, "10101101" il renvoie à l'arduino  "173"


Il y a moyen, suffit de lire l’état de chaque entrée les placé ou il faut en décalent.

Code: [Select]

canal0 = 1
canal1 = 0
canal2 = 1
canal3 = 1
canal4 = 0
canal5 = 1
canal6 = 0
canal7 = 1

byte val;

val = canal0 ;
val |= canal1 << 1;
val |= canal2 << 2;
val |= canal3 << 3;
val |= canal4 << 4;
val |= canal5 << 5;
val |= canal6 << 6;
val |= canal7 << 7;

//val = 173

bbs

#10
Dec 08, 2011, 09:51 pm Last Edit: Dec 08, 2011, 09:55 pm by bbs Reason: 1
Je pense que ça ressemble a ce que tu cherche :)

Code: [Select]

uint8_t ButtonScan::readByAddr() {
 uint8_t rv = 0;
 for(byte count = 0; count < 8; count++) {

   // Dismantle the count value into bits and
   // Write them to the 3 wire used as address
   digitalWrite(in0, bitRead(count,0));
   digitalWrite(in1, bitRead(count,1));
   digitalWrite(in2, bitRead(count,2));

   // Read the current bit and raise it in the readValue
   bitWrite(rv, count, digitalRead(readpin));
 }
 return rv;
}


D.

[Edit ceci est tiré d'une micro lib que j'ai faite, en in0, in1 et in2 sont les pin S0, S1 et S2 et readpin c'est Z :) ]
I've lost my mind, but I've a backup tape ... somewhere

vohu

osaka :
http://miscellanea.com/wp-content/uploads/2011/01/4051.jpg
j'ai cablé comme sur ce shémas, sauf, sur 3 4 5 pour A B C et A0 pour la pin Z


J'ai un peu modifier le code pour pouvoir afficher
Code: [Select]

#define A  3 //sortie digitale 3 -> so0
#define B  4 //sortie digitale 4 -> so1
#define C  5 //sortie digitale 5 -> so2

#define Z  A0 //entrée analogique 0 -> z

void setup()
{
  Serial.begin(9600);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
}

void loop() {

  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);

  int res = analogRead(Z);

  Serial.println(res, DEC);
  delay(100);
}


résultat : des trucs au hazard :(


BBS > je vais voir comment on utilise ce code (je ne connais que le C et pas C++)

bbs

C, C++ dans ce cas là, aucune différence.
Voici la version en C:

Code: [Select]

#define Pin4051_S0 8
#define Pin4051_S1 9
#define Pin4051_S2 10

#define Pin4051_Z A0

uint8_t scan4051() {
  uint8_t rv = 0;
  for(byte count = 0; count < 8; count++) {

    // Dismantle the count value into bits and
    // Write them to the 3 wire used as address
    digitalWrite(Pin4051_S0, bitRead(count,0));
    digitalWrite(Pin4051_S1, bitRead(count,1));
    digitalWrite(Pin4051_S2, bitRead(count,2));

    // Read the current bit and raise it in the readValue
    bitWrite(rv, count, digitalRead(Pin4051_Z));
  }
  return rv;
}


[Note, pas testé mais ça devrait marcher [faut vérifier les defines de pin entre autre] :D]

D.
I've lost my mind, but I've a backup tape ... somewhere

osaka

#13
Dec 08, 2011, 11:01 pm Last Edit: Dec 08, 2011, 11:04 pm by osaka Reason: 1
C'était juste un exemple pour mieux comprendre, enfin ça doit s'en approché.
Si c'est l'état d'un des canal et que tu veux relevé une simple valeur  numérique.

Code: [Select]

#define A  3 //sortie digitale 3 -> so0
#define B  4 //sortie digitale 4 -> so1
#define C  5 //sortie digitale 5 -> so2

#define Z  14 //entrée numérique 14 -> z  //(A0 ana = 14 Num)

void setup()
{
 Serial.begin(9600);
 pinMode(A, OUTPUT);
 pinMode(B, OUTPUT);
 pinMode(C, OUTPUT);
 pinMode(Z, INPUT);
}

void loop() {

 //canal7 sélectionné.
 digitalWrite(A, HIGH);
 digitalWrite(B, HIGH);
 digitalWrite(C, HIGH);

 int res = digitalRead(Z);

 Serial.println(res, DEC);
 delay(100);


vohu

ça me donne ça comme résultat :



321
302
286
432
489
389
323
308
282
382
484
417
325
314
288
332
471
458
332
319
297
289
448

Go Up