Programar fácil con Arduino

Programar fácil con Arduino, entiende cómo funciona el mundo.

  • Inicio
  • Blog
  • Podcast
  • ¿Quién soy?
  • Contactar
  • Acceder
Usted está aquí: Inicio / Tutoriales / Fragmentos / Arduino / 74HC595 registro de desplazamiento con Arduino

74HC595 registro de desplazamiento con Arduino

Luis del Valle Hernández

74HC595

En el articulo controlar matriz de LEDs con Arduino ya vimos como aumentar las salidas digitales con la técnica de Charlieplexing, en este caso vamos a ver como aumentar las salidas digitales de Arduino con el shift register, también llamados registros de desplazamiento pero con estos chips no solo vamos a poder manejar una matriz de LEDs sino que aumentaremos las salidas digitales para el propósito que queramos y se hacen fundamentales para multitud de proyectos.

Indice de contenidos

  • 1 ¿Qué es el registro de desplazamiento 74HC595?
  • 2 ¿Cómo funciona el registro de desplazamiento 74HC595?
  • 3 74HC595 programación del registro de desplazamiento

¿Qué es el registro de desplazamiento 74HC595?

Existe un chip, el shift register 74HC595 (que suele venir en la mayoría de los kits de Arduino) con el que a partir de 3 salidas digitales conseguimos 8 salidas digitales y si ponemos estos chips en serie podemos conseguir 8 * nº de chips salidas.

Por lo que sí necesitamos x salidas, necesitaremos x/8 chips. Vamos a ver un poco más de este chip.

  • 74HC595

Las salidas que te mencionaba nos las dan las patillas desde Q0 a Q7 y las tres entradas que irán conectadas a las salidas de nuestra placa de Arduino son DS (patilla 14), STCP (patilla 12) y SHCP (patilla 11).

Estas patillas son las más importantes de comprender y en las que vamos a profundizar, en cuanto a las otras, tenemos la entrada de voltaje que es de 5V (patilla 16), por supuesto la conexión a tierra, la patilla 8 y la salida Q7S (patilla 9) la utilizaremos para conectar estos chips en serie. Aquí tienes el datasheet por si quieres ver con más detenimiento lo que te estoy contando.

¿Cómo funciona el registro de desplazamiento 74HC595?

Comenzamos por las entradas. STCP, en esta entrada enviaremos un pulso cuadrado y sera nuestra señal de reloj. DS es la entrada de nuestros datos. Y SHCP lo utilizaremos como disparador para enviar los datos a las patillas de salida (Q0 a Q7). Veamos  el siguiente cronograma y explico el funcionamiento:

Como ves la primera línea es una señal de reloj que nos proporciona nuestra placa de Arduino, en el caso de Arduino UNO tiene una frecuencia de 16MHz. La segunda línea es la secuencia de datos que queremos transmitir a las salidas Qn.

Cuando el pulso de reloj pasa de nivel bajo a nivel alto coge el valor que en ese momento esté en la secuencia de datos y lo almacena en la salida correspondiente.

Para el primer pulso en Q0, para el segundo pulso en Q1 y así sucesivamente hasta completar los 8 bits que necesitamos. En este momento los datos de salida aún no están disponibles, necesitamos de la tercera señal que tenemos, SHCP.

Cuando esta pasa de nivel bajo a nivel alto los datos que tenemos preparados para las salidas pasan a estar disponibles en las salidas Q0 – Q7.

En el ejemplo de cronograma, estamos poniendo a nivel alto (HIGH) lo que este conectado en la patilla Q0, Q2 Q6 y Q7, y en nivel bajo (LOW) el resto. 

Al final tenemos 256 posibles estados, 28 que nos proporcionan esos 8 bits de salida. Para que visualices a lo que me estoy refiriendo imagínate que tuviéramos 8 LEDs conectados a esas 8 salidas, tendríamos 256 posibles combinaciones con esos LEDs encendidos y/o apagados.

¿Y cómo enviamos el pulso de reloj, los datos y la señal del disparador desde nuestra placa de Arduino?. ¿Qué código hay que implementar?. ¿Cómo realizamos una comunicación síncrona con este chip?

Para esta comunicación síncrona tenemos un método en Arduino que nos facilita este trabajo, shiftOut.

74HC595 programación del registro de desplazamiento

Lo primero que tenemos que tener inicializado , son los tres pines digitales que hayamos escogido de nuestra placa de Arduino en modo salida:

1
2
3
4
5
6
7
8
9
int latchPin = 5;            //connect 595 ’ pin 12
int clockPin = 4;           //connect 595 ’s pin11
int dataPin = 2;            // connect 595 ’s pin 14
 
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

Y ya podemos ver la función que os comentaba, tiene cuatro parámetros:

1
shiftOut(dataPin, clockPin, bitOrder, value)

El primero, será el pin que se encarga de transmitir la secuencia de 8 bits de la que se compondrá nuestra salida, la segunda envía el ciclo de reloj.

El tercer parámetro hay que poner la palabra reservada MSBFIRST(Most Significant Bit First) o LSBFIRST(Least Significant Bit First), para determinar en que orden cambian los bits. 

Y el último parámetro tenemos que ver qué número decimal le corresponde a la secuencia en binario que queremos representar, siendo  1 el estado alto (HIGH) y por lo tanto la salida activa y el 0 el estado bajo (LOW) y la salida deshabilitada.

Por lo que si son 8 bits (8 salidas) en decimal tenemos desde el 0 al 255. En el ejemplo de antes con los LEDs, si quieres encender el primer y tercer LED tendrás que pasarle el número 160 que equivale al 1010000000 en binario o si quieres el ejemplo del cronograma  será el 163 (10100011), que nos encenderá el primero, el tercero, el séptimo y el octavo LED. (Recordad que para estos cálculos puedes utilizar la calculadora de windows en vista programador, no hace falta ponerse a calcular, jejeje).

Pero nos falta la señal para recoger los datos, la tercera linea en el cronograma. Esto lo haremos mandando antes de la función shiftOut un valor bajo a ese pin, y tras esa función un valor alto.

Para que veas como quedaría el código, en este ejemplo pasamos por todos los posibles estados con una pausa de 1 segundo:

1
2
3
4
5
6
7
for(int i=0;i<256;i++)
{
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, i);
    digitalWrite(latchPin,HIGH);
    delay(1000);
}

Tenemos otros chips que aportan otras funcionalidades, tenemos el 74F675A que funciona de forma similar pero con una salida de 16 bits. Luego tenemos otros como el 74HC165 que es para aumentar las entradas de los pines digitales o el 74HC4051 que lo utilizamos para aumentar las entradas analógicas. Iremos viendo todos estos chips en nuevas entradas.

¿VAS COPIANDO Y PEGANDO CÓDIGO COMO UN POLLO SIN CABEZA?

Mini-curso de Arduino para principiantes y pollos.

Por si quieres aprender (gratis) de qué va esto de Arduino.

7 vídeos + 1 caso práctico

Explicado para que lo entienda
hasta tu abuela.

__CONFIG_colors_palette__{"active_palette":0,"config":{"colors":{"30800":{"name":"Main Accent","parent":-1},"f2bba":{"name":"Main Light 10","parent":"30800"},"trewq":{"name":"Main Light 30","parent":"30800"},"frty6":{"name":"Main Light 45","parent":"30800"},"flktr":{"name":"Main Light 80","parent":"30800"}},"gradients":[]},"palettes":[{"name":"Default","value":{"colors":{"30800":{"val":"rgb(59, 136, 253)","hsl":{"h":216,"s":0.98,"l":0.61}},"f2bba":{"val":"rgba(59, 136, 253, 0.1)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.1}},"trewq":{"val":"rgba(59, 136, 253, 0.3)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.3}},"frty6":{"val":"rgba(59, 136, 253, 0.45)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.45}},"flktr":{"val":"rgba(59, 136, 253, 0.8)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.8}}},"gradients":[]},"original":{"colors":{"30800":{"val":"rgb(59, 136, 253)","hsl":{"h":216,"s":0.98,"l":0.61}},"f2bba":{"val":"rgba(59, 136, 253, 0.1)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.1}},"trewq":{"val":"rgba(59, 136, 253, 0.3)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.3}},"frty6":{"val":"rgba(59, 136, 253, 0.45)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.45}},"flktr":{"val":"rgba(59, 136, 253, 0.8)","hsl_parent_dependency":{"h":216,"s":0.98,"l":0.61,"a":0.8}}},"gradients":[]}}]}__CONFIG_colors_palette__

TinyGS estaciones terrestres de código abierto

Bienvenidos a un capitulo nuevo de «La tecnología para todos«. Hoy vienen al podcast Oscar, German y José Manuel, para contar sobre Tiny GS la red … [+ info...]

raspberry pi vs intel nuc

Raspberry Pi vs Intel NUC

Bienvenidos a «La tecnología para todos«. En este capitulo de la sexta temporada junto a German y José Manuel, se plantea una incógnita: ¿Qué … [+ info...]

ESP-32

ESP32 Wifi y Bluetooth en un solo chip

ESP32 es una familia de microcontroladores de la empresa Espressif Systems. Su analogía más clara es la de un ESP8266 con esteroides, que incluye … [+ info...]

Copyright © 2021 · Programar Fácil · Aviso legal

Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos que acepta su uso.Aceptar Política de privacidad y cookies
Política de cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Non-necessary

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.

GUARDAR Y ACEPTAR