Descrición
Pode suceder que no proxecto que esteamos realizando necesitemos máis entradas das que temos dispoñibles no noso arduino. Para solucionar este problema podemos utilizar un multiplexor ou tamén chamado coloquialmente mux.
Trátase dun circuíto no que as entradas de control seleccionan unha entrada entre varias para levar a información a unha única saída.
Para 2n liñas de entrada necesítanse n entradas de control.
|
|
Conexión
Imos utilizar un multiplexor de 16 canais CD74HC4067. Pode funcionar como multiplexor o como demultiplexor, é decir, pode realizar o proceso inverso.
SIG é o sinal de saída ao que enviaremos os sinais das entradas e S0, S1, S2 e S3 as entradas de control.
Conexión do multiplexor a arduino:
Para controlar só 4 entradas e saídas chéganos con 2 pins de control, así que no noso caso só faría falta conectar S0 ao pin 11 e S1 ao pin 10. Ata 8 entradas/saídas conectaríamos S0, S1 e S2, e entre 9 e 16 entradas conectaríamos os 4
- SIG: pin A0
- S0: pin 11
- S1: pin 10
- S2: pin 9 (non conectar para as prácticas de exemplo)
- S3 pin 8 (non conectar para as prácticas de exemplo)
- EN: GND
- VCC: 5V
- GND: GND
Conexión das entradas:
Para facer a proba do seu funcionamento e simplificar imos conectar só 4 sensores, pero e módulo permite conectar ata 16 entradas analóxicas ou dixitais.
- Para unha lectura dixital conectaremos 4 pulsadores nas entradas C0, C1, C2 e C3 coas súas correspondentes resistencias de 10kΩ.
- Para unha lectura analóxica conectaremos 4 LDRs nas entradas C0, C1, C2 e C3 coas súas correspondentes resistencias de 10kΩ.
- Para comprobar o funcionamento do modulo como saída imos conectar 4 LEDs con resistencias de 220Ω nas entradas C0, C1, C2 e C3
Configuración
Debemos indicar os pins nos que están conectadas as entradas de control o o pin de sinal e incluímos a librería Mux.h que nos simplifica a programación.
Na definición do multiplexos indicamos os pins aos que está contectado, se fai unha lectura ou unha escritura e se funciona en modo dixital ou analóxico:
- Mux mux(Pin(muxSIG, INPUT/OUTPUT, PinType::Digital/Analog), Pinset(muxS0, muxS1, muxS2, muxS3));
Como nos exemplos que imos ver só imos usar 4 entradas/saídas, chéganos con conectar unicamente 2 pins de control, simplificando o circuíto. Debemos indicar se a lectura ou escritura que imos facer é analóxica ou dixital. Comenta e descomenta o que proceda en cada caso.
#include "Mux.h" using namespace admux; const int muxSIG = A0; const int muxS0 = 11; const int muxS1 = 10; // Lectura dixital Mux mux(Pin(muxSIG, INPUT, PinType::Digital), Pinset(muxS0, muxS1)); // Lectura analóxica // Mux mux(Pin(muxSIG, INPUT, PinType::Analog), Pinset(muxS0, muxS1)); // Escritura Dixital // Mux mux(Pin(muxSIG, OUTOUT, PinType::Digital), Pinset(muxS0, muxS1)); // Escritura analóxica // Mux mux(Pin(muxSIG, OUTOUT, PinType::Analog), Pinset(muxS0, muxS1)); int n_entradas= 4; // nº de entradas que temos conectadas void setup() { Serial.begin(9600); } void loop(){ }
Prácticas
1. Lectura dix
Imos visualizar na consola se os pulsadores están premidos (ON) ou non (OFF).
void loop() { for (byte i = 0; i < n_entradas; i++) { // percorremos as entradas byte data = mux.read(i); // lectura dixital do canal i (HIGH/LOW) Serial.print("Canal " + String(i) + ": "); if( data == LOW ){ Serial.println("OFF"); } else{ Serial.println("ON"); } } Serial.println("---- " ); delay(1000); }
2. Lectura analog
Imos visualizar na consola o valor das LDRs. Descomenta “Lectura analóxica” na configuración e comenta as outras.
void loop() { for (byte i = 0; i < n_entradas; i++) { // percorremos as entradas int data = mux.read(i); // lectura analóxica do canal i (0 -1023) Serial.println("Canal " + String(i) + ": " + String(data)); } Serial.println("---- " ); delay(1000); }
3. Escritura dix
Conecta 4 LEDs nas canles C0-C4. Con este programa imos acendelos de forma consecutiva. Descomenta “Escritura dixital” na configuración e comenta as outras.
void loop() { for (byte i = 0; i < n_entradas; i++) { mux.write(HIGH, i) ; delay(200); } delay(800); }
4. Escritura analog
Para enviar un sinal PWM (0-255) a unha saída conectada a un canal o pin SIG debe estar conectado a unha saída PWM (por exemplo o pin 3), así que debemos modificalo previamente. Descomenta “Escritura analóxica” na configuración e comenta as outras.
const int muxSIG = 3;
No seguinte exemplo enviamos un sibnal pwm de valor 50.
void loop() { for (byte i = 0; i < n_entradas; i++) { mux.write(50, i); delay(200); } delay(800); }
5. Combinado
Tamén podemos utilizar os canles do módulo combinando entradas analóxicas, dixitais e saídas. Neste exemplo imos utilizar 2 LEDs conectados ás canles C0 e C1 e 2 pulsadores conectados ás canles C2 e C3. O pin SIG conectámolo a A0.
No inicio do programa indicamos só os pins de control e despois, nas instrucións do programa, xa indicaremos se é entrada ou saída e o tipo:
- Mux mux(Pinset(muxS0, muxS1, muxS2, muxS3));
#include "Mux.h" using namespace admux; // Conexión multiplexor const int muxSIG = A0; const int muxS0 = 11; const int muxS1 = 10; Mux mux(Pinset(muxS0, muxS1)); // Configuración void setup() { } // LOOP void loop() { int data[2]; // array para gardar os datos de lectura // Lectura dos pulsadores conectados en C0 e C1 mux.signalPin(A0, INPUT, PinType::Digital); for (byte i = 0; i <= 2; i++) { data[i] = mux.read(i); } // escritura dixital nos LEDs conectados en C2 e C3 segundo o estado dos pulsadores mux.signalPin(A0, OUTPUT, PinType::Digital); for (byte i = 0; i < 2; i++) { mux.write(data[i], i+2 ); delay(100); } }
Poderiamos conectar simultaneamente dous pins SIG no arduino, por exemplo A0 e 3, para poder facer simultaneamente lecturas analóxicas e saídas PWM.
Propostas
Este módulo ímolo utilizar nalgún proxecto no que se necesiten máis entradas das que dispoñemos.