4051 en entrée numérique

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.

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 ;)

oui mais comment on lit ?

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]

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

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

vohu: 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

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"

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

D.

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

    #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);

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

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

Je pense que ça ressemble a ce que tu cherche :slight_smile:

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 :slight_smile: ]

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

#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++)

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

#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.

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.

#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);

ç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

avec quel code ?

D.

Bonjour :)

j'ai ce résultat avec le code là :

#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);

J'ai testé l'autre, avec la fonction isolée et bitwrite. mais, elle me renvoie que des 255

Peut être regardé du côté du branchement des bp ?