Spectrum shield come accendere diversi led a ritmo di musica
Un progetto che ha sempre attirato molta attenzione è il circuito VU meter sincronizzato con il ritmo della musica (il mitico luci psichedeliche ). Anche io quando ero alle superiori mi sono cimentato costruendone uno. Il circuito era formato da tre filtri analogici, uno passa basso uno passa banda e uno passa alto, che lavoravano rispettivamente alle frequenze 0-500Hz, 500Hz 4000Hz e 4000Hz-16000Hz. All’uscita dei filtri c’era un rilevatore di picco costruito con un operazionale che andava a pilotare dei driver che accendevano delle lampadine colorate.
Oggi la tecnologia offre prodotti integrati a basso costo, specializzati in una vasta gamma di compiti che rendono più semplice la realizzazione dei nostri circuiti. Per quanto riguarda le nostre luci psichedeliche possiamo fa affidamento allo Spectrum shield per Arduino. Lo shield è molto semplice ed è composto principalmente da due integrati MSGEQ7 (Equalizzatore grafico a 7 bande). Lo schema a blocchi dell’integrato è il seguente:
si osserva che in effetti il principio di funzionamento è molto simile a quello che si usava nei primi circuiti a luci psichedeliche, ma i filtri a disposizione sono ben 7 e le uscite dei filtri vengono multiplexate, in questo modo invece di avere 7 pin di output ne abbiamo solamente uno.
Inviando un primo impulso positivo al pin strobe avremmo in uscita il valore analogico proveniente dal filtro a 63Hz, inviandone un altro impulso avremmo in uscita il valore analogico del filtro a 160Hz e così via fino a tornare dopo 8 impulsi al filtro a 63Hz.
I due integrati MSGEQ7 presenti nello spectrum shield analizzano il segnale audio proveniente dal canale destro e dal canale sinistro. Per brevità utilizzerò un solo integrato (canale) visto che il codice è interscambiabile.
Le uscite analogiche dei due integrati sono collegate ai pin A0 e A1 mentre i pin Strobe e Reset sono collegati ai pin digitali D4 e D5.
Questo è il codice:
[c]
//Specifica i pin Reset, Strobe
int spectrumReset=5;
int spectrumStrobe=4;
//Specifico il canale di ingresso
//pin A0 per canale destro
//pin A1 per canale sinistro
int spectrumAnalog = 1; //canale sinistro
//creo un vettore per contenere i valori analogici
//delle 7 bande
int Spectrum[7];
void setup()
{
//pin reset e strobe in output
pinMode(spectrumReset, OUTPUT);
pinMode(spectrumStrobe, OUTPUT);
//inizializzo lo spectrum shield
//Strobe
digitalWrite(spectrumStrobe,HIGH);
delay(1);
digitalWrite(spectrumStrobe,LOW);
delay(1)
//Reset dei due chip
digitalWrite(spectrumReset,HIGH);
delay(1);
digitalWrite(spectrumReset,LOW);
delay(5);
//definisco 7 uscite digitali per pilotare altrettanti led
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void loop()
{
//esegui la lettura ogni 10mS
readSpectrum();
delay(10);
}
void readSpectrum()
{
//Questa funzione legge il valore analogico per ogni banda
//e ne rappresenta il valore tramite dei led
byte Band;
//questo ciclo for viene eseguito 7 volte
for(Band = 0; Band < 7; Band++)
{
//eseguo due letture per poi dividerle per due tramite
//spostamento di bit. Il valore ottenuto viene memorizzato
//nel vettore
Spectrum[Band] = (analogRead(spectrumAnalog) + analogRead(spectrumAnalog) ) >>1;
//invio un impulso al pin strobe per passare al filtro successivo
digitalWrite(spectrumStrobe,HIGH);
digitalWrite(spectrumStrobe,LOW);
}
//una volta effettuata la memorizzazione dei dati
//nel vettore, creo un altro ciclo for
//per rappresentare gli stessi tramite led
for (byte Ciclo = 0; Ciclo < 7; Ciclo++)
{
//recupero il valore memorizzato nel vettore
//traslo il valore intero in un byte
byte x = map(Spectrum[Ciclo], 0, 1023, 1, 254);
//se il valore supera una soglia accendi il led
//altrimenti spegnilo
if( x > 120)
digitalWrite(Ciclo + 6 , HIGH);
else
digitalWrite(Ciclo + 6, LOW);
}
}
[/c]
Mentre questo è il circuito elettrico
Per poter collegare delle lampade a 220Vac è necessario usare dei triac con relativo stadio pilota fotoisolato.