Testador Arduino Uno como 74HC4051 (MUX/DEMUX)
Colocado sobreteste 74HC4051
O 74HC4051 é um IC multiplexador/demultiplexador. Para testar isso, o Arduino Uno pode ser usado com dois CIs 74HC4051. O primeiro CI atua como multiplexador, o segundo como demultiplexador.
pinagem
![]() | Para a numeração correta dos pinos, mantenha o entalhe no IC para a esquerda! O pino no canto inferior esquerdo é o pino número 1. Continue contando para a direita para fixar o número 8. O pino no canto superior direito é o pino número 9. Agora continue contando para a esquerda até e incluindo o pino número 16. A configuração dos pinos do 74HC4051 é a seguinte: |
Alfinete | Rótulo | Função |
1 | A4 | Canal de entrada/saída |
2 | A6 | Canal de entrada/saída |
3 | A | entrada/saída comum |
4 | A7 | Canal de entrada/saída |
5 | A5 | Canal de entrada/saída |
6 | ~E | Ativar (negativo) |
7 | Gado | Fonte de alimentação negativa |
8 | GND | Terra (0V) |
9 | Vcc | Fonte de alimentação (5Vdc) |
10 | A2 | Canal de entrada/saída |
11 | A1 | Canal de entrada/saída |
12 | A0 | Canal de entrada/saída |
13 | A3 | Canal de entrada/saída |
14 | S0 | Bit de linha de endereço 0 |
15 | S1 | Bit de linha de endereço 1 |
16 | S2 | Bit de linha de endereço 2 |
teste digital
Embora o 74HC4051 seja um MUX/DEMUX analógico, ele não pode ser testado analógico com o Arduino Uno, pois não possui saídas analógicas (DAC). Mais adiante neste artigo, é descrito como isso pode ser feito com uma placa de DAC. Para testar digitalmente, apenas a placa Arduino e 2 CIs são necessários.
Conectar
Defina o pino 16 (Vcc) de ambos os ICs para 5VDC; pino 8 (GND) em 0V.
Conecte os pinos 6 (~E) e 7 (Vee) de ambos os CIs ao GND também.
Conecte os seguintes pinos de ambos os CIs: 1,2,4,5,15,16,13,12 (A0..A7).
Conecte os pinos 11 (S0) de ambos os CIs à placa Arduino em A0.
Conecte o pino 12 (S1) de ambos os CIs à placa Arduino em A1.
Conecte os pinos 13 (S2) de ambos os CIs à placa Arduino em A2.
Do IC 1, conecte o pino 3 (A) à placa Arduino em A4.
Do IC 2, conecte o pino 3 (A) à placa Arduino em A5.

código Arduino
Use o seguinte código para o 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
O resultado é algo neste gênero:
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
Componentes
Os componentes para este teste:
lista de componentes
Multiplexador 74HC4051 - 5 peças Fora de estoque (vendido por 5) € 3,65 Tábua de ensaio 400 pontos - branca Em estoque € 2,35 Conjunto jumper Masculino-Masculino 65 peças Em estoque € 3,05 Total € 9,05Da mesma forma, você pode testar a versão no breakout board
teste analógico
Para testar analógico você precisa de um DAC. O Arduino Uno não tem isso como padrão, mas com a ajuda da placa de breakout " Adafruit MCP4725 (12bit DAC)", você pode conseguir isso.
Conectar
A conexão deve então ser ajustada:
Coloque o pino 3 (A) do IC 1 na saída do MCP4725 (VOU) (ao invés de A5)
Coloque o pino 3 (A) do IC 2 no pino A3 da placa Arduino (ao invés de A4).
Os pinos A4 (SCA) e A5 (SCL) da placa Arduino devem ser conectados ao SDA e SCL do MCP4725.
Conecte também VDD e GND da placa MCP4725 a 5V e GND, respectivamente.
Conecte o pino A0 do MCP4725 ao GND para selecionar o endereço I2C 0x62.
(Alternativa: Selecione A0 em 5V no endereço 0x63.)

Bibliotecas Adafruit
Para controlar o Adafruit MCP4725 DAC, é recomendável baixar a biblioteca correspondente do Adafruit .
Você pode encontrá-los em GithubGenericName.
O código para o teste analógico é o seguinte:
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
O resultado no monitor serial está neste gênero:
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
Ocasionalmente, haverá “erros” devido a arredondamentos e imprecisões. Por exemplo, você pode ver que 2,89V não é igual a 2,88V. No entanto, em combinação com todos os outros resultados bem-sucedidos, você pode assumir que o MUX/DEMUX funciona perfeitamente.
