martes, 9 de agosto de 2011

Uso del chip Shift Register (74HC595) en Arduino

El chip 74HC595 nos permite utilizar una entrada de datos serie, y convertir un byte a 8 salidas en paralelo. Mediante el uso de una entrada de DATA, una de CLOCK y un LATCH, conseguimos con sólo 3 pines de Arduino procesar 8 salidas paralelas digitales.

Destacar que pueden encadenarse varios chips, por lo que si añadimos un segundo chip podemos tener 16 salidas paralelas simultáneas con 2 bytes, y así sucesivamente.


CIRCUITO
Nuestro prototipo para probar la conversión de serie a digital que nos facilita el 595 se basa en el esquema siguiente:

PROTOTIPO
El prototipo implementado en una protoboard tiene éste aspecto.


CÓDIGO FUENTE DE ARDUINO
La prueba se basa en el sistema de señalización del Proyecto PAROCA I, en que se muestran 5 LEDs en frecuencia estroboscópica (10ms / 64 ms) y un LED tricolor en que se mostrará el estado de la batería.

 /*  

Proyecto.....: PAROCA I
Descripcion..: Plataforma Robotica de Carga
Autor........: Ricard Forner (RFKSolutions.es)
Version......: 0.0.1
Fecha........: 03/08/2011
Código fuente: Arduino
*/
//Pin conectado a latch pin (ST_CP) del 74HC595
const int latchPin = A1;
//Pin conectado a clock pin (SH_CP) del 74HC595
const int clockPin = A0;
//Pin conectado a Data in (DS) del 74HC595
const int dataPin = A2;
//// Luces intermitentes / strobe
int seqLED[5] = {8+16, 8+16, 32+64, 32+64, 128};
//// Luces estado bateria
const int batteryOk = 2; // verde
const int batteryLow = 1; // rojo
int batteryStatus;
void setup() {
initLuces();
batteryStatus = batteryOk;
}
void loop() {
doLuces(batteryStatus);
}
void initLuces() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void doLuces(int status) {
for (int n=0; n<5; n++) {
digitalWrite(latchPin, LOW);
delay(10);
shiftOut(dataPin, clockPin, MSBFIRST, status+seqLED[n]);
digitalWrite(latchPin, HIGH);
delay(12);
}
}



VÍDEOS
Como resultado de lo publicado en el presente artículo, un par de vídeos de su funcionamiento.


Video de una rotación secuencial de los LEDs.



5 comentarios:

Dieguitofernandez dijo...

Buenas, estoy probando un proyecto parecido, y anda perfecto, pero tengo el problema de que al momento del arranque de la placa parpadean las salidas del 74HC595, lo cual no puede suceder en la aplicacion final, tienes idea de como controlar eso? Algun link o algo? Desde ya muchas gracias.

Ricard Forner dijo...

En pricipio con el condensador en el latch hace que no se produzcan glitches, y tambien deberias de enviar un primer byte (si solo usas un Shiftregister) con todo a ceros (para dejarlo apagado). Mirate estos enlace que hay algunos ejemplos:

(1) http://www.picano.nl/microcontrollers/arduino/control-many-leds-with-pwm

(2) http://www.arduino.cc/en/Tutorial/ShiftOut

pirotom dijo...

Tengo dos dudas; estoy tratando de usar este esquema para conectar un display de 7 segmentos 4 dígitos con ánodo común. Le voy a poner una interface de transistores (porque el display opera al revés) y a usar cuatro salidas del Arduino para multiplexar los dígitos, pues el display tiene doce pines (8 de segmentos y DP, y cuatro ánodos). La primera, es respeto de los tiempos relacionados con la diferencia entre el reloj del Arduino y el del IC, si se te ocurre que pueda surgir algún problema. La segunda es sobre la conexión permanente del reset del IC a 5v, ¿cuál es la función de esta conexión? Desde ya, gracias.

Cristian Veloso dijo...

Pirotom como estas?, te respondo una de tus dudas, la conexión permanente a 5V del pin de reset (MR) es por que este pin se controla con lógica negativa, lo que quiere decir que al conectarlo a 5V y negarlo, el MR estará seteado en 0 lógico, lo que quiere decir que no se reseteara nunca. hace un tiempo escribi un articulo sobre este integrado, te lo comparto por si te sirve

http://electrontools.blogspot.com.ar/2014/08/registro-de-desplazamiento-74hc595.html

saludos!

Cristian Veloso dijo...

Como estas? sabes que estoy trabajando en multiplexar 4 7 segmentos utilizando el mismo driver, pero al iniciar hace como unos parpadeos raros.. es normal?

la info y el codigo arduino las saque de aca

74HC595

te agradezco si me respondes.
saludos!