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]