Arduino gestione scheda relè shift register

Forum dedicato alla piattaforma Arduino e ai relativi progetti.
Risoluzioni di problemi hardware/software e realizzazione di progetti.
Rispondi
Avatar utente
mae89
Messaggi: 1333
Iscritto il: 22/12/2010, 10:25
Distribuzione: Fedora
Kernel: 3.16.9
Architettura: x86_64
Contatta:

Arduino gestione scheda relè shift register

Messaggio da mae89 » 27/04/2017, 20:11

Ciao a tutti,

utilizzando solo 3 pin di Arduino possiamo pilotare fino a 8 uscite totali grazie ad uno shift register.
Ne avevamo già parlato sul sito vecchio, e prossimamente ne parleremo anche sul nuovo portale. Questo topic funge da raccoglitore di idee per l'articolo/guida.

Il seguente sketch permette di azionare singolarmente ogni relè con tempo di 1 secondo.
R1, R2, R3, R4, R5, R6, R7, R7 corrispondono ai relé. Per azionare più relè in contemporanea ci basta fare quattro conti in binario e creare nuove variabili. Il limite è legato alla max corrente disponibile.

Codice: Seleziona tutto

//Il pin8 viene usato per abilitare la scrittura
//sullo shift register
int Abilitazione = 8;
//il pin11 viene usato per inviare il dato
int UscitaDatoSeriale = 11;
//Il pin12 viene usato per generare il clock
int DataClock = 12;

//variabile che contiene il dato da scrivere sullo
//shift register
byte R1 = 0b01111111;
byte R2 = 0b10111111;
byte R3 = 0b11011111;
byte R4 = 0b11101111;
byte R5 = 0b11110111;
byte R6 = 0b11111011;
byte R7 = 0b11111101;
byte R8 = 0b11111110;
int tempo = 1000;


void setup()
{
//Setto i pin come uscite
pinMode(Abilitazione, OUTPUT);
pinMode(DataClock, OUTPUT);
pinMode(UscitaDatoSeriale, OUTPUT);
}

void loop()
{

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R1);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R2);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R3);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R4);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R5);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R6);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R7);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, R8);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);
}


Chi dice di non essere capace è perché probabilmente non ha mai provato.

Avatar utente
mae89
Messaggi: 1333
Iscritto il: 22/12/2010, 10:25
Distribuzione: Fedora
Kernel: 3.16.9
Architettura: x86_64
Contatta:

Re: Arduino gestione scheda relè shift register

Messaggio da mae89 » 28/04/2017, 16:35

Miglioramento del codice: basta modificare la voce "attivazione" inserendo la somma dei relè che si vogliono attivare. A questa somma va aggiunto il numero di relè attivati meno 1.

Esempio 1: per attivare i relè R1 e R4 la variabile attivazione sarà R1+R4+1

Esempio 2: per attivare i relè R1, R4, R5 la variabile attivazione sarà R1+R4+R5+2

Esempio 3: per attivare i relè R1, R4, R5 la variabile attivazione sarà R1+R2+R3+R4+R5+R6+5

Codice: Seleziona tutto

//Il pin8 viene usato per abilitare la scrittura
//sullo shift register
int Abilitazione = 8;
//il pin11 viene usato per inviare il dato
int UscitaDatoSeriale = 11;
//Il pin12 viene usato per generare il clock
int DataClock = 12;

//variabile che contiene il dato da scrivere sullo
//shift register

byte R1 = 0b01111111;
byte R2 = 0b10111111;
byte R3 = 0b11011111;
byte R4 = 0b11101111;
byte R5 = 0b11110111;
byte R6 = 0b11111011;
byte R7 = 0b11111101;
byte R8 = 0b11111110;
int tempo = 5000;

byte attivazione = R6 + R2 +1;

//REGOLA: sommo i relè da attivare + n°relé selezionati -1

void setup()
{
//Setto i pin come uscite
pinMode(Abilitazione, OUTPUT);
pinMode(DataClock, OUTPUT);
pinMode(UscitaDatoSeriale, OUTPUT);
}

void loop()
{

//abilita la scrittura
digitalWrite(Abilitazione, LOW);
//invia il dato
shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, attivazione);
//Disabilita scrittura
digitalWrite(Abilitazione, HIGH);
//ritardo
delay(tempo);

}
Chi dice di non essere capace è perché probabilmente non ha mai provato.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite