Arduino Uno som 74HC4051 (MUX/DEMUX) testare
Placerad på74HC4051 testning
74HC4051 är en multiplexer/demultiplexer-IC. För att testa detta kan Arduino Uno användas med två 74HC4051 IC:er. Den första IC fungerar som en multiplexor, den andra som en demultiplexer.
pinout
![]() | För korrekt pin-numrering, håll hacket i IC till vänster! Stiftet längst ner till vänster är stift nummer 1. Fortsätt att räkna till höger till pin nummer 8. Stiftet uppe till höger är stift nummer 9. Fortsätt nu att räkna åt vänster till och med pinnummer 16. Stiftkonfigurationen för 74HC4051 är som följer: |
Stift | Märka | Fungera |
1 | A4 | Kanal in/ut |
2 | A6 | Kanal in/ut |
3 | A | Vanligt in/ut |
4 | A7 | Kanal in/ut |
5 | A5 | Kanal in/ut |
6 | ~E | Aktivera (negativ) |
7 | Nötkreatur | Negativ strömförsörjning |
8 | GND | Jord (0V) |
9 | Vcc | Strömförsörjning (5Vdc) |
10 | A2 | Kanal in/ut |
11 | A1 | Kanal in/ut |
12 | A0 | Kanal in/ut |
13 | A3 | Kanal in/ut |
14 | S0 | Adressradsbit 0 |
15 | S1 | Adressradsbit 1 |
16 | S2 | Adressrad bit 2 |
Digital testning
Även om 74HC4051 är en analog MUX/DEMUX, kan den inte testas analogt med Arduino Uno eftersom den inte har några analoga utgångar (DAC). Längre fram i denna artikel beskrivs hur detta kan uppnås med ett DAC breakout-kort. För att testa digitalt behövs bara Arduino kortet och 2 IC:er.
Ansluta
Ställ in stift 16 (Vcc) på båda IC:erna till 5VDC; stift 8 (GND) vid 0V.
Anslut stift 6 (~E) och 7 (Vee) på båda IC:erna till GND också.
Anslut följande stift på båda IC:erna: 1,2,4,5,15,16,13,12 (A0..A7).
Anslut stift 11 (S0) på båda IC:erna till Arduino -kortet på A0.
Anslut stift 12 (S1) på båda IC:erna till Arduino -kortet på A1.
Anslut stift 13 (S2) på båda IC:erna till Arduino -kortet på A2.
Från IC 1, anslut stift 3 (A) till Arduino -kortet på A4.
Från IC 2, anslut stift 3 (A) till Arduino -kortet på A5.

Arduino kod
Använd följande kod för 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
Resultatet är något i den här genren:
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
Komponenter
Komponenterna för detta test:
Komponentlista
74HC4051 multiplexer - 5 st Slut i lager (säljs per 5) € 3,75 Breadboard 400 poäng - vit I lager € 2,40 Hane-Mane jumper set 65 stycken I lager € 3,10 Total € 9,25På samma sätt kan du testa versionen på breakout board
Analog testning
För att testa analogt behöver du en DAC. Arduino Uno har inte detta som standard, men med hjälp av " Adafruit MCP4725 (12bit DAC)" breakoutboard kan du möjligen uppnå detta.
Ansluta
Anslutningen måste då justeras:
Sätt stift 3 (A) på IC 1 på utgången på MCP4725 (VOU) (istället för på A5)
Sätt stift 3 (A) på IC 2 på stift A3 på Arduino -kortet (istället för på A4).
Pins A4 (SCA) och A5 (SCL) på Arduino -kortet måste anslutas till SDA och SCL på MCP4725.
Anslut även VDD och GND på MCP4725-kortet till 5V respektive GND.
Anslut stift A0 på MCP4725 till GND för att välja I2C-adress 0x62.
(Alternativ: Välj A0 vid 5V på adress 0x63.)

Adafruit bibliotek
För att kontrollera Adafruit MCP4725 DAC, rekommenderas det att ladda ner motsvarande bibliotek från Adafruit .
Du hittar dessa på Github.
Koden för det analoga testet är då följande:
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
Resultatet på den seriella monitorn är i denna 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
Det kommer ibland att förekomma "fel" på grund av avrundningar och felaktigheter. Till exempel kan du se att 2,89V inte är lika med 2,88V. Men i kombination med alla andra framgångsrika resultat kan du anta att MUX/DEMUX fungerar perfekt.
