EJERCICIO Manejando múltiples salidas con un driver de LED-s
Descripción del ejercicio
En este ejercicio pretendemos mostrar la forma de utilizar un número elevado de LED-s utilizando tan sólo 4 PIN-es. Para ello utilizaremos un driver 4794 de Phiplips.
Un driver de LED-s tiene incorporado un registro de desplazamiento que recibe los datos en formato serie y los transfiere en paralelo. Es posible encadenar chips según el esquema daisy chain, incrementando, cada vez en 8, el número de LED-s.
Detalle del conexionado de un driver Philips 4794
Esquema
Montaje de un driver Philips 4794
El código del ejercicio que sigue a continuación toma el valor almacenado en la variable dato y lo muestra como un número binario decodificado. Por ejemplo, si la variable dato es 1, sólo se encendera el primer LED. Si la variable dato es 255, se encenderán todos los LED.
Elementos necesarios
- Un driver Philips 4794
- 8 LED-s.
- 8 resistencias de 220 Ohmios.
- Una placa protoboard.
- Cables para realizar las conexiones.
Código fuente
/* Driver Philips 4794
* -------------------
*
* Muestra un byte almacenado en la variable dato
* en una fila de 8 LED-s
*
* (copyleft) 2005 K3, Malmo University
* @author: David Cuartielles, Marcus Hannerstig
* @hardware: David Cuartielles, Marcos Yarza
* @project: made for SMEE - Experiential Vehicles
*/
int data = 9; // PIN-es digitales de la placa conectados al chip
int strob = 8;
int clock = 10;
int oe = 11;
int count = 0; // Contador
int dato = 0; // Variable dato
void setup()
{
beginSerial(9600); // El puerto serie trabajrá a 9600 baudios
pinMode(data, OUTPUT); // Configuración de los PIN-es digitales
pinMode(clock, OUTPUT);
pinMode(strob, OUTPUT);
pinMode(oe, OUTPUT);
}
void PulseClock(void) {
digitalWrite(clock, LOW); // Procedimiento que emite un pulso de reloj
delayMicroseconds(20);
digitalWrite(clock, HIGH);
delayMicroseconds(50);
digitalWrite(clock, LOW);
}
void loop()
{
dato = 5; // 5 en binario es 00000101
for (count = 0; count < 8; count++) {
digitalWrite(data, dato & 01); // Obtiene el bit de más a la derecha (00000101 AND 00000001 = 00000001) y lo escribe en la entrada serie del chip
//serialWrite((dato & 01) + 48);
dato>>=1; // Desplaza un bit a la derecha de la variable dato (00000101 --> 00001010)
if (count == 7){ // Cuando ha enviado los 8 bits se lo indica al chip
digitalWrite(oe, LOW);
digitalWrite(strob, HIGH);
}
PulseClock(); // Envía un pulso de reloj
digitalWrite(oe, HIGH); // Le indica al chip que le ha enviado un bit
}
delayMicroseconds(20);
digitalWrite(strob, LOW);
delay(100);
serialWrite(10);
serialWrite(13);
delay(100);
}