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
¿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.
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.