Aumente el número de entradas analógicas con un multiplexor analógico

Aprenda a aumentar el número de pines analógicos en su EPS8266 NodeMCU o microcontrolador WeMos D1 Mini con un multiplexor analógico.

Uno de los microcontroladores más utilizados en mis proyectos de bricolaje es el ESP8266. Pero todas las placas ESP8266 como la ESP8266 NodeMCU o la WeMos D1 Mini tienen un gran inconveniente:

Sólo tienen 1 pin de entrada analógica.

Pero puedes aumentar el número de entradas analógicas con un multiplexor analógico. En este tutorial te muestro cómo aumentar el número de entradas analógicas a 4, 8 o 16 con un multiplexor analógico.

¿Cómo funciona un multiplexor?

En mi opinión, la mejor explicación para un multiplexor es un gran interruptor que conecta todas las entradas con una salida. La entrada conectada a la salida está definida por el estado de los pines de las líneas de selección.
Dado que solo una entrada está conectada a la salida, todas las demás líneas pierden la conexión. Esto es importante porque los dispositivos que requieren una señal continua (como un servomotor) no funcionarán en combinación con un multiplexor.

Diagrama de multiplexor

Un multiplexor con 2 ^ n entradas en las líneas de selección que se muestran en la siguiente tabla.

Número de entradasNúmero de líneas de selección
21
42
83
164

En este tutorial estoy usando el multiplex analógico CD74HC4051 de Texas Instruments

Hoja de datos y pines 74HC4051

Antes de comenzar con el ejemplo práctico, resumamos rápidamente la hoja de datos del CD74HC4051.
El 74HC4051 es un multiplexor / demultiplexor analógico de 8 bits y, por lo tanto, está construido con interruptores bidireccionales que permiten usar cualquier entrada analógica como salida y viceversa.

El valor más importante es el voltaje de entrada máximo con 5 V para el multiplexor analógico. El 5V se adapta bien a todos los microcontroladores Arduino y EPS8266. Encuentra toda la ficha técnica aquí.

CD74HC4051
74HC4051 pinDescription and Connection
A0…A7Analog inputs for multiplexing and demultiplexing (in our example connected to the analog inputs: photoresistor and potentiometer)
GNDConnect to ground on the microcontroller
VCCConnect to 5V on the microcontroller (2V…6V)
S0…S23 select lines for the 8 bits
AAnalog output is connected to an analog pin on the microcontroller (in our example A0 on the NodeMCU)
EEnable state to enable or disable the functionality (active when LOW)
VEENegative power input to operate on negative voltages (0…-6V)

La funcionalidad del CD74HC4051 como multiplexor analógico se puede explicar fácilmente en dos pasos:

  1. El multiplexor obtiene la señal de línea seleccionada de las 3 salidas digitales del microcontrolador.
  2. Si el estado de habilitación se establece en BAJO, la entrada analógica correspondiente (A0… A7) se conecta a la salida analógica (A)

La siguiente tabla muestra los estados de entrada del CD74HC4051 y el canal de salida analógica correspondiente.

Si Habilitar (E) es ALTO, el multiplexor se deshabilita independientemente de las señales de línea seleccionadas.

Input States   Analog Output
Enable (E)S2S1S0
LOWLOWLOWLOWA0
LOWLOWLOWHIGHA1
LOWLOWHIGHLOWA2
LOWLOWHIGHHIGHA3
LOWHIGHLOWLOWA4
LOWHIGHLOWHIGHA5
LOWHIGHHIGHLOWA6
LOWHIGHHIGHHIGHA7
HIGHXXXNone

Aumente las entradas analógicas en el ESP8266 con un multiplexor

En el siguiente ejemplo, estamos aumentando el número de entradas analógicas del ESP8266 NodeMCU y WeMos D1 Mini, que solo tienen un pin de entrada analógica. Las entradas analógicas que elijo son:

  • 1 fotorresistencia
  • 1 potenciómetro

Pero puedes elegir cualquier otro dispositivo analógico.

Las siguientes imágenes muestran el cableado entre todos los componentes y el microcontrolador ESP8266.

  • ESP8266 NodeMCU
  • ESP8266 WeMos D1 Mini

ESP8266 NodeMCU

Multiplexor analógico NodeMCU

ESP8266 WeMos D1 Mini

Mini multiplexor analógico WeMos D1

El fotorresistor está conectado al 74HC4051 a través de un divisor de voltaje con un resistor de 10 kΩ en el pin A1. El potenciómetro está conectado directamente al multiplexor en el pin A0. Todos los demás pines analógicos están conectados a tierra. Además, los pines VEE y E también están conectados a tierra. Los pines del selector de dirección están conectados al ESP8266 de la siguiente manera:

  • S0 -> D3
  • S1 -> D2
  • S2 -> D1

Ahora, profundicemos en el código del programa.

const int selectPins[3] = {D3, D2, D1};
const int analogInput = A0;

void setup() 
{
  Serial.begin(9600);
  // Set up the select pins as outputs:
  for (int i=0; i < 3; i++)
  {
    pinMode(selectPins[i], OUTPUT);
    digitalWrite(selectPins[i], HIGH);
  }
  
  // Create header table
  Serial.println("Y0tY1tY2tY3tY4tY5tY6tY7");
  Serial.println("---t---t---t---t---t---t---t---");
}

void loop() 
{
  // Loop through all eight pins.
  for (byte pin=0; pin <= 7; pin++)
  {
      for (int i=0; i < 3; i++) {
          digitalWrite(selectPins[i], pin & (1 << i)?HIGH:LOW);
      }
      int inputValue = analogRead(analogInput);
      Serial.print(String(inputValue) + "t");
  }
  Serial.println();
  delay(1000);
}

Primero necesitamos definir los pines conectados. Como se mencionó anteriormente, hemos conectado los 3 pines digitales D3, D2, D1 así como la entrada analógica A0. Para los pines digitales, creamos una matriz para enlazar fácilmente los pines en pasos de código posteriores.

En la función de configuración, primero establecemos la velocidad en baudios en 9600, que debe coincidir con la velocidad en baudios del monitor en serie. Luego iteramos sobre la matriz selectPins y configuramos cada pin digital como salida
La última parte de la función de configuración es más una preferencia óptica. Creamos una tabla virtual en el monitor serial definiendo un espacio de tabulación entre los 8 posibles valores analógicos.

En la función de bucle, recorremos los 8 pines analógicos posibles y configuramos los pines selectores HIGH y LOW con una fórmula un poco confusa. Pero la siguiente tabla muestra todas las diferentes combinaciones para que los pines seleccionados se definan correctamente.

Calculamos el estado de cada pin selector en 3 pasos:

  1. 1<bit-shift de cada 3 pines de selección
  2. pin & (1<<i): bitwise AND con la salida analógica seleccionada a seleccionar
  3. pin & (1<<i)?HIGH:LOW: calcula la ternary conditional que en este caso es muy fácil. Si el pin & (1<<i) es 0, entonces establece la condición a LOW y en caso contrario a HIGH.

pin i 1 pin & (1 pin & (1 estado de entrada Salida analógica

pini1<pin & (1<pin & (1<Estado de entradaSalida analógica
0 (0000)110 (0000)0S0A0
0 (0000)2100 (0000)0S1
0 (0000)31000 (0000)0S2
1 (0001)111 (0001)1S0A1
1 (0001)2100 (0000)0S1
1 (0001)31000 (0000)0S2
2 (0010)110 (0000)0S0A2
2 (0010)2102 (0010)1S1
2 (0010)31000 (0000)0S2
3 (0011)111 (0001)1S0A3
3 (0011)2102 (0010)1S1
3 (0011)31000 (0000)0S2
4 (0100)110 (0000)0S0A4
4 (0100)2100 (0000)0S1
4 (0100)31004 (0100)1S2
5 (0101)111 (0001)1S0A5
5 (0101)2100 (0000)0S1
5 (0101)31004 (0100)1S2
6 (0110)110 (0000)0S0A6
6 (0110)2102 (0010)1S1
6 (0110)31004 (0100)1S2
7 (0111)111 (0001)1S0A7
7 (0111)2102 (0010)1S1
7 (0111)31004 (0100)1S2

Después de configurar los pines de selección, el multiplexor analógico se configura para leer la salida deseada. Leemos el valor analógico con la función de lectura analógica incorporada e imprimimos el valor en el monitor en serie. Cada valor está separado por una pestaña como el encabezado que creamos en la función de configuración.

Ahora el programa lee todos los valores de entrada analógica. En la siguiente imagen ves una captura de pantalla del monitor serial

Salida de multiplexor analógico en serie

El primer valor Y0 es el potenciómetro. Ves en la foto que aumento y disminuyo la resistencia y por tanto el valor analógico. El segundo valor Y1 es el fotorresistor en el que influyo sosteniendo mi mano sobre él para oscurecerlo y cambiar el valor analógico.

Una cosa que me sorprende es que todos los demás valores analógicos Y2… Y7 no siempre son 0, aunque he conectado todos los demás pines de entrada analógica en el multiplexor con tierra. Supongo que hay un acoplamiento inverso entre las señales analógicas, pero no sé cómo eliminar el ruido en las señales analógicas que están conectadas a tierra. Si sabe por qué los otros valores analógicos no son cero, escriba su sugerencia en la sección de comentarios a continuación.

También instalé un condensador de desacoplamiento entre VCC y tierra en el 74HC4051 porque vi este circuito para la placa de conexión del multiplexor Sparkfun 74HC4051. Pero después de instalar el condensador de desacoplamiento, no hubo cambios en el monitor en serie.

Salida del multiplexor Sparkfun 74HC4051

En mi opinión, o sabe qué señales analógicas del multiplexor están conectadas y, por ejemplo, solo lee las tres primeras, o puede establecer un umbral> 10 para leer todas las señales analógicas.

Espero que le guste este tutorial sobre cómo aumentar las entradas analógicas en su ESP8266 NodeMCU o WeMos D1 Mini para su próximo proyecto. Si tiene alguna pregunta, puede usar la sección de comentarios a continuación y haré sus preguntas lo antes posible.

Si también desea aumentar el número de salidas digitales con un registro de desplazamiento, puedo recomendarle este artículo.


Deja un comentario