Descrición:

Se non tes problemas de pins dispoñibles na túa placa non necesitarás isto, pero se queres engadir moitos LEDs ao teu proxecto consumirás enseguida os pins dixitais do Arduíno e non quedarán para poder conectar outras cousas. Utilizar un rexistro de desprazamento vainos permitir aforrar pins de Arduíno.
Se non tes problemas de pins non te compliques, pasa desta sección e traballa como fixeches ata agora.
Rexistro de desprazamento:

- É capaz de almacenar un conxunto de n bits.
- Permite realizar a conversión de datos de serie a paralelo e viceversa.
Nós imos utilizar o 74HC595 (Shift Register de 8 bits serial-in, parallel-out) para cargar datos en serie e que o rexistro os vaia cargando nas saídas en paralelo. Con isto aforramos pins do Arduíno pois con só tres pins podemos controlar 8 saídas dixitais.
Montaxe:

Hai tres pins importantes que conectaremos á placa Arduíno, no noso caso conectámolos aos pins 8, 11 e 12:
- DATA IN ou DS: pin para enviar los bits en serie
- Clock ou SH_CP: indica cando hai que ler o bit.
- LATCH ou ST_CP: Cando os 8 bits de entrada se leron no rexistro, o LATCH escribe estes bits nos pins de saída do chip e mantenos ata que se reciban novos datos.
Os LEDs coas súas resistencias de protección irán nos pins 15, 1, 2, 3, … 7 (os marcados na figura como a, b, c, etc.). Utilizamos 8 LEDs
Programa:
Para enviar os datos ao rexistro imos utilizar a función
shiftOut(dataPin, clockPin, LSBFIRST, n);
- n é o número que imos enviar. Se n=1 envía 00000001, se n=7 envía 00000111, se n=255 envía 11111111 etc. É dicir, hai que indicar o equivalente ao binario que se quere mostrar.
- LSBFIRST indica que enviamos o número binario empezando polo menos significativo. Se n=7 (00000111) mostra 00000111
- MSBFIRST indica que enviamos o número binario empezando polo máis significativo. Se n=7 (00000111) mostra 11100000
Tamén usaremos os operadores de desprazamento lóxico:
- a<<n Despraza o número “a” n bits cara á esquerda. Por exemplo, 1<<2 despraza o número 00000001 dous lugares cara á esquerda, quedando 00000100
- a>>n Despraza o número “a” n bits cara á dereita. Por exemplo, 128>>1 despraza o número 10000000 un lugar cara á dereita, quedando 01000000
Neste programa podes ver varios modos de funcionamento:
// Declaración de variables:
int latchPin = 8 ; //Pin ST_CP do 74HC595 - Escritura na saída
int clockPin = 12; //Pin SH_CP do 74HC595 - Reloxo
int dataPin = 11; //Pin DS do 74HC595 - Datos
// Configuración:
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
// Programa:
void loop() {
// Programa que envía bytes determinados
digitalWrite(latchPin, LOW) ; // Latch a LOW mentres introducimos os datos
shiftOut(dataPin, clockPin, LSBFIRST, 7); // Enviamos 7 (00000111) LSBFIRST -> queda 00000111
digitalWrite(latchPin, HIGH) ; // Latch a HIGH fixa os valores na saída
delay(1000);
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, MSBFIRST, 7); // Enviamos 7 (00000111) MSBFIRST -> queda 11100000
digitalWrite(latchPin, HIGH) ;
delay(1000);
// Programa que representa nos LEDs os números binarios de 0 a 256
for (int n = 0; n <= 256; n++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, n); // Aquí introducimos o número
digitalWrite(latchPin, HIGH) ;
delay(100);
}
// Programa que despraza un byte cara á esquerda
for (int i = 0; i < 9; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, 1<<i); // Despraza 00000001 cara á esquerda
digitalWrite(latchPin, HIGH) ;
delay(300);
}
// Programa que despraza un byte cara á dereita
for (int i = 0; i < 9; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, MSBFIRST, 1<<i); // Despraza 10000000 cara á dereita
digitalWrite(latchPin, HIGH) ;
delay(300);
}
// Programa que despraza un byte (7=00000111) cara á esquerda
for (int i = 0; i < 6; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, 7<<i); // Despraza 00000111 (7) cara á esquerda
digitalWrite(latchPin, HIGH) ;
delay(500);
}
// Programa que despraza un byte (224=11100000) cara á dereita
for (int i = 0; i < 6; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, 224>>i); // Despraza 11100000 (224) cara á dereita
digitalWrite(latchPin, HIGH) ;
delay(500);
}
// Programa que vai apagando leds cara á esquerda
for (int i = 0; i < 9; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, 255<<i); // Despraza 11111111 (255) cara á esquerda
digitalWrite(latchPin, HIGH) ;
delay(300);
}
// Programa que vai apagando leds cara á dereita
for (int i = 0; i < 9; i++) {
digitalWrite(latchPin, LOW) ;
shiftOut(dataPin, clockPin, LSBFIRST, 255>>i); // Despraza 11111111 (255) cara á dereita
digitalWrite(latchPin, HIGH) ;
delay(300);
}
}
Propostas:
- Fai os teus xogos de luces co rexistro de desprazamento.
Recurso:
Se necesitas axuda para converter de binario a decimal e viceversa pode resultarche útil esta aplicación feita con Scratch:
[Scratch: Convertedor de sistemas de numeración]