Indice
Descrizione
In questo episodio del tutorial di Arduino impareremo a utilizzare gli shift register. Vedremo come collegarli in modo da aumentare il numero di pin digitali della scheda di Arduino e realizzeremo alcuni esempi di giochi di luce con dei LED.
Vedremo inoltre come possono essere collegati a cascata in modo da offrire molte più uscite digitali senza incrementare ulteriormente l'utilizzo dei pin di Arduino.
#define DATA_PIN 4
#define LATCH_PIN 3
#define CLOCK_PIN 2
void setup(){
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
}
void loop(){
animation1(70);
animation2(70);
}
void writeRegister(byte value){
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
digitalWrite(LATCH_PIN, HIGH);
}
void animation1(unsigned int animationDelay){
for(int i = 0; i < 8; i++){
writeRegister(0x1 << i);
delay(animationDelay);
}
for(int i = 0; i < 8; i++){
writeRegister(0x80 >> i);
delay(animationDelay);
}
}
void animation2(unsigned int animationDelay){
byte value = 0x1;
for(int i = 0; i < 8; i++){
writeRegister(value);
value = (value << 1) + 1;
delay(animationDelay);
}
for(int i = 0; i < 8; i++){
writeRegister(value);
value = value >> 1;
delay(animationDelay);
}
}
#define DATA_PIN 4
#define LATCH_PIN 3
#define CLOCK_PIN 2
void setup(){
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
}
void loop(){
animation1(50);
animation2(50);
}
void writeRegister(unsigned int value){
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value >> 8);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
digitalWrite(LATCH_PIN, HIGH);
}
void animation1(unsigned int animationDelay){
for(int i = 0; i < 16; i++){
writeRegister(0x1 << i);
delay(animationDelay);
}
for(int i = 0; i < 16; i++){
writeRegister(0x8000 >> i);
delay(animationDelay);
}
}
void animation2(unsigned int animationDelay){
unsigned int value = 0x1;
for(int i = 0; i < 16; i++){
writeRegister(value);
value = (value << 1) + 1;
delay(animationDelay);
}
for(int i = 0; i < 16; i++){
writeRegister(value);
value = value >> 1;
delay(animationDelay);
}
}