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);

}