Taller 4-Manejo de Registro de Desplazamiento

Está en la página 1de 8

1

INTERNET DE LAS COSAS (IoT)


TALLER 4 MANEJO DE REGISTRO DE DESPLAZAMIENTO

HARDWARE
Tarjeta Arduino Integrado 74HC595

Diodos Led Resistencias de 220 ohmios

Cables de conexión Protoboards

INTRODUCCIÓN

En ocasiones es necesario disponer de más pines de salida, pero hay limitaciones en la tarjeta de
Arduino. Entonces se puede recurrir a un circuito de desplazamiento que permita ingresar las
salidas en forma serial pero que se entreguen en forma individual a las salidas. El integrado
74HC595N permite hacerlo.

REGISTRO DE DESPLAZAMIENTO 74HC595

¿Qué es y cómo funciona el integrado 74HC595?

El 74HC595 es un registro de desplazamiento de 8 bit con una entrada serie y salida paralelo. La
gran utilidad de esto es poder utilizar y controlar ocho salidas con tan solo 3 pines del
microcontrolador, mediante las entradas(Latch/Clock/Data), se puede controlar hasta ocho
salidas, de manera que es de gran utilidad para proyectos en los que se cuenta con poca cantidad
de pines en el microcontrolador.

Como se ve en la imagen, Latch es el pin 12, Clock el pin 11, y el bit de datos es el pin numero 14
Al cambiar de LOW a HIGH el bit de Data y generar un nuevo pulso de reloj pasando el bit de clock
de HIGH a LOW, se graba en la posición actual donde se encuentre el desplazamiento el valor
ingresado en el pin de Data, esto se repite 8 veces para generar un Byte a la salida (Q0 – Q7), de
esta manera puede controlar un Byte de salida con solo tres pines del microcontrolador.
2

 ¿Qué aplicaciones se pueden hacer con el integrado 74HC595

La respuesta a esta pregunta sería; todas las que se ocurran, pero hay una muy común que puede
ser de gran utilidad en cualquier proyecto de Electrónica en el que se necesite controlar algún tipo
de display de 7 segmentos.

Por ejemplo

Se desea visualizar el numero 3 en un display de 7 segmentos.

Lo que se debería hacer para visualizar un numero 3 en este display seria habilitar los pines
A/B/G/C/D.
Pensando en términos de bytes, la idea es enviar la palabra.
3

El bit de encendido debería estar conectado al ánodo (con un LOW se enciende).

Lo que se debe hacer es generar esta palabra a la salida del 74HC595 y conectarla a los pines del
display.

1. Aumento de pines de salida a un Arduino Uno. Implementar el siguiente circuito. Conectar


la tarjeta de Arduino al PC, abrir el entorno ISE de Arduino, leer, editar (File – New) y
documentar (escribir qué hace cada línea) el siguiente programa, verificarlo (√), corregir
errores si los hay, y luego cargar (→) el programa a la tarjeta.
4

Este montaje sirve para mostrar cómo se puede aumentar el número de pines de un Arduino
utilizando un integrado 74HC595 (Shift Register) o registro de desplazamiento de 8 bits, serial-in,
parallel-out, es decir que acepta dato serie como entrada y lo coloca en la salida como un dato
paralelo.

Si se necesita aumentar los pines digitales de entrada se puede usar un 74HC165 que es un
registro de desplazamiento de entrada. Si se necesita aumentar el número de pines análogos se
puede utilizar un multiplexor/demultiplexor como el 74HC4051.

El registro de desplazamiento funciona mediante comunicación serie síncrona es decir que usamos
un pin para enviar los bits en serie (Data pin) y un segundo pin (Clock pin) para indicar cuándo 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 reciban nuevos datos.

El código utilizado es el siguiente;

/* ----------------------------------------------------------------
www.prometec.net
Prog_22_3

Un contador que envía números a un shif register 74HC595


y muestra el resultado en 8 LEDs de salida
--------------------------------------------------------------------
*/
5

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 connectado a DS of 74HC595 (Azul)

void setup()
{ pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
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);
}
}

2. Correr el siguiente programa. Repetir punto 1. Observar, analizar el programa, concluir.

#include <Wire.h>

/*
Ejemplo de uso del registro de desplazamiento 74HC595 utilizando un arreglo

Hardware:
* Registro de desplazamiento 74HC595
* LEDs conectados a las salidas del registro de desplazamiento
* Resistencias de 220 ohmios
*/
//Pin conectado al ST_CP del 74HC595
int latchPin = 8;
//Pin conectado a SH_CP del 74HC595
int clockPin = 12;
////Pin conectado a DS del 74HC595
int dataPin = 11;

//recipientes de la información que se va a pasar a la función de desplazamiento


byte data;
byte dataArray[10];

void setup() {
//configura pines como salida porque son direccionados en el bucle principal
pinMode(latchPin, OUTPUT);
Serial.begin(9600);
6

//Notación binaria como comentario


dataArray[0] = 0xFF; //0b11111111
dataArray[1] = 0xFE; //0b11111110
dataArray[2] = 0xFC; //0b11111100
dataArray[3] = 0xF8; //0b11111000
dataArray[4] = 0xF0; //0b11110000
dataArray[5] = 0xE0; //0b11100000
dataArray[6] = 0xC0; //0b11000000
dataArray[7] = 0x80; //0b10000000
dataArray[8] = 0x00; //0b00000000
dataArray[9] = 0xE0; //0b11100000

//función que parpadea los LEDs


//obtiene el número de parpadeos y el tiempo de pausa
blinkAll_2Bytes(2,1500);
}

void loop() {

for (int j = 0; j < 10; j++) {


//carga la secuencia de luces que se desea desde el arreglo
data = dataArray[j];
//conecta a común el pin latchPin y lo mantiene en low durante el tiempo de transmisión
digitalWrite(latchPin, 0);
//mueve 'em a la salida
shiftOut(dataPin, clockPin, data);
//retorna el pin latch a high para señalar al chip que no necesita escuchar
//información
digitalWrite(latchPin, 1);
delay(1000);
}
}

// el corazón del programa


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
// Esto desplaza 8 bits la salida con el bit más significativo, MSB, primero,
//ante el flanco ascendente del reloj,
//clock idles low

//función interna de inicialización


int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);
7

//limpia todo a tiempo para preparar al registro de desplazamiento


//para el desplazamiento de los bits
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

//para cada bit en el byte myDataOut


//NOTAR QUE SE ESTÁ CONTANDO HACIA ABAJO E en el lazo de salida
//Esto significa que en %00000001 o "1" será el pinQ0 el que alumbra.
for (i=7; i>=0; i--)
{
digitalWrite(myClockPin, 0);

//si el valor pasado a myDataOut y una máscara de bit resulta cierta


// entonces... de manera que si está en i=6 y el valor es
// %11010100 el código de comparación sería %01000000
// y procede a colocar el pinState en 1.
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}

//Coloca el pin en HIGH o LOW dependiendo del pinState


digitalWrite(myDataPin, pinState);
//el registro desplaza los bits cuando sube el reloj
digitalWrite(myClockPin, 1);
//coloca en cero el pin de datos después del desplazamiento para prevenir drenaje
digitalWrite(myDataPin, 0);
}

//detiene el desplazamiento
digitalWrite(myClockPin, 0);
}

//parpadea el registro completo basado en el número de veces que se desee "n"


// y la pausa entre ellos "d" se inicia con un momento de oscuridad para asegurar que el
primer //parpadeo
// tiene su efecto visual completo.
void blinkAll_2Bytes(int n, int d) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(200);
for (int x = 0; x < n; x++) {
digitalWrite(latchPin, 0);
8

shiftOut(dataPin, clockPin, 255);


shiftOut(dataPin, clockPin, 255);
digitalWrite(latchPin, 1);
delay(d);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(d);
}
}

3. Elaborar diagrama de flujo de los programas anteriores


4. Implementar una aplicación para 4 motores pequeños en una secuencia determinada

https://playground.arduino.cc/Main/LibraryList

También podría gustarte