thundervumeter

 #MAKE 

 14/06/14 

Un progetto molto semplice che è anche molto bello

Questo progetto nasce per caso facendo alcuni test con dei LED RGB e dei TLC5940 e, tra varie combinazioni e strani effetti di colore provati, ci è passato per la testa di collegare il jack audio al micro controllore per provare a sincronizzare i colori con la musica. Il risultato è sembrato subito ottimo, anche senza filtrare o amplificare il segnale audio, e siamo rimasti sorpresi da come questo progetto fosse così facile da realizzare e allo stesso tempo molto bello e interessante.
Finalmente siamo riusciti a pubblicare questa guida per tutte le persone che negli ultimi due anni, dopo aver visto i nostri video su YouTube, ci hanno scritto per capire come questo oggetto funziona e come realizzarlo.

Come funziona?

Il funzionamento del nostro ThunderVUmeter è estremamente semplice: il microcontrollore legge i valori analogici dei due canali audio e accende un numero di LED in proporzione al valore rilevato.
In realtà, per abbellire la cosa, abbiamo aggiunto anche una gestione dei colori che complica un po' il programma, infatti, utilizzando la libreria leOS2 di Leonardo Miliani abbiamo aggiunto una funzione che viene svolta parallelamente e con il compito di aggiornare i valori dei colori dei LED.

Hardware

Come già detto l'hardware è molto semplice, l'unica complicazione è che ci sono molti componenti da mettere insieme.
Dunque, vediamo quali sono i pezzi che abbiamo usato: un ATtiny84; tre TLC5940; 64 LED RGB ad anodo comune; un condensatore di medie dimensioni per stabilizzare la tensione che, nel nostro caso, arriva da un vecchio alimentatore ATX e che ha un po' di ripple; e cinque resistenze che, riferendoci allo schema qui sotto, sono R1 e R2 da 10k e R3, R4 e R5 da 1,5k.



Osservando il circuito vediamo che il jack audio (JP1) è collegato in modo da avere la massa in comune con il resto del circuito e i due canali sono collegati ai primi due ingressi analogici.
Per il controllo dei TLC5940 sono sufficienti 3 segnali che partono dal nostro piccolo ATtiny84, di cui 2 sono comuni a tutti i TLC mentre uno, il SIN, entra nel primo TLC che lo elabora e poi lo manda al TLC successivo, il SOUT.
L'ultima cosa importante da notare è che le resistenze R3, R4 e R5 servono per impostare la corrente massima che il TLC5940 potrà far passare sulle sue uscite, per maggiori informazioni a rigaurdo consultare il relativo datasheet.

Software

Andiamo dunque a descrivere la parte di codice utilizzata per gestire quanto accennato in precedenza. Innanzitutto serve avere la libreria leOS2 di Leonardo Miliani (non la leOS perché il TIMER 2 non c'è negli ATtiny) e la libreria che permette di controllare i TLC5940 con gli ATtiny84 e ATtiny85. Quest'ultima libreria è stata inizialmente creata dall'utente del forum di Arduino "Fungus" e successivamente modificata da noi per essere usata con gli ATtiny84 e può essere scaricata da qui.
Passiamo ora a esaminare alcuni punti chiave del codice, iniziando dalla funzione per spedire i dati ai TLC5940 "tlc5940.update()", che avevamo già spiegato nel progetto HeartThrob, e che ha la particolarità che dura circa un millisecondo e che solo durante questo periodo i LED sono accesi.
Un'altra cosa da notare nel codice è la parte di codice usata per fare l'auto-scale in funzione del volume della musica. Questo processo funziona in un modo molto semplice e intuitivo: se il valore letto è superiore a quello di fondo scala si incrementa il fondo scala; se, invece, i valori letti non si avvicinano al fondo scala per molto tempo, nel nostro caso due secondi, allora il valore di fondo scala viene ridotto.

#include <Arduino.h>
#include <Tiny_TLC5940.h>
#include <leOS2.h>
leOS2 OS;

#define MIN 20     //Minimum value to autoscale
#define K   1365
#define K2 819
#define T   3

unsigned long time=0;
byte ds=0;
unsigned int red=0, green=0, blue=4095, x=MIN;
unsigned int c[8][3]={0};

byte s=0;

void setup(){
  tlc5940.init();           //Initialize TLC5940s
  tlc5940.clear();
  tlc5940.update();

  for(byte er=0;er<8;er++)  //Set initial color values
    colors(); 

  OS.begin();
  OS.addTask(colors, T, SCHEDULED_IMMEDIATESTART); //Update color values every T*16 milliseconds
  
  x=MIN;
  time=0;
}

void loop(){
  if(millis()-time>2000){            //Auto-scale for lower values function
    x=(x-x/20<=MIN)?MIN:x-x/20;
    time=millis()-1700;
  }

  byte right = read(1);              //Read values
  byte left = read(0);

  tlc5940.clear();                   //Clear old values

  byte er=8-right;
  for(byte re=8-right;re<8;re++){    //Set the new values for right channel
    tlc5940.set(re*3, c[er][2]);
    tlc5940.set(re*3+1,c[er][0]);
    tlc5940.set(re*3+2,c[er][1]);
    er++;
  }
  
  er=7;
  for(byte re=8;re<8+left;re++){     //Set the new values for left channel
    tlc5940.set(re*3, c[er][2]);
    tlc5940.set(re*3+1,c[er][0]);
    tlc5940.set(re*3+2,c[er][1]);
    er--;
  }

  tlc5940.update();                  //Send data to TLC5940
}

byte read(boolean channel){
  unsigned int a=analogRead(channel);//Read the value of a channel

  while(a>x+x/9){                    //Auto-scale for higher values function
    x+=x/18;
    time=millis();
  }
  a=a>x?x:a;         

  return map(a,0,x,0,8);             //Calculate how many LEDs to turn on and return that value
}

void colors(){                       //Update color values
  for(byte er=0;er<7;er++){
    c[er][0]=c[er+1][0];
    c[er][1]=c[er+1][1];
    c[er][2]=c[er+1][2];
  }
  
  switch(ds){
  case 0: 
    if(red==4095)ds=(ds+1)%6; 
    else red+=K2; 
    break;
  case 1: 
    if(blue==0)ds=(ds+1)%6; 
    else blue-=K2; 
    break;
  case 2: 
    if(green==4095)ds=(ds+1)%6; 
    else green+=K2; 
    break;
  case 3: 
    if(red==0)ds=(ds+1)%6; 
    else red-=K2; 
    break;
  case 4: 
    if(blue==4095)ds=(ds+1)%6; 
    else blue+=K; 
    break;
  case 5: 
    if(green==0)ds=(ds+1)%6; 
    else green-=K; 
    break;
  }
  
  c[7][0]=red;
  c[7][1]=green;
  c[7][2]=blue;
}

Risultato

Ecco alcuni video del progetto descritto in questa pagina e di alcuni test fatti in precedenza (in ordine cronologico inverso):


CONTATTI

Al momento non abbiamo un uffico,
ma siamo spesso tra Padova e Vicenza.
Se avete bisogno di incontrarci,
contattateci e ci organizzeremo.

Di solito rispondiamo rapidamente, se non ricevete
alcuna risposta basta che mi rimandiate l'email
o che proviate un altro metodo.
Info@VicenzaThunders.com

Attenzione: se avete bisogno di chiamarci, vi
suggeriamo di spedirci un'email o un SMS prima
perché non siamo sempre disponibili.
Potete anche utilizzare WhatsApp se volete.
+393484808073
+393494548359

Potete trovarci su molti social network,
quando abbiamo tempo ci piace condividere
i nostri lavori e le nostre esperienze!