¿Sabes cómo aumentar el número de pines digitales de tu microcontrolador?
Con un registro de desplazamiento es fácil añadir más entradas y salidas digitales a tu microcontrolador Arduino, ESP8266 y ESP32.
Aprenda en este artículo:
- Diferentes configuraciones de registro de desplazamiento
- Cuál es la aplicación adecuada para cada configuración
- En total, 3 ejemplos que muestran diferentes configuraciones de registros de desplazamiento y su combinación para leer el estado de múltiples botones para controlar diferentes LEDs.
¿Qué es un registro de equipo?
Antes de que pueda explicar la función de un registro de desplazamiento, debe saber qué es un flip-flop, porque un registro de desplazamiento es una cascada de varios flip-flops que comparten la misma señal de reloj.
Un flip-flop también llamado pestillo es un circuito con 2 estados estables. Estos estados se utilizan a menudo para almacenar un solo bit de información en formato binario: 0 o 1.
Hay diferentes tipos de conmutadores que no forman parte de este tutorial. En cuanto al registro de desplazamiento, solo nos interesa el flip-flop D. El flip-flop D tiene una línea de entrada llamada D, una línea de reloj y una línea de salida Q. La siguiente tabla muestra la tabla de verdad de un D chanclas.
Reloj | Entrada de datos: D | Salida de datos: Q_next |
---|---|---|
Borde ascendente | 0 | 0 |
Borde ascendente | 1 | 1 |
No ascendente | 0/1 | Q (la salida no cambia durante el ciclo de reloj) |
En la tabla de verdad, puede ver que con un flanco ascendente de la señal del reloj, la salida va a la línea de datos. Pero si la señal del reloj no aumenta, la salida Q_next no cambia.
Ahora, básicamente, un registro de desplazamiento no es más que varios flip-flops D conectados en una fila donde la salida de cada flip-flop está conectada a la entrada del siguiente flip-flop. Dado que solo hay una señal de reloj para todos los flip-flops, se desplaza un bit en cada ciclo de reloj en la matriz de bits en la que se almacena el bit.
La siguiente tabla muestra este cambio de un bit si hay tres flip-flops D y tres ciclos de reloj. Al comienzo, el bit 1 está en D1 y en cada ciclo de reloj este bit se desplaza al siguiente flujo de inversión hasta que en el ciclo de reloj 2 este bit alcanza D3.
Clock cycle 0 | Clock cycle 1 | Clock cycle 2 | |
---|---|---|---|
D1 | 1 | 0 | 0 |
D2 | 0 | 1 | 0 |
D3 | 0 | 0 | 1 |
Ahora conocemos los conceptos básicos del registro de desplazamiento y, dado que los registros de desplazamiento pueden tener entradas y salidas en paralelo y en serie, son posibles diferentes configuraciones. Las configuraciones más utilizadas son:
- Entrada serie, salida serie (SISO)
- Entrada serial, salida paralela (SIPO)
- Entrada paralela, salida serial (PISO)
A partir de las configuraciones, puede ver que los registros de desplazamiento son los más utilizados para convertir señales entre interfaces en serie y paralelas. En los siguientes subcapítulos, examinamos más de cerca cada una de las configuraciones.
Registro de desplazamiento de entrada en serie, salida en serie (SISO)
La siguiente tabla muestra la tabla de verdad del registro de desplazamiento SISO con cuatro flip-flops.
Hora | Entrada en serie | Salida |
---|---|---|
1 | 1 | 0 |
2 | 1 | 0 |
3 | 0 | 0 |
4 | 0 | 0 |
5 | 0 | 1 |
La configuración del registro de desplazamiento SISO es la más simple porque tanto la entrada como la salida son solo una línea serial. Quizás esté pensando: ¿para qué sirve un registro de desplazamiento de este tipo?
Si observa el circuito lógico, verá que el SISO consta de n flip-flops en una fila donde la salida del flip-flop actual es la entrada del siguiente flip-flop. Por lo tanto, el bit de entrada está disponible en la salida en n ciclos de reloj. Los SISO se utilizan para crear un retraso en una señal. El registro de desplazamiento SISO de 8 bits más utilizado es el 74HC595.
Registro de desplazamiento de entrada en serie, salida en paralelo (SIPO)
La siguiente tabla muestra la tabla de verdad del registro de desplazamiento de SIPO.
Hora | Entrada en serie | Salida 1 | Salida 2 | Salida 3 | Salida 4 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 0 |
3 | 0 | 1 | 1 | 0 | 0 |
4 | 0 | 0 | 1 | 1 | 0 |
5 | 0 | 0 | 0 | 1 | 1 |
El registro de desplazamiento de entrada en serie y salida en paralelo se basa en SISO, pero después de cada flip-flop hay una línea de salida. Esto hace que la salida sea paralela. El uso principal de un registro de desplazamiento SIPO es convertir datos en serie en datos en paralelo, también conocido como demultiplexación. Esto es muy útil cuando quieres salir algunos datos de su microcontrolador pero no hay suficientes pines disponibles.
Más adelante en el ejemplo, conectamos el pin de salida de un Arduino Uno a la entrada en serie del registro de desplazamiento. La salida paralela del registro de desplazamiento se conecta luego a varios LED.
El único inconveniente de usar un SIPO en lugar de varios pines en su microcontrolador Arduino o ESP8266 es que la conexión es más lenta que la salida paralela.
Los registros de desplazamiento SIPO de 8 bits más utilizados son 74LS164 y 74LS594.
Registro de desplazamiento de entrada en serie y salida en paralelo (PISO)
La siguiente tabla muestra la tabla de verdad del registro de desplazamiento PISO.
Traslado 1 | Traslado 2 | Traslado 3 | Traslado 4 | Salida |
---|---|---|---|---|
1 | 0 | 0 | 1 | |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 | 01 |
1 | 1 | 1 | 1 | 001 |
1 | 1 | 1 | 1 | 1001 |
La entrada en paralelo, la salida en serie tiene la función opuesta a la del registro de desplazamiento de la entrada en serie y la salida en paralelo. La entrada es el bit más significativo de la matriz de bits.
Si la línea de escritura / desplazamiento es BAJA, puede escribir datos en el registro de desplazamiento. Los datos se desplazan de un flip-flop al siguiente cuando la línea de escritura / desplazamiento es ALTA y al mismo tiempo se sincronizan los flip-flops. En cada ciclo de reloj, el siguiente bit se desplaza a la salida y, si tiene n flip-flops, la salida lee el último bit en n ciclos de reloj.
En el ejemplo que aparece más adelante en este tutorial, usamos PISO para leer varios estados de botones y enviar esa información multiplexada a un pin digital de nuestro microcontrolador. El registro de desplazamiento con entrada en paralelo y salida en serie, por lo tanto, tiene como objetivo conecte varias entradas si el microprocesador tiene menos pines de E / S entonces necesario.
PISO tiene la misma desventaja que SIPO, que la conexión es más lenta que la entrada paralela.
El registro de desplazamiento PISO de 8 bits más utilizado es el 74HC166.
¿Qué son los registros de cambio universales?
También hay registros de desplazamiento universales para uso bidireccional. Esto significa que estos registros pueden operar en todas las configuraciones posibles: SISO, SIPO, PISO, PIPO. Es poco probable que no haya registros universales de 8 bits disponibles solo en 4 bits. Si desea comprar este tipo de registros de cambio, puede mirar el TTL promedio 74LS194, 74LS195 o CMOS 4035.
La siguiente tabla le brinda una descripción general de todos los componentes y partes que utilicé para este tutorial. Recibo comisiones por compras realizadas a través de los enlaces de esta tabla.
Arduino Nano | Amazon | AliExpress |
Arduino Pro Mini | Amazon | AliExpress |
Arduino Uno | Amazon | AliExpress |
Arduino Mega | Amazon | AliExpress |
ESP32 ESP-WROOM-32 | Amazon | AliExpress |
ESP8266 NodeMCU | Amazon | AliExpress |
ESP8266 WeMos D1 Mini | Amazon | AliExpress |
Resistencia y LED en el paquete | Amazon | AliExpress |
Kit de botones | Amazon | AliExpress |
LED de control con el 74hc595n (SIPO)
El 74hc595n es un registro de desplazamiento de 8 bits Serial to Serial / Parallel tiene un voltaje de operación entre 2V-6V y, por lo tanto, es más adecuado para el microcontrolador Arduino o ESP8266. Encuentra toda la ficha técnica aquí.
74hc595n pin | Descripción y conexión |
---|---|
Q0…Q7 | Salidas en paralelo del registro de desplazamiento para escribir hasta 8 señales con sólo 3 pines en su microcontrolador Arduino, ESP8266 o ESP32 |
GND | Conectar a tierra en el microcontrolador |
VCC | Conectar a 3,3V o 5V en el microcontrolador |
DS | Hay que conectar la entrada de datos serie al microcontrolador |
OE | La entrada de habilitación de salida no la necesitamos y la conectamos a tierra |
STCP (Latch) | La entrada de reloj del registro de almacenamiento tiene que estar conectada al microcontrolador |
SHCP | La entrada de reloj del registro de desplazamiento debe conectarse al microcontrolador |
MR | Master reset conectado a VCC porque está activo con LOW y no queremos resetear el registro |
Q7S | Salida de datos serie no necesaria y por tanto no conectada |
La funcionalidad del 74hc595n SIPO se puede explicar fácilmente en tres pasos:
- El pestillo (pin STCP) se tira a BAJO, porque los datos solo se almacenan en el registro en una transición BAJA → ALTA.
- Los datos se desplazan al registro con el pin de datos (DS) y con una transición LOW → HIGH de la señal de reloj (SHCP).
- El bloqueo (pin STCP) se libera ALTO para guardar los datos en el registro.
Las siguientes imágenes muestran el cableado entre los microcontroladores Arduino, ESP8266 y ESP32 más utilizados y el 74hc595n, así como los LED y las resistencias.
Puede hacer clic en cada imagen para ampliarla. Si le falta su microcontrolador, escríbame un mensaje en la sección de comentarios y agregaré su microcontrolador al cableado.
Cableado entre 74hc595n y placas Arduino
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74hc595n y varias placas Arduino. Para la alimentación usamos el pin de 5V de la placa Arduino y para la comunicación puede elegir cualquier pin de E / S digital. Elijo los pines 5, 6 y 7 para el control del registro de cambios.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre placas 74hc595n y ESP8266
Dado que el registro de desplazamiento 74hc595n tiene un voltaje de funcionamiento entre 2 V y 6 V, podemos usar los pines de 3,3 V del ESP8266 para la fuente de alimentación del registro de desplazamiento, así como la salida de 5 V cuando la placa del microcontrolador ESP8266 se alimenta mediante una conexión USB.
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74hc595n y el ESP8266 NodeMCU y el ESP8266 WeMos D1 Mini. Para controlar el registro de desplazamiento, estoy usando los pines digitales D0, D1 y D2.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Cableado entre placas 74hc595n y ESP32
La siguiente imagen muestra el cableado entre el ESP32 ESP-WROOM-32 y el registro de desplazamiento 74hc595n. Para la alimentación, puede usar el pin de 3.3V o 5V del microcontrolador ESP32, porque el voltaje de operación del registro de desplazamiento está entre 2V y 6V.
El ESP32 controla el registro de desplazamiento con tres pines de salida digital entre los que puede elegir. Descargue el libro electrónico gratuito de la hoja de datos del microcontrolador para averiguar qué 4 pines del ESP32 son solo pines de entrada y, por lo tanto, no se pueden seleccionar. En mi caso estoy usando los pines 21, 22 y 23.
ESP32 ESP-WROOM-32
Código de programa para controlar los LED con un registro de desplazamiento SIPO
El código del programa puede ser más simple de lo que cree porque hay una función incorporada para el IDE de Arduino que mueve automáticamente los datos al registro de desplazamiento. Echemos un vistazo al código y lo guiaré a través de las líneas.
// for Arduino Microcontrollers int latchPin_SIPO = 5; int clockPin_SIPO = 7; int dataPin_SIPO = 6; // for ESP8266 Microcontrollers //int latchPin_SIPO = D2; //int clockPin_SIPO = D0; //int dataPin_SIPO = D1; // for ESP32 Microcontrollers //int latchPin_SIPO = 21; //int clockPin_SIPO = 23; //int dataPin_SIPO = 22; byte leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); Serial.begin(9600); } void loop() { leds = 0; updateShiftRegister(); delay(1000); for (int i = 0; i < 8; i++) { bitSet(leds, i); updateShiftRegister(); for (int i = 7; i >= 0; i--) { bool b = bitRead(leds, i); Serial.print(b); } delay(1000); Serial.println(" "); } } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); }
Primero definimos los pines para la conexión al 74hc595n. Los pines definidos dependen del microcontrolador. Por lo tanto, agregué el código del programa no solo para los pines de Arduino sino también para el ESP8266 y ESP32, pero comenté las líneas del programa. Solo necesita descomentar las líneas del microcontrolador que tiene y comentar la definición del otro microcontrolador.
Para todas las placas Arduino, el pin D5 está conectado a la entrada del reloj del registro de almacenamiento (STCP), el pin D7 a la entrada del reloj del registro de desplazamiento (SHCP) y el D6 está conectado a la entrada de datos en serie (DS).
Si está usando una placa ESP8266, estoy usando los pines digitales D0, D1 y D2 para el registro de almacenamiento y la entrada del reloj del registro de desplazamiento también fue la entrada de datos en serie.
Para el ESP32 NodeMCU estoy usando los pines 21, 22 y 23, pero puede usar diferentes pines digitales si lo desea.
También definimos los leds variables como un tipo de byte para luego almacenar información sobre el bit que ponemos a 1 para activar el led correspondiente.
En la función de configuración, debemos declarar los pines del registro de desplazamiento como salidas y también establecer la velocidad de transmisión en 9600.
En la función loop, ponemos a cero la variable de leds porque queremos inicializar el array de 8 bits con ceros. Por lo tanto, no se encenderá ningún LED después de actualizar el registro de desplazamiento con la función updateShiftRegister () que describo en la siguiente sección de la explicación del código.
Después de un retraso de un segundo ingresamos a un ciclo de 0 a 7 y en cada iteración colocamos el siguiente bit en la matriz de 8 bits a 1. Después de cada iteración actualizamos el registro de desplazamiento con la misma función.
Para ver la matriz, utilizo otro bucle for para imprimir cada bit en una fila. Desplácese hacia abajo hasta el video para ver la captura de pantalla del monitor en serie.
La función updateShiftRegister () asegura que el registro de desplazamiento se actualice después de cada iteración y al comienzo del ciclo for. La función realiza la misma lógica de 3 pasos que definimos anteriormente en este artículo:
- El pestillo (pin STCP) se tira a BAJO, porque los datos solo se almacenan en el registro en una transición BAJA → ALTA.
- Los datos se desplazan al registro con el pin de datos (DS) y con una transición LOW → HIGH de la señal de reloj (SHCP). Usamos el Función ShiftOut con el último bit significativo primero.
- El bloqueo (pin STCP) se libera ALTO para guardar los datos en el registro.
En este código de muestra, estoy usando la opción LSBFIRST. Por lo tanto, puede ver en el siguiente video que los LED se encienden al final del bucle for del bit 4 al bit 7, comenzando con el LED conectado a Q3.
Si tuviera que cambiar la opción a MSBFIRST, los LED se encenderán al principio comenzando con el LED conectado a Q0. Puede encontrar el video en la siguiente tabla.
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
---|---|---|---|---|---|---|---|---|
LSBFIRST | Q0 (LED verde) | Q1 (LED amarillo) | Q2 (LED rojo) | Q3 (LED azul) | Q4 | Q5 | Q6 | Q7 |
MSBFIRST | Q7 | Q6 | Q5 | Q4 | Q3 (LED azul) | Q2 (LED rojo) | Q1 (LED amarillo) | Q0 (LED verde) |
La siguiente imagen muestra el monitor en serie como resultado del ejemplo de SIPO.
Leer los estados de varios botones con el 74HC166 (PISO)
El 74HC166 es un registro de desplazamiento de entrada / salida en serie o en serie de 8 bits. Para la fuente de alimentación, el voltaje mínimo es de 2 V, el voltaje máximo es de 6 V con un voltaje típico de 5 V. Por lo tanto, el 74HC166 se puede utilizar con un microcontrolador Arduino y ESP8266.
Si está interesado en la hoja de datos completa, la encontrará en este sitio de Internet.
La imagen de la derecha muestra los pines del 74HC166 que describo en la siguiente sección.
74HC166 pin | Descripción y conexión |
---|---|
D0…D7 | Entradas en paralelo del registro de desplazamiento para leer hasta 8 señales con sólo 3 pines en su microcontrolador Arduino o ESP8266 |
GND | Conectar a tierra en el microcontrolador |
VCC | Conectar a 5V en el microcontrolador |
DS | Entrada de datos serie no necesaria y por tanto no conectada |
CE | La entrada de habilitación de reloj está activa cuando es baja y, por tanto, está conectada a tierra |
CP | La entrada de reloj está activa en el flanco de BAJO a ALTO y se conecta al microcontrolador (en este ejemplo D4) |
PE (Latch) | Entrada de habilitación en paralelo y conectada al microcontrolador (en este ejemplo D3) |
MR | Master reset conectado a VCC porque está activo con LOW y no queremos resetear el registro |
Q7 | La salida de datos serie de la última etapa tiene que estar conectada al microcontrolador (en este ejemplo D2) |
Los siguientes tres pasos describen la funcionalidad del registro de desplazamiento 74HC166:
- Primero configuramos el pestillo (pin PE en D3) y el reloj (pin CP en D4) BAJO.
- En la transición de LOW a HIGH del pin de reloj, los datos de D0… D7 se cargan en el registro de desplazamiento.
- Luego, PE se configura HIGH para activar el modo serial del registro para transmitir los datos recopilados a través de la línea de datos al microcontrolador en cada transición de LOW a HIGH de CP.
Una vez que sabemos cómo funciona el 74HC166, el siguiente paso es conectar el circuito para leer los estados de los botones a través del registro de desplazamiento 74HC166.
En este punto, debe tomar una decisión que influirá en el código de programación, ya que puede realizar un circuito de desenrollado o extracción con los botones.
- Configuración desplegable: si no se presiona el botón, la señal digital es BAJA = 0
Para detectar el botón pulsado, debe establecer todos los demás valores de registro de desplazamiento de 8 bits en 0 si elige la configuración desplegable, ya que el botón pulsará la línea digital HIGH = 1. - Configuración pull-up: si no se presiona el botón, la señal digital es ALTA = 1
Si elige la configuración de pull-up, puede establecer todos los demás pines en 1 para detectar el botón presionado, que envía un 0, cuando se presiona. En mi caso, no configuro todos los demás pines en 1 porque sé exactamente qué bit va de 1 a 0 si presiono un botón. Solo necesita conectar los pines no a tierra sino al riel de 3.3V / 5V.
Las siguientes dos imágenes muestran cómo hago una tarjeta para la configuración pull-up con el fin de guardar algunos hilos ?
Si no está seguro de las diferencias en una configuración desplegable o desplegable, le recomiendo que lea este artículo donde explico las diferencias y la función en detalle.
He preparado ambas configuraciones para este tutorial con el fin de brindarle el mejor conocimiento posible. Las siguientes imágenes muestran el bosquejo fritzing del registro de cambio PISO en la configuración pull-up y pull-up. Cualquiera de las dos configuraciones usamos resistencias de 10 kΩ.
Cableado entre 74HC166 y placas Arduino (desplegable)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y varias placas Arduino. Los botones están conectados en una configuración desplegable.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre placas 74HC166 y ESP8266 (desplegable)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y diferentes ESP8266 NodeMCU, así como el EPS8266 WeMos D1 Mini. Los botones están conectados en una configuración desplegable.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Cableado entre placas 74HC166 y ESP32 (desplegable)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y el ESP32 ESP-WROOM-32. Los botones están conectados en una configuración desplegable.
ESP32 ESP-WROOM-32
Cableado entre 74HC166 y placas Arduino (Pull-Up)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y varias placas Arduino. Los botones están conectados en una configuración pull-up.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre placas 74HC166 y ESP8266 (Pull-Up)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y diferentes ESP8266 NodeMCU, así como el EPS8266 WeMos D1 Mini. Los botones están conectados en una configuración pull-up.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Cableado entre placas 74HC166 y ESP32 (Pull-Up)
Las siguientes imágenes muestran el cableado entre el registro de desplazamiento 74HC166 y el ESP32 ESP-WROOM-32. Los botones están conectados en una configuración pull-up.
ESP32 ESP-WROOM-32
Código para leer el estado del botón con un registro de desplazamiento PISO
Una vez que todo está configurado y todos los componentes están conectados, podemos pasar al script del programa. El propósito de este ejemplo es mostrar el estado de cuatro botones en el monitor en serie.
// for Arduino Microcontrollers int latchPin_PISO = 3; int clockPin_PISO = 4; int dataPin_PISO = 2; // for ESP8266 Microcontrollers //int latchPin_PISO = D6; //int clockPin_PISO = D5; //int dataPin_PISO = D7; // for ESP32 Microcontrollers //int latchPin_PISO = 18; //int clockPin_PISO = 19; //int dataPin_PISO = 5; int j; int value; byte switchVar = 0; // for pull down configuration //byte switchVar = 1; // for pull up configuration void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, INPUT); pinMode(clockPin, OUTPUT); Serial.begin(9600); } void loop() { byte dataIn = 0; digitalWrite(latchPin, 0); digitalWrite(clockPin, 0); digitalWrite(clockPin, 1); digitalWrite(latchPin, 1); for(j = 0; j < 8; j++) { value = digitalRead(dataPin); Serial.print("Position of Bit in 8-bit array: "); Serial.println(j); Serial.print("Value of Bit in 8-bit array: "); Serial.println(value); if (value) { int a = (1 << j); dataIn = dataIn | a; } digitalWrite(clockPin, LOW); digitalWrite(clockPin, HIGH); } if (switchVar != dataIn) { switchVar = dataIn; Serial.print("dataIn DEC: "); Serial.print(dataIn, DEC); Serial.println(); Serial.print("dataIn BIN: "); Serial.print(dataIn, BIN); Serial.println(); } delay(5000); }
Como en el primer ejemplo de este tutorial, la primera parte es definir los pines que conectan el microcontrolador al registro de desplazamiento PISO. El pin de bloqueo está conectado al pin digital 3, el reloj al pin 4 y la línea de datos está conectada al pin digital 2.
También necesitamos tres variables adicionales:
- j: se usa en un bucle for para declarar qué bit está establecido
- valor: almacena el valor de lectura digital del pin de datos
- = 0 si no se presiona ningún botón
- = 1 si se presiona un botón
- switchVar: almacena una matriz de bytes para mostrar qué botón se presionó según la configuración desplegable o pull-up
En la función de configuración, el pin de bloqueo y reloj se definen como salidas y el pin de datos como entrada. La velocidad en baudios también se establece en 9600.
En la función de bucle, iniciamos la funcionalidad del registro de desplazamiento 74HC166 como se describió anteriormente en este artículo tirando del reloj y bloqueando BAJO. Luego, el reloj se levanta para cargar los datos en el registro de desplazamiento. Al tirar también del bloqueo a ALTO, los datos cargados previamente se envían al microcontrolador a través de la línea de datos en serie.
Ahora queremos saber qué botón se presionó. Por lo tanto, analizamos los 8 bits posibles en un bucle for y leemos el pin de datos digitales. En la siguiente imagen, ves el escaneo de 8 bits y también ves que los dos últimos bits son 1 porque presioné dos botones al mismo tiempo. También tenga en cuenta que utilicé la configuración del botón desplegable para esta imagen porque solo los bits son 1 para los que se presionan los botones y todos los demás bits son 0.
Si el valor de este bit es 1, hay un cambio de bits (<<) de un solo bit para el valor j. Este valor de bit desplazado es la entrada de un O bit a bit operación con la variable dataIn. La siguiente tabla muestra esta operación en los diferentes pasos:
j | valor | a | dataIn |
---|---|---|---|
0 | 0 | 0000 0000 | 0000 0000 |
1 | 0 | 0000 0000 | 0000 0000 |
2 | 0 | 0000 0000 | 0000 0000 |
… | … | … | … |
7 | 1 | 0100 0000 | 0100 0000 |
8 | 1 | 1000 0000 | 1100 0000 |
Además, si los datos se transmiten desde el 74HC166 al microcontrolador Arduino o ESP8266, la línea de reloj debe establecerse en LOW y HIGH porque solo en la transición LOW a HIGH, los datos se transfieren.
En este punto del script, sabemos que uno o más botones están presionados y también sabemos qué botones son. Con una sentencia if, verificamos si hay un cambio en la variable y si lo hay, imprimimos el valor decimal y binario de la variable dataIn en el terminal serial.
Al final de la secuencia de comandos, se establece un retraso en 5000 para la depuración o en 500 si desea ejecutar la secuencia de comandos con más frecuencia.
Las siguientes dos imágenes muestran la diferencia entre la configuración desplegable y la configuración desplegable. En la configuración desplegable, todos los bits se establecen en 0 y si se presiona un botón, el bit se establece en 1. Para la configuración desplegable, todos los bits conectados se establecen en 1 y solo se establece el bit que se presiona a 0 Para una mejor detección, puede establecer todos los bits en 1 conectando los bits abiertos no a tierra sino al riel de 5V. También debe cambiar la variable switchVar de 0 a 1 para notar el cambio en el botón que se tira hacia abajo.
Controle múltiples LED a través de botones (PISO + SIPO)
Ahora reunimos los ejemplos de SIPO y PISO en un solo ejemplo. Queremos controlar los LED con los botones. Si se presiona el botón 1, el LED 1 debería encenderse y así sucesivamente. Estoy eligiendo la configuración desplegable con solo dos botones para este ejemplo porque todos mis otros botones que coinciden con la maqueta están defectuosos, pero quiero encender un tercer LED cuando se presionan ambos botones al mismo tiempo.
La siguiente imagen muestra el bosquejo fritzing de este ejemplo donde combinamos el ejemplo de PISO y SIPO. El cableado se muestra en las diferentes pestañas para el microcontrolador Arduino más popular, así como para los microcontroladores ESP8266 y ESP32.
Haga clic en una imagen para ver el cableado en pantalla completa.
Cableado entre 74hc595n + 74HC166 y placas Arduino
Las siguientes imágenes muestran el cableado combinado del ejemplo anterior con 74hc595n (SIPO), el registro de desplazamiento 74HC166 (PISO) y varias placas de microcontroladores Arduino.
- Arduino Nano
- Arduino Pro Mini
- Arduino Uno
- Arduino Mega
Arduino Nano
Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini
Arduino Uno
Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega
Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
Cableado entre placas 74hc595n + 74HC166 y ESP8266
Las siguientes imágenes muestran el cableado combinado del ejemplo anterior con 74hc595n (SIPO), el registro de desplazamiento 74HC166 (PISO) y varias placas de microcontroladores ESP8266.
- ESP8266 NodeMCU
- ESP8266 WeMos D1 Mini
ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
Cableado entre placas 74hc595n + 74HC166 y ESP32
Las siguientes imágenes muestran el cableado combinado del ejemplo anterior con 74hc595n (SIPO), el registro de desplazamiento 74HC166 (PISO) y el ESP32 ESP-WROOM-32.
ESP32 ESP-WROOM-32
Código de programa para controlar LED con botones por PISO y SIPO
Como ya he explicado la mayor parte del código del programa, solo me centraré en los cambios.
// for Arduino Microcontrollers int latchPin_PISO = 3; int clockPin_PISO = 4; int dataPin_PISO = 2; int latchPin_SIPO = 5; int clockPin_SIPO = 7; int dataPin_SIPO = 6; // for ESP8266 Microcontrollers //int latchPin_PISO = D6; //int clockPin_PISO = D5; //int dataPin_PISO = D7; //int latchPin_SIPO = D2; //int clockPin_SIPO = D0; //int dataPin_SIPO = D1; // for ESP32 Microcontrollers //int latchPin_PISO = 18; //int clockPin_PISO = 19; //int dataPin_PISO = 5; //int latchPin_SIPO = 21; //int clockPin_SIPO = 23; //int dataPin_SIPO = 22; int i; int j; int value; byte switchVar = 0; byte leds = 0; void setup() { pinMode(latchPin_PISO, OUTPUT); pinMode(dataPin_PISO, INPUT); pinMode(clockPin_PISO, OUTPUT); pinMode(latchPin_SIPO, OUTPUT); pinMode(dataPin_SIPO, OUTPUT); pinMode(clockPin_SIPO, OUTPUT); Serial.begin(9600); } void loop() { byte dataIn = 0; leds = 0; updateShiftRegister(); digitalWrite(latchPin_PISO, 0); digitalWrite(clockPin_PISO, 0); digitalWrite(clockPin_PISO, 1); digitalWrite(latchPin_PISO, 1); for(j = 0; j < 8; j++) { value = digitalRead(dataPin_PISO); if (value) { dataIn = dataIn | (1 << j); } digitalWrite(clockPin_PISO, LOW); digitalWrite(clockPin_PISO, HIGH); } if (switchVar != dataIn) { switchVar = dataIn; Serial.print("dataIn DEC: "); Serial.print(dataIn, DEC); Serial.println(); Serial.print("dataIn BIN: "); Serial.print(dataIn, BIN); Serial.println(); if ((int) dataIn == 192) { i = 5; } else if ((int) dataIn == 128) { i = 6; } else if ((int) dataIn == 64) { i = 7; } bitSet(leds, i); updateShiftRegister(); for (int i = 7; i >= 0; i--) { bool b = bitRead(leds, i); Serial.print(b); } delay(1000); Serial.println(" "); } } void updateShiftRegister() { digitalWrite(latchPin_SIPO, LOW); shiftOut(dataPin_SIPO, clockPin_SIPO, LSBFIRST, leds); digitalWrite(latchPin_SIPO, HIGH); }
Primero, definimos el pestillo, el reloj y el pin de datos para el registro de desplazamiento PISO y SIPO para los diferentes microcontroladores. El script está comentado para microcontroladores Arduino. Si quieres usar un microcontrolador ESP8266 o ESP32, simplemente descomente la sección para pines PISO y SIPO y comente las líneas de Arduino.
Después de definir los pines PISO y SIPO, se definen diferentes variables que necesitamos durante el script.
En la función de configuración, el pin de datos del registro PISO se establece como entrada y todos los demás pines como salida. La velocidad en baudios se establece en 9600.
La función de bucle comienza inicializando la variable dataIn para detectar qué botones se han presionado y estableciendo la variable en 0 en cada iteración de la función de bucle porque de lo contrario no detectamos un botón presionado más de una vez. También después de cada ciclo reseteamos la variable de leds a 0 y actualizamos el registro de desplazamiento con la función que ya conocemos del primer ejemplo de este tutorial para apagar los leds de nuevo y activar el registro de desplazamiento PISO para leer los estados de los botones.
Ya conoce esta parte del programa por el ejemplo de PISO. Verificamos para cada bit si se presiona el botón correspondiente y agregamos todos los estados a través del operador OR a nivel de bit. Una vez que sabemos qué botones presionamos, imprimimos el valor decimal y binario en el monitor serial.
Ahora combinamos el ejemplo de SIPO y PISO. Una vez que sepamos qué botón se ha presionado y el valor decimal de esa combinación, recorremos todas las posibilidades y hacemos coincidir el estado del botón con la variable i que enciende el LED correspondiente a través de la función bitSet que conoces. Ejemplo de SIPO.
Al final del script, imprimimos la matriz de bits de los LED y esperamos 1 segundo.
La última parte del script es la función updateShiftRegister que usamos en el primer ejemplo.
El siguiente video me muestra presionando diferentes botones para encender los LED correspondientes.
Conclusión
Espero que les haya gustado este tutorial y, además, me alegrará que hayan aprendido cómo funciona un registro de desplazamiento y cuáles son los diferentes tipos de registros de desplazamiento disponibles. Si tiene alguna pregunta con respecto a este artículo, utilice la sección de comentarios a continuación para hacer sus preguntas.
Si también está interesado en cómo aumentar la cantidad de pines analógicos en su microcontrolador, qué multiplexor analógico, puedo recomendarle este artículo.