bclose

Arduino y los Shift Registers

El registro de desplazamiento 74HC595

 

Objetivos

 

 

 

    • Presentar los shift registers, o registros de desplazamiento.
    • Mostrar como ampliar el número de salidas de Arduino.
    • Conocer un chip muy práctico: el 74HC595.

 

 

Material requerido.

 

  Tienda España Tienda Mexico
Kit Arduino Uno  Kit inicio UNO Kit inicio UNO
Kit Arduino MEGA Kit Inicio Mega Kit Inicio Mega

 

El problema del número de pines de salida

 

Ya sabemos que Arduino UNO dispone de 14 pines digitales que podríamos usar para entrada y salida y que además disponemos de 6 puertas de entrada analógicas de A0 hasta A5. Lo que no suele ser muy conocido es que las puertas analógicas también se pueden usar como pines digitales en caso necesario. Podemos leer y escribir valores digitales exactamente como lo hacemos con los pines digitales normales:

      pinMode (A1, OUTPUT) ;

Y después escribir tranquilamente:

      digitalWrite(A1, HIGH) ;

Nuestras puertas analógicas se comportarán gentilmente como puertas digitales (Si, también podemos hacer lo mismo para la lectura). Os animo a que hagáis el blinking LED con una puerta analógica.

 
  • Aqui teneis que hace el parpadeo de un LED con la puerta A1   Blinking LED y el Prog_20_2 que lee en digital el pin A1 Lectura digital
 

Así pues, en realidad, disponemos de 20 puertas digitales para nuestras cosas. Pero en la vida de toda persona, siempre hay un momento en que esto nos suficiente.

Podemos pasarnos a un Arduino Mega que con 54 pines digitales más 16 puertas analógicas hacen el impresionante numero de 60 puertas disponibles. Pero al final, la combinación entre la ley de Murphy y la segunda ley de la termodinámica (La de que todo tiende al caos) garantizan que aparezca alguien que quiere un cuadro de luces con 64 LEDs (o 128 ya puestos) y la catástrofe nos acecha porque no hay Arduinos con más pines.

Afortunadamente la industria electrónica nos provee con una forma sencilla de aumentar el número de salidas digitales de nuestros Arduinos sin demasiada complicación. Unos pequeños chips llamados Shift Registers fáciles de encontrar como el 74HC595.

El 74HC595 es un Shift Register de 8 bits serial-in, parallel-out, pertenece a una familia de chips que aceptan una entrada de bits en serie y los sacan en 8 pines paralelos.  Solo sirve para escribir señales digitales y no para leerlas.

 
  • Si lo que necesitas es aumentar los pines digitales de entrada, prueba a usar 74HC165 que es un shift register de entrada
  • Si lo que necesitas es aumentar los pines analógicos puedes usar un multiplexor / demultiplexor como el 74HC4051.
 

Aunque ahora todo parezca un poco confuso (no me extraña) son bastante sencillos de manejar una vez que entiendes lo que hacen y son sorprendentemente útiles en cantidad de situaciones.

Como funciona un Shift Register

 

En la Sesión 7 vimos que para comunicar dos puntos con una conexión serie necesitábamos  pactar una velocidad de envío para saber cuándo hay que leer los datos que llegan.

A este sistema le llamamos comunicación serie asíncrona porque la sincronía va implícita en la velocidad. Un Shift Register funciona mediante la comunicación  serie síncrona. Es decir que usamos un pin para enviar los bits en serie (el Data pin) y usamos un segundo pin (el Clock pin) para indicar cuando hay que leer el bit.

Cuando los 8 bits se han leído en el registro un tercer pin (Latch pin) escribe estos bits en los pines de salida del chip y los mantiene hasta que se reciban nuevos datos. Diagrama de tiempo 595 Fíjate en el gráfico superior. Nuestro Arduino envía la señal de Clock Pin de modo regular para indicar cuando hay que leer (Se lee en el flanco de subida, cuando Clock sube de 0 a 1).

A medida que Arduino va poniendo valores en el Data Pin(DS), el chip los va leyendo en el flanco de subida del Clock pin y por eso va a ir leyendo 1 1 1 0 0 0 1 1 sucesivamente.

Cada uno de estos valores se van pasando en orden a los pines de salida de Q0 hasta Q7, pero aún no se activan. Cuando el Latch Pin se activa (también por flanco de subida) los valores pasan a los pines de salida y se memorizan.

Vamos a montar un circuito que use estas salidas para gobernar un conjunto de 8 LEDs, usando solo 3 pines de Arduino que corresponden a Clock, Data y Latch.

 

Diagramas del circuito

 

Vamos con el esquema por cortesía de Fritzing: Img_22_5 Y aquí tenemos el esquema de protoboard. Sesion_22___bb

El Programa de escritura en el 74HC595

 

Vamos a empezar con las definiciones de pines lo primero:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

     

int latchPin = 8 ;        //Pin conectado a ST_CP of 74HC595 (Verde)
int clockPin = 12;        //Pin conectado a SH_CP of 74HC595 (Amarillo)
int dataPin = 11;          //Pin connected to DS of 74HC595  (Azul)

Y despues el setup

void setup()
   {      pinMode(latchPin, OUTPUT);
          pinMode(clockPin, OUTPUT);
          pinMode(dataPin, OUTPUT);
   }

Las comunicaciones síncronas son tan frecuentes, que nuestro Arduino las soporta de fábrica con una serie de funciones. La que nos interesa, se llama shiftOut(). (Podeis Goglear el manual) Para iniciar la comunicación síncrona basta poner el Latch en LOW

DigitalWrite(latchPin, LOW);

Y ahora enviar los 8 bits llamando a shiftOut() y pasándole que pines usamos para Data y Clock además indicándole el valor que queremos enviar a la salida:

shiftOut(dataPin, clockPin, MSBFIRST, Num) ;
 
  • Lo de MSBFIRST significa Most Significant Bit First, o sea, enviar el número binario empezando por la izquierda. También podría ser al revés como LSBFIRST (Least Significant Bit First) . Solo es una forma de que los informáticos se hagan los interesantes y en  este caso nos da absolutamente  lo mismo.
 
Y por último fijar los valores en la salida poniendo HIGH el Latch de nuevo.

void loop() 
   {
       for (int Num = 0; Num < 256; Num++)
          {
             digitalWrite(latchPin, LOW) ; // Latch a LOW para que no varíe la salida
             shiftOut(dataPin, clockPin, MSBFIRST, Num);  // Aqui va Num

             digitalWrite(latchPin, HIGH) ; // Latch a HIGH fija valores en la salida
             delay(500);
          }
   }

Veremos que los LEDs irán contando mostrando los valores de Num en binario.  Aquí tenéis otro ejemplo con este mismo circuito en el que leemos la puerta serie para recibir un número entre 0 y 9 y lo pasamos a los pines LEDs de salida: https://www.youtube.com/watch?v=7lk-gNXV1Y0  

Más sobre los shift registers

 

Una curiosidad del 74HC595, es que si le metemos un tren de más bits de los 8 que puede almacenar, sencillamente los va empujando hacia la salida por su pin 9 (que os habréis fijado no hemos utilizado en el ejemplo anterior) y los va dejando caer al olvido.

Pero si conectamos este pin 9, al pin 14 de entrada de datos de un segundo chip 74HC595, y compartimos entre ellos el Clock y el Latch, en lugar de caer en el olvido entrará en el siguiente chip de la cadena y seguirá en el juego.

Hemos conseguido una ampliación de otras 8 salidas digitales sin utilizar pines adicionales de nuestro Arduino. Y naturalmente una vez visto el truco, no hay límite en principio al número de chips que podemos concatenar.

Si ese que quería un cuadro de luces de 128 LEDS vuelve, lo podríamos arreglar con 128/8 = 16 chips. O si preferís, también existen estos chips en 16 bits: SN74LS67474F675A que son 16-Bit Serial-In, Serial/Parallel-Out Shift Register, y lo arreglaríamos con solo 8 chips.

Y ya que estamos ¿Existen Shift registers de 32 o de 64 bits? Pues sí.

Si buscáis en internet encontrareis que existe casi cualquier cosa que os imaginéis en chips digitales, pero tomároslo con precaución porque mientras que un 74HC595 lo compras por 1€,  el SN74LS674 de 16 bits se va a 4€ y los demás no he mirado pero me lo imagino.

Aumentando las salidas de arduino

Resumen de la sesión

Hoy en nuestro curso arduino hemos aprendido lo siguiente:

 
    • Hemos visto que los pines analógicos también se pueden usar como digitales.
    • Hemos presentado nuestro primer chip comercial, el 74HC595, que es un shift register serial-in, parallel-out de 8 bits, y que se puede conectar en cascada.
    • Hemos apuntado muy brevemente a que existen otros chips en el mercado, literalmente miles o decenas de miles.
    • Vimos la diferencia entre comunicación serie asíncrona y síncrona y vimos un ejemplo de cómo se sincronizan los datos.
    • Hemos conocido otra función de Arduino shiftOut().
 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(73) Comments

  • Avatar for Charly
    • Mikelga999

    Hola.
    Debo felicitaros ya que esta web me es muy útil para consultar dudas que me surgen en mis proyectos con Arduino. Siempre he optado por mirar en los ejemplos y en los comentarios sin hacer más preguntas. Normalmemente con eso me ha bastado pero en esta ocasión me estoy encontrando con una dificultad a la que no puedo dar una explicación y por eso recurro al post para ver si alguien me puede echar una mano.
    Resulta que estoy intentando construir una especie de secuenciador de notas de 16 pasos para enviar comandos de notas a una caja MIDI utilizando un arduino Nano. Tiene una bateria de botones, leds indicadores y potenciometros. Los botones de ON/OFF son leidos por un CD4021B, que es un shift register de entrada paralelo/serie. Esa parte funciona bien, ya que, cuando hace el loop se leen los valores, el estado de cada uno de los botones se almacena en dos variables de tipo byte (en un array) que cuando son leidas para por ejemplo imprimirlas en el terminal con el formato BIN, corresponden al mapa del estado de los botones. El problema es que cuando quiero pasarlo a la siguiente etapa de mi programa, «la salida de ese estado reflejada en los leds de estado de los botones», al pasar esos dos valores a la función shiftout de arduino, este no hace lo que debería, es decir, no enciende los leds como es debido.
    Sé que los «bancos de leds» funcionan, porque si pongo en la función shiftout el valor numerico (lirteral) que quiera reflejar en los leds, por ejemplo 1111 0001 (241 DEC) lo hace bien. Si llamo dos veces a la función con un valor literal en cada una, lo hace bien. Pero en cuanto pongo la variable del array con el valor que sé que tiene guardado, deja de hacerlo bien.
    No sé que más hacer, ¿alguna idea?
    Muchas Gracias!

  • Avatar for Charly

    Perdon por colgar 3 comentarios… ha sido sin querer!

  • Avatar for Charly

    Hola, en mi proyecto tengo conectados 3 Shift Register para controlar 24 leds (uno por cada hora del dia). Al empezar funciona todo correctamente, pero cuando han pasado unos segundos hay dos de los tres chips que no entregan la tensión necesaria en la pata Q7 respectiva, haciendo apagar los leds que controlan. Es curioso porque el resto de las patas me van bién (4’5V-5V). Pero en la Q7 de los dos chips leo con el tester una tensión entre 0’8 y 1’2v.
    No entiendo mucho de electrónica, así que no se muy bien que puede pasar y como poder solucionarlo. Es como si los chips no funcionaran bien. También, de tanto en cuando, hay alguna corriente residual en patas “apagadas” que estan cerca de patas “encendidas”, encendiendo sus leds un poco.
    Espero que se te ocurra lo que podría estar ocurriendo.
    Muchas gracias y mil gracias por los tutoriales!
    Edu

  • Avatar for Charly
    • Eduard Tudel

    Hola, en mi proyecto tengo conectados 3 Shift Register para controlar 24 leds (uno por cada hora del dia). Al empezar funciona todo correctamente, pero cuando han pasado unos segundos hay dos de los tres chips que no entregan la tensión necesaria en la pata Q7 respectiva, haciendo apagar los leds que controlan. Es curioso porque el resto de las patas me van bién (4’5V-5V). Pero en la Q7 de los dos chips leo con el tester una tensión entre 0’8 y 1’2v.
    No entiendo mucho de electrónica, así que no se muy bien que puede pasar y como poder solucionarlo. Es como si los chips no funcionaran bien. También, de tanto en cuando, hay alguna corriente residual en patas «apagadas» que estan cerca de patas «encendidas», encendiendo sus leds un poco.
    Espero que se te ocurra lo que podría estar ocurriendo.
    Muchas gracias y mil gracias por los tutoriales!
    Edu

  • Avatar for Charly

    Hola, estoy usando 3 Shift Register encadenados para controlar 24 leds (para marcar horas de 1 a 24h), y me pasa una cosa rara:
    en principio todo funciona bien, pero al poco tiempo, hay 2 shifts que la salida del 1r led (en tu esquema el Q7) se vuelve inestable, y al final lo apaga. Así que de los 24 leds tengo dos que no funcionan! (siempre el Q7 de 2 xips diferentes)
    He comprobado con el tester el voltaje de la pata Q7 del xip y me da unos valores inestables que tienden a estar entre 0’8v y 1’2v cuando tendrían que ser de unos 4’5v igual como pasa con las demás patas cuando están activadas..
    Parece problema de los shift register, en cambio cualquier otra pata me enciende los otros leds correctamente.
    Esperando tu respuesta, a ver si hay alguna cosa que se te pudiera ocurrir.
    Muchas gracias
    y gracias por los tutoriales!!

  • Avatar for Charly
    • Prueba TPV TPV

    Hola Carlos, No me das muchas pistas

  • Avatar for Charly
    • Carlos

    Hola, estupendo artículo, yo estoy realizando un proyecto con 2 74hc595 y un display de 7 segmentos y 4 digitos. Y todo funciona correcto, lo único es que cuando añado alguna condición o algún delay, dejan de funcionar todos los dígitos menos el último. Cuál podría ser el problema?
    Gracias

  • Avatar for Charly

    Gracias por su gentileza Charly. Se ven interesantes esas matrices. En mi caso debo fabricar yo mismo las matrices con tiras de led o leds individuales ya que cada dígito debe tener entre 20 y 30 cm. de altura para ser vistos de día y a buena distancia. Se trata de un sistema de cronometraje para equitación de niños con autismo y Síndrome de Down. Dicho esto, cabe confesar que no se más que lo básico de Arduino y apenas un poquito más de electrónica. He encontrado infinidad de cronómetros para PC y Android pero tampoco sabría como mostrarlos en una pantalla de leds. Obviamente todo se trata de bajos recursos económicos.
    Hemos logrado con Arduino y módulos de RF hacer sensores de barrera láser, inalámbricos, que pondrán en marcha y detendrán el sistema de cronometraje y que funcionan perfectamente. Nos falta el corazón del sistema que es justamente el cronómetro. Para ello no tenemos diagramas ni códigos y no sabemos dónde buscar. Disculpe la extensión de mi mensaje pero mi oficio es el de escritor y esto de la electrónica es una nueva pasión surgida de la necesidad de ayudar en la escuela de rehabilitación de niños de bajísimos recursos. Desde ya, agradecido por su colaboración, lo saludamos desde San Luis, Argentina.

  • Avatar for Charly
    • Charly

    Hola Jose, no tendras problema en manejar los displays de 7 segmentos y no es complicado hacerlo con los shift register aunque te obligara a usar 6 lo que es engorroso. Hay chips especificos para hacer ese tipo de cosas como el MAX7219. Tenemos algun tuto en la pagina sobre esto aunque usando otros dsplays: https://www.prometec.net/grupo-4-8×8-max7219/

    En cuanto a la medicion del tiempo la propia precision de arduino es suficiente para hacer el cronometro has las centesimas a condicion que no hasgas delays y cosas asi, pero si no estas tranquilo cualquiera de los rtc de nuestra tienda te daran precision sobrada y garantias de exactitud

  • Avatar for Charly
    • José

    Hola gente sabia del foro. Yo estoy intentando hacer un cronómetro de seis dígitos de 7 segmentos manejados con arduino mega. Supongo que deberé multiplexar con los chips 74hc595 (uno por dígito). El crono deberá ser capaz de hacer cuentas progresivas y regresivas con centésimas de segundo (mm:ss:cc). No estoy seguro de comprar esos chips porque no sé si son capaces de manejar tiempos con precisión. Además no consigo el código apropiado para arduino. Ojalá puedan orientarme de algún modo para conseguir la info necesaria. Desde ya muchas gracias por existir.

  • Avatar for Charly
    • Ivan Uriarte

    Hola, deberías poder usar los shift register sin problema.

  • Avatar for Charly
    • Blasroberto Asaro

    hola soy nuevo en esto de ARDUINO y tengo un MEGA ,lo compre por la cantidad de pines que tiene ,mi proyecto es manejar 80 leds ,que se encienda uno solo ,con el retraso que yo busque al producir un sonido ,con un for ,o un random me es igual ya que todos los leds permanecen apagados y al producir un sonido se enciende cualquiera ,logre ese efecto , pero para los 80 leds ,me propuse usar los 74hc595, la idea es como una ruleta de 80 leds ,mi pregunta es se puede usando un for con 10 shif register de dos en dos ,realisar mi proyecto ,se trata de un simulador de tiro al vuelo
    gracias desde argentina

  • Avatar for Charly
    • Ivan Uriarte

    Yo diría que no, al menos de forma sencillam ya que funcionan por modulación de pulso y los shift register sólo aportan un estado lógico.

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login