Home / Tutoriels / Arduino / Comment augmenter les broches analogiques de la carte Arduino Uno avec le multiplexeur analogique CD4051?

Comment augmenter les broches analogiques de la carte Arduino Uno avec le multiplexeur analogique CD4051?

Vous venez d’acheter un multiplexeur CD4051 chez YoupiLab. Merci pour votre fidélité !

Utiliser plus de broches analogiques que prévues.

Les points à développer :

  • Le CD4051?
  • Câblage avec Arduino
  • Le simple code pour le test

Le CD4051 

Le CD4051 est un multiplexeur analogique.

Une carte Arduino UNO dispose de 6 entrées analogiques, mais que faire si l’on veut câbler 8 potentiomètres ? Une solution simple serait d’utiliser une carte Arduino Mega2560 qui dispose de 16 entrées analogiques, mais cela pourrait être un peu disproportionné et couteux si le reste du circuit n’est pas très complexe.

Une bien meilleure solution quand on manque d’entrées analogiques (ou numérique), sans pour autant avoir besoin (ou envie) d’utiliser une carte plus « riche » en entrées / sorties, est d’utiliser un (dé)multiplexeur analogique. Dans cet article nous allons voir ensemble le fonctionnement d’un (dé)multiplexeur analogique 8 voies, le CD4051B.

N.B. Le circuit intégré CD4051B existe aussi en version 74HCxxxx sous la référence 74HC4051. C’est le même circuit intégré, seule la technologie utilisée pour le fabriquer est différente. Si vous ne savez pas quoi prendre, achetez un CD4051B.

Le circuit intégré CD4051B est un multiplexeur / démultiplexeur analogique huit voies bidirectionnelles.

Pour faire simple, il s’agit d’une série de huit interrupteurs contrôlés électroniquement et miniaturisés dans un même circuit intégré, avec d’un côté huit connexions indépendantes et de l’autre une connexion commune.

N.B. Le CD4051B se comporte comme un interrupteur, dans les deux sens, cela signifie que l’on peut s’en servir pour connecter plusieurs capteurs à une même entrée analogique ou à l’inverse, connecter plusieurs actionneurs à une même sortie PWM par exemple. Attention, le signal n’est cependant transmis aux broches d’entrées / sorties que lorsque la voie adéquate est active. Si vous envoyez un signal PWM sur la voie n°0, en passant sur la voie n°1, le signal sur la voie n°0 s’arrêtera, comme avec un interrupteur classique.

PS : Une seule voie est active à tout instant t. Il n’est pas possible d’avoir plusieurs voies actives en même temps.

PS : Le CD4051B est conçu pour manipuler des signaux analogiques, mais rien n’empêche de l’utiliser avec des signaux numériques si besoin. C’est même un très bon outil pour connecter facilement un grand nombre de boutons poussoirs par exemple.

Pour le câblage du CD4051B, on retrouve :

  • une broche d’alimentation positive (VDD, de 3 à 20 volts maximum),
  • une broche d’alimentation négative (VEE, optionnelle, uniquement si besoin de mesurer des signaux analogiques inférieurs à 0 volt, à relier à la masse sinon),
  • une masse (VSS),
  • huit broches d’entrées / sorties indépendantes sur lesquelles connecter ses capteurs / actionneurs,
  • trois broches d’adresses pour sélectionner la voie à connecter (A, B, C),
  • une broche d’activation (INH),
  • une broche d’entrée / sortie commune sur laquelle connecter sa carte Arduino.

Câblage avec Arduino

Pour démontrer l’utilité du CD4051B, je vous propose de faire un montage de démonstration simple, mais efficace.

Voilà le problème à résoudre : 8 potentiomètres, une seule entrée analogique. C’est le cas d’usage parfait pour un CD4051B.

Matériel nécessaire

Pour réaliser ce montage, il va falloir :

  • Une carte Arduino UNO (et son câble USB),
  • Un CD4051B ou 74HC4051,
  • Huit potentiomètres de 10K ohms,
  • Un condensateur de 100 nF (optionnel),
  • Une plaque d’essai et une montagne de fils pour câbler le montage.

Vue schématique du montage

Vue prototypage du montage

Pour faire ce circuit, il faut commencer par relier les broches INH,  A,  B, et  C respectivement aux broches D2,  D3,  D4 et D5 la carte Arduino.

On relie ensuite les broches VSS et VEE à la masse de la carte Arduino (GND) et la broche VDD à la broche 5V de la carte Arduino.

On continue en reliant la broche commune à la broche A0 de la carte Arduino.

N.B. Il est possible d’utiliser n’importe quelle broche numérique pour câbler A, B, C et INH. Le choix des broches D2, D3, D4 et D5 pour ce tutoriel est parfaitement arbitraire, libre à vous de choisir d’autres broches si vous le souhaitez. Vous pouvez aussi choisir d’utiliser une autre broche que la broche A0 de la carte Arduino pour la broche commune du CD4051B.

Le montage fini

On achève ensuite le circuit en reliant chaque sortie de potentiomètre à une des voies du CD4051B et chaque potentiomètre aux broches GND et 5V de la carte Arduino.

PS : Si vous le souhaitez, vous pouvez ajouter un condensateur de 100 nF entre les broches VDD et VSS du CD4051B pour améliorer sa résistance aux parasites en provenance de l’alimentation.

Le simple code pour tester

Le code

Le montage est prêt, passons au code !

Le code n’aura qu’un but : lire les huit potentiomètres du montage de démonstration et envoyer sur le port série les valeurs lues pour les afficher sur le PC via le moniteur série.

NB : Software

Windows10

Arduino 1.6.9

// Broches d’adresse

const byte PIN_ENABLE = 2;

const byte PIN_ADDR_A = 3;

const byte PIN_ADDR_B = 4;

const byte PIN_ADDR_C = 5;

// Broche de signal

const byte PIN_SIG = A0;

On commence le code comme d’habitude avec les classiques déclarations de broches, au moyen de diverses constantes, à raison d’une constante par broche.

PS : Vous remarquerez que j’ai utilisé un préfixe commun PIN_ pour toutes les broches et un autre PIN_ADDR_ pour les broches d’adresses. Cela rend le code plus simple et agréable à lire.

void setup(){

// Place les broches d’adresse en sortie et à LOW

pinMode(PIN_ADDR_A, OUTPUT);

pinMode(PIN_ADDR_B, OUTPUT);

pinMode(PIN_ADDR_C, OUTPUT);

digitalWrite(PIN_ADDR_A, LOW);

digitalWrite(PIN_ADDR_B, LOW);

digitalWrite(PIN_ADDR_C, LOW);

// Active le CD4051B

pinMode(PIN_ENABLE, OUTPUT);

digitalWrite(PIN_ENABLE, LOW);

// Message de bienvenue

Serial.begin(9600);

Serial.println(« Demonstration CD4051B »);

}

On continue ensuite avec la fonction setup(), qui a trois missions :

  • initialiser les broches d’adresse en sortie et à LOW,
  • initialiser la broche INH en sortie et à LOW, pour activer le CD4051B,

afficher un petit message de bienvenue

void loop(){

// Pour chaque voie, on renvoie la valeur sur le port série

for(byte i = 0; i < 8; i++){    Serial.print(« Voie « );

Serial.print(i);    Serial.print( » : « );

Serial.println(readAnalogMux(i));

}

// Delai pour l’affichage

delay(1000);

}

Vient ensuite la fonction loop(), qui se contente de passer en revue chaque voie du CD4051 via une boucle et de lire puis afficher la valeur de chaque voie.

Un délai d’une seconde vient terminer l’affichage et éviter que le moniteur série côté PC ne croule sous les lignes de texte.

Le code permettant de lire une voie du CD4051B est contenu dans la fonction readAnalogMux(), décrite juste après.

int readAnalogMux(byte channel) {

// On sélectionne la voie

digitalWrite(PIN_ADDR_A, bitRead(channel, 0));

digitalWrite(PIN_ADDR_B, bitRead(channel, 1));

digitalWrite(PIN_ADDR_C, bitRead(channel, 2));

// On lit la valeur courante

return analogRead(PIN_SIG);

}

La fonction readAnalogMux() ci-dessus permet de lire une voie du CD4051B. Le numéro de voie (entre 0 et 7) est passé en paramètre.

La fonction readAnalogMux() assigne d’abord les broches d’adresses en fonction du numéro de voie. Pour faire cela, j’utilise une petite astuce, la fonction bitRead() permet d’extraire la valeur d’un bit d’une valeur. La fonction bitRead() retourne la valeur 0 ou 1, ce qui correspond exactement aux valeurs de LOW et HIGH. Il suffit donc d’enchaîner trois bitRead() et trois digitalWrite() et le tour est joué.

Une fois les broches d’adresses configurées, il ne reste plus qu’à lire la valeur sur la broche commune avec un appel à la fonction analogRead().

Le code complet avec commentaires:

/*

* * Exemple de code pour le circuit intégré CD4051B.

*/

// Broches d’adresse

const byte PIN_ENABLE = 2;

const byte PIN_ADDR_A = 3;

const byte PIN_ADDR_B = 4;

const byte PIN_ADDR_C = 5;

// Broche de signal

const byte PIN_SIG = A0;

/*

* Fonction setup()

*/

void setup(){

// Place les broches d’adresse en sortie et à LOW

pinMode(PIN_ADDR_A, OUTPUT);

pinMode(PIN_ADDR_B, OUTPUT);

pinMode(PIN_ADDR_C, OUTPUT);

digitalWrite(PIN_ADDR_A, LOW);

digitalWrite(PIN_ADDR_B, LOW);

digitalWrite(PIN_ADDR_C, LOW);

// Active le CD4051B

pinMode(PIN_ENABLE, OUTPUT);

digitalWrite(PIN_ENABLE, LOW);

// Message de bienvenue

Serial.begin(9600);

Serial.println(« Demonstration CD4051B »);

}

/*

* Fonction loop()

*/

void loop(){

// Pour chaque voie on renvoie la valeur sur le port série

for(byte i = 0; i < 8; i++){

Serial.print(« Voie « );

Serial.print(i);

Serial.print( » : « );

Serial.println(readAnalogMux(i));

}

// Delai pour l’affichage

delay(1000);

}

/*

* Fonction de lecture pour le CD4051B

*/

int readAnalogMux(byte channel) {

// On sélectionne la voie

digitalWrite(PIN_ADDR_A, bitRead(channel, 0));

digitalWrite(PIN_ADDR_B, bitRead(channel, 1));

digitalWrite(PIN_ADDR_C, bitRead(channel, 2));

// On lit la valeur courante

return analogRead(PIN_SIG);

}

L’extrait de code ci-dessus est disponible en téléchargement sur cette page (le lien de téléchargement en .zip contient le projet Arduino prêt à l’emploi).

Voilà ce que donne le code ci-dessus dans le moniteur série :

Le résultat dans le moniteur série

 

Merci pour votre attention !

About nonfonjuniorm_lf80ckk1

Check Also

Comment utiliser le capteur de température et d’humidité DHT22?

Vous venez d’acheter un capteur de température et d’humidité DHT22 chez YoupiLab. Merci pour votre …

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *