Arduino Uno comme testeur 74HC4051 (MUX/DEMUX)
Placé surTest 74HC4051
Le 74HC4051 est un CI multiplexeur/démultiplexeur. Pour tester cela, l' Arduino Uno peut être utilisé avec deux circuits intégrés 74HC4051. Le premier IC agit comme un multiplexeur, le second comme un démultiplexeur.
brochage
![]() | Pour une numérotation correcte des broches, gardez l'encoche dans l'IC vers la gauche ! La broche en bas à gauche est la broche numéro 1. Continuez à compter vers la droite jusqu'à la broche numéro 8. La broche en haut à droite est la broche numéro 9. Continuez maintenant à compter vers la gauche jusqu'au numéro de broche 16 inclus. La configuration des broches du 74HC4051 est la suivante : |
Broche | Étiqueter | Fonction |
1 | A4 | Entrée/sortie de canal |
2 | A6 | Entrée/sortie de canal |
3 | A | Entrée/sortie commune |
4 | A7 | Entrée/sortie de canal |
5 | A5 | Entrée/sortie de canal |
6 | ~E | Activer (négatif) |
7 | Bétail | Alimentation négative |
8 | Terre | Masse (0V) |
9 | Vcc | Alimentation (5Vdc) |
10 | A2 | Entrée/sortie de canal |
11 | A1 | Entrée/sortie de canal |
12 | A0 | Entrée/sortie de canal |
13 | A3 | Entrée/sortie de canal |
14 | S0 | Bit 0 de la ligne d'adresse |
15 | S1 | Ligne d'adresse bit 1 |
16 | S2 | Bit 2 de la ligne d'adresse |
Test numérique
Bien que le 74HC4051 soit un MUX/DEMUX analogique, il ne peut pas être testé en analogique avec l' Arduino Uno car il n'a pas de sorties analogiques (DAC). Plus loin dans cet article, il est décrit comment cela peut être réalisé avec une carte de dérivation DAC. Pour tester numériquement, seule la carte Arduino et 2 circuits intégrés sont nécessaires.
Connecter
Réglez la broche 16 (Vcc) des deux CI sur 5VDC ; broche 8 (GND) à 0V.
Connectez également les broches 6 (~E) et 7 (Vee) des deux CI à GND.
Connectez les broches suivantes des deux CI : 1,2,4,5,15,16,13,12 (A0..A7).
Connectez les broches 11 (S0) des deux CI à la carte Arduino sur A0.
Connectez la broche 12 (S1) des deux CI à la carte Arduino sur A1.
Connectez les broches 13 (S2) des deux CI à la carte Arduino sur A2.
Depuis IC 1, connectez la broche 3 (A) à la carte Arduino sur A4.
Depuis IC 2, connectez la broche 3 (A) à la carte Arduino sur A5.

Code Arduino
Utilisez le code suivant pour l' Arduino
Test 74HC4051 MUX/DEMUX met Arduino Uno
/****************************************************************
Configuratie
****************************************************************/
#define pinS0 A0 // Address select 0
#define pinS1 A1 // Address select 1
#define pinS2 A2 // Address select 2
#define pinA_ic1 A4 // A pin on IC1
#define pinA_ic2 A5 // A pin on IC2
/***** EINDE CONFIGUTATIE *****/
// Poll timer
unsigned long lastPoll;
/****************************************************************
SETUP
****************************************************************/
void setup()
{
Serial.begin(115200);
while (!Serial) {
; // Wacht op seriele monitor
}
Serial.println("--- Seriele monitor gestart ---");
// Configureer pinnen als uitgangen
pinMode(pinS0, OUTPUT);
pinMode(pinS1, OUTPUT);
pinMode(pinS2, OUTPUT);
pinMode(pinA_ic1, OUTPUT);
// Configureer pinnen als ingangen
pinMode(pinA_ic2, INPUT);
lastPoll = millis();
}
/****************************************************************
LOOP
****************************************************************/
void loop()
{
static byte byteCounter = 0;
static bool writeBit;
static bool readBit;
String testResult;
// Genereer willekeurig true of false
writeBit = bool(random(0, 2));
// Elke 500ms
if (millis() - lastPoll >= 500)
{
// Selecteer adres
selectAddress(byteCounter);
// Schrijf bit naar IC 1
digitalWrite(pinA_ic1, writeBit);
// Lees bit van IC 2
readBit = digitalRead(pinA_ic2);
if (writeBit == readBit) {
testResult = " -> OK";
}
else {
testResult = " -> NIET OK";
}
// In de seriële monitor moet bit schrijf = bit lees
Serial.print("Op adres " );
Serial.print(byteCounter, BIN);
Serial.print(" is schrijf (IC 1) vs lees (IC 2): " );
Serial.print(writeBit);
Serial.print(" / ");
Serial.print(readBit);
Serial.print(testResult);
Serial.println();
// Selecteer volgend adres
byteCounter++;
if (byteCounter > 7) {
byteCounter = 0; // Reset counter at 1000 (count 0000 to 0111)
}
lastPoll = millis();
}
}
/****************************************************************
Zet de Sx pinnen om het gewenste adres te selecteren
****************************************************************/
void selectAddress(byte address) {
// Lees adres bits
bool S0 = bool(address >> 0 & 0x01); // Shift rechts en maskeer met 0x01
bool S1 = bool(address >> 1 & 0x01);
bool S2 = bool(address >> 2 & 0x01);
// Zet adres lijnen correct
digitalWrite(pinS0, S0);
digitalWrite(pinS1, S1);
digitalWrite(pinS2, S2);
}
//EINDE
Le résultat est quelque chose dans ce genre :
xxxxxxxxxx
Op adres 0 is schrijf (IC 1) vs lees (IC 2): 1 / 1 -> OK
Op adres 1 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 10 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 11 is schrijf (IC 1) vs lees (IC 2): 1 / 1 -> OK
Op adres 100 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 101 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 110 is schrijf (IC 1) vs lees (IC 2): 1 / 1 -> OK
Op adres 111 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 0 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Op adres 1 is schrijf (IC 1) vs lees (IC 2): 1 / 1 -> OK
Op adres 10 is schrijf (IC 1) vs lees (IC 2): 1 / 1 -> OK
Op adres 11 is schrijf (IC 1) vs lees (IC 2): 0 / 0 -> OK
Composants
Les composants de ce test :
Liste des composants
Multiplexeur 74HC4051 - 5 pièces Rupture de stock (vendu par 5) € 3,60 Planche à pain 400 points - blanche Disponible immédiatement € 2,30 Ensemble pull Homme-Homme 65 pièces Disponible immédiatement € 2,40 Total € 8,30De la même manière, vous pouvez tester la version sur le tableau de bord
Test analogique
Pour tester l'analogique, vous avez besoin d'un DAC. L' Arduino Uno n'a pas cela en standard, mais avec l'aide de la carte de dérivation " Adafruit MCP4725 (12bit DAC)", vous pouvez éventuellement y parvenir.
Connecter
La connexion doit alors être ajustée :
Mettre la broche 3 (A) de IC 1 sur la sortie du MCP4725 (VOU) (au lieu de sur A5)
Placez la broche 3 (A) de IC 2 sur la broche A3 de la carte Arduino (au lieu de sur A4).
Les broches A4 (SCA) et A5 (SCL) de la carte Arduino doivent être connectées aux SDA et SCL du MCP4725.
Connectez également VDD et GND de la carte MCP4725 à 5V et GND respectivement.
Connectez la broche A0 du MCP4725 à GND pour sélectionner l'adresse I2C 0x62.
(Alternative : sélectionnez A0 à 5 V à l'adresse 0x63.)

Bibliothèques Adafruit
Pour piloter le DAC Adafruit MCP4725, il est recommandé de télécharger la librairie correspondante depuis Adafruit .
Vous pouvez les trouver sur GithubGenericName.
Le code pour le test analogique est alors le suivant :
Test 74HC4051 MUX/DEMUX met Arduino Uno en DAC
xxxxxxxxxx
// Voeg MCP4725 DAC bibliotheek toe
#include <Wire.h> // I2C library
#include >Adafruit_MCP4725.h> // Adafruit library for MCP4725 (DAC)
Adafruit_MCP4725 dac;
/****************************************************************
Configuratie
****************************************************************/
#define pinS0 A0 // Address select 0
#define pinS1 A1 // Address select 1
#define pinS2 A2 // Address select 2
#define pinA_ic2 A3 // A pin on IC2
/***** EINDE CONFIGUTATIE *****/
// Poll timer
unsigned long lastPoll;
/****************************************************************
SETUP
****************************************************************/
void setup()
{
Serial.begin(115200);
while (!Serial) {
; // Wacht op seriele monitor
}
Serial.println("--- Seriele monitor gestart ---");
// Configureer pinnen als uitgangen
pinMode(pinS0, OUTPUT);
pinMode(pinS1, OUTPUT);
pinMode(pinS2, OUTPUT);
dac.begin(0x62); // MCP4725, pin A0 ligt op GND
// dac.begin(0x63); // MCP4725, pin A0 ligt op 5V
lastPoll = millis();
}
/****************************************************************
LOOP
****************************************************************/
void loop()
{
static byte byteCounter = 0;
uint16_t writeChannel; // 12 bit (0-4095)
uint16_t readChannel; // 10 bit (0-1023)
String testResult;
// Genereer willekeurige analoge uitgang waarde
writeChannel = random(0, 4096); // random 0-4095 (!)
// Elke 500ms
if (millis() - lastPoll >= 500)
{
// Selecteer adres
selectAddress(byteCounter);
// Schrijf naar DAC
dac.setVoltage(writeChannel, false);
// Lees analoge waarde van analoge ingang op Arduino
readChannel = analogRead(pinA_ic2);
// Converteer waarden naar volt
writeChannel = map(writeChannel, 0, 4095, 0, 500);
readChannel = map(readChannel, 0, 1023, 0, 500);
// Zijn beide waarden gelijk ?
if (writeChannel == readChannel) {
testResult = " -> OK";
}
else {
testResult = " -> NIET OK";
}
// In de seriële monitor moet schrijf waarde = lees waarde
Serial.print("Op adres " );
Serial.print(byteCounter, BIN);
Serial.print(" is schrijf (IC 1) vs lees (IC 2): " );
Serial.print(float(writeChannel)/100);
Serial.print(" / ");
Serial.print(float(readChannel)/100);
Serial.print(testResult);
Serial.println();
// Selecteer volgend adres
byteCounter++;
if (byteCounter > 7) {
byteCounter = 0; // Reset counter at 1000 (count 0000 to 0111)
}
lastPoll = millis();
}
}
/****************************************************************
Set the Sx pins to select proper address
****************************************************************/
void selectAddress(byte address) {
// Lees adres bits
bool S0 = bool(address >> 0 & 0x01); // Shift rechts en maskeer met 0x01
bool S1 = bool(address >> 1 & 0x01);
bool S2 = bool(address >> 2 & 0x01);
// Zet adres lijnen correct
digitalWrite(pinS0, S0);
digitalWrite(pinS1, S1);
digitalWrite(pinS2, S2);
}
//EINDE
Le résultat sur le moniteur série est dans ce genre :
xxxxxxxxxx
Op adres 10 is schrijf (IC 1) vs lees (IC 2): 3.40 / 3.40 -> OK
Op adres 11 is schrijf (IC 1) vs lees (IC 2): 4.21 / 4.21 -> OK
Op adres 100 is schrijf (IC 1) vs lees (IC 2): 0.08 / 0.08 -> OK
Op adres 101 is schrijf (IC 1) vs lees (IC 2): 1.54 / 1.54 -> OK
Op adres 110 is schrijf (IC 1) vs lees (IC 2): 1.53 / 1.53 -> OK
Op adres 111 is schrijf (IC 1) vs lees (IC 2): 4.02 / 4.02 -> OK
Op adres 0 is schrijf (IC 1) vs lees (IC 2): 0.82 / 0.82 -> OK
Op adres 1 is schrijf (IC 1) vs lees (IC 2): 0.93 / 0.93 -> OK
Op adres 10 is schrijf (IC 1) vs lees (IC 2): 3.72 / 3.72 -> OK
Op adres 11 is schrijf (IC 1) vs lees (IC 2): 1.35 / 1.35 -> OK
Op adres 100 is schrijf (IC 1) vs lees (IC 2): 2.64 / 2.64 -> OK
Op adres 101 is schrijf (IC 1) vs lees (IC 2): 1.29 / 1.29 -> OK
Op adres 110 is schrijf (IC 1) vs lees (IC 2): 2.89 / 2.88 -> NIET OK
Op adres 111 is schrijf (IC 1) vs lees (IC 2): 3.54 / 3.54 -> OK
Op adres 0 is schrijf (IC 1) vs lees (IC 2): 4.24 / 4.24 -> OK
Op adres 1 is schrijf (IC 1) vs lees (IC 2): 1.51 / 1.51 -> OK
Op adres 10 is schrijf (IC 1) vs lees (IC 2): 4.20 / 4.20 -> OK
Il y aura parfois des "erreurs" dues aux arrondis et aux inexactitudes. Par exemple, vous pouvez voir que 2,89 V n'est pas égal à 2,88 V. Cependant, en combinaison avec tous les autres résultats réussis, vous pouvez supposer que le MUX/DEMUX fonctionne parfaitement.
