Arduino abbassa il volume degli spot TV! [Fai-Da-Te]

volume

Ammettiamolo: la pubblicità in tv è davvero insopportabile. E non soltanto perchè interrompe un programma interessante o un bellissimo film o un documentario stimolante ma anche e soprattutto perché, i pubblicitari lo sanno: il volume è tutto. E per questo le trasmissioni televisive vengono trasmesse ad un volume che risulta poi più basso di quelli degli odiosi messaggi pubblicitari. E se a questo problema ci fosse una soluzione? Quello che vi presentiamo oggi è un progetto di telecomando intelligente che sfruttando Arduino vi permetterà di mantenere il volume al di sotto di un certo livello. Infatti in caso di spot pubblicitario il volume si abbasserà, per poi rialzarsi automaticamente all'inizio del film mantenendo quindi il volume costante secondo un livello da voi preimpostato. Il progetto è disponibile completamente open source, sia hardware che software ed io sono disponibile nei commenti per seguirvi nella realizzazione.

Introduzione

Qualche tempo fa, su queste pagine, pubblicammo un articolo che parlava di una possibile soluzione al problema degli spot televisivi dal volume decisamente troppo invadente. La sua pubblicazione andò ad aggiungersi alle tante per le quali realizzammo il concorso Make4Cash. Il progetto, nella sua fase primaria, quindi il prototipo, è ora completo.
Le considerazioni preliminari da fare che danno vita a questo progetto sono le stesse che vennero fatte proprio nell'articolo di presentazione del concept: gli spot televisivi, ma spesso anche alcune porzioni dei film d'azione, alcune scene, sono davvero fastidiosi. Potrebbe essere utile ed interessante realizzare un sistema che sia in grado di gestire in maniera intelligente queste situazioni, di fatto realizzando un equalizzazione con il volume che di solito viene considerato accettabile ovvero quello del parlato o di scene comunque non altrettanto movimentate oppure appariscenti.
E' da queste idee e con queste premesse che nasce il progetto che fu presentato all'epoca e che oggi è completo funzionante. Ha subito alcune modifiche, è stato rivisto e pesantemente ottimizzato ed è per questo che ora lo proponiamo.

Come funziona

Il funzionamento di questo progetto è abbastanza semplice dal momento che è dotato di un microfono, un pulsante, due LED e poco più. Il principio di funzionamento è semplicemente un meccanismo a soglia che rilevi il volume attuale, lo compari con un valore di confronto ed agisca di conseguenza. Se siamo sopra la soglia prestabilita di rumorosità accettabile, il sistema deve inviare il comando per abbassare il volume mentre in caso contrario per alzarlo.
Nell'immagine di copertina, un test fatto sulla riproduzione di un file audio qualsiasi, per darvene una breve dimostrazione.
Tutto questo deve essere fatto mantenendo il dispositivo il più vicino possibile alla cassa del televisore. Una delle caratteristiche di questo progetto è proprio la sensibilità del microfono che viene ottimizzata mantenendo il dispositivo non più lontano di 5 cm dalla cassa. Sono state fatte diverse prove durante la realizzazione del progetto e vale la pena di anticipare adesso che, naturalmente, minore è la distanza migliore è stato il risultato e la capacità del progetto di seguire le variazioni e l'andamento del livello del volume nel corso del tempo. Vi consigliamo, pertanto, se sceglierete di provare a cimentarvi in questa sfida, di partire da queste distanze così come vi consigliamo di partire da questo hardware per poi, eventualmente, modificarlo.

Cosa fare

Prima di poter partire con la realizzazione del codice ed il test è necessario compiere alcuni passi per ottimizzare i tempi. La prima cosa che serve è l'acquisizione dei comandi. Come nel mio caso, il televisore non gestisce il protocollo RC5 o RC6 e per questo motivo, dopo diverso tempo, è stato necessario pensare di ricostruire la forma d'onda a mano.
Una volta fatto questo, che verrà descritto più avanti, si è passati alla realizzazione del circuito partendo dallo schematico che vedrete tra un attimo.
Scritto il programma, poi, tutto ha funzionato per il meglio.
Quindi per prima cosa bisogna studiare qual è l'hardware di cui si ha bisogno, scrivere la BOM, stilare lo schematico, lavorare sui codici ad infrarosso, scrivere il programma ed effettuare i vari test.
Bene, ora che abbiamo le idee chiare su che cosa dobbiamo fare, facciamolo!

L'hardware

Non c'è progetto senza l'hardware di riferimento. Ed ecco che cosa vi occorre:
  • 1 microfono Electret;
  • 2 resistenze da  100 Ohm;
  • 6 resistenze da  1 kOhm;
  • 1 resistenza da  10 kOhm;
  • 1 resistenza da  110 kOhm;
  • 1 resistenza da  220 kOhm;
  • 1 condensatore da 220 uF;
  • 1 condensatore da 4.7 nF;
  • 3 condensatori da 10 nF;
  • 1 LM324N (Quad OpAmp);
  • 1 pulsante;
  • 1 diodo LED IR;
  • 1 ricevitore IR 38 kHz (TSOP2236);
  • 1 Arduino;
  • fili vari.

Una piccola osservazione: l'alimentazione per il funzionamento di questo progetto è stata sempre prelevata tramite l'USB del computer. Se dobbiamo pensare di renderlo autonomo, certamente servirà un'alimentazione dedicata e quindi una batteria.

Una volta che e stata realizzata la connessione del microfono, serve subito lavorare sull'audio e per fare questo è stato usato un filtro in configurazione Sallen Key del second'ordine. Utilizzeremo delle immagini per farvi vedere come siamo andati avanti nella realizzazione ma in generale sappiate che quello che non trovate qui nell'articolo esplicitamente riportato è contenuto negli allegati che troverete più avanti. In ogni caso, state tranquilli: la documentazione è completa.
Dicevamo della sezione audio, la quale, tramite la sezione di filtraggio e amplificazione, ci conduce direttamente ad uno degli ingressi di Arduino.
Una volta fatto questo non abbiamo finito perché bisogna creare circuiti di condizionamento per tutta la sezione che gestisce gli infrarossi. Ed eccoli:
Che, messo in pratica e realizzato, vien fuori così:
E non è ancora tutto perché abbiamo detto che abbiamo bisogno di un pulsante. Ecco come è stato collegato
Una volta realizzate tutte queste connessioni e alcuni dei risultati che abbiamo ottenuto utilizzando l'oscilloscopio:
L'oscilloscopio inizia a mostrare ben altre forme d'onda, nel corso dei test e piano piano si distingue sempre più chiaramente ciò che è rumore da ciò che non lo è:
Nell'immagine che avete appena visto, è stato riportato l'audio registrato dal microfono ascoltando dei suoni.
(fai click sull'immagine per ingrandirla)
Per iniziare i test, è stato realizzato un semplice filtro passa-basso (metà del Sallen Key)
Assemblato il prototipo, e verificato il funzionamento
realizzato il Sallen Key del secondo ordine
Il tutto è stato assemblato opportunamente a dare il prototipo completo.
Bene, ora l'hardware è pronto.

Scopriamo i codici

Devo, per poter fare in modo che tutto funzioni, scoprire come sono fatte le forme d'onda in uscita dal telecomando in corrispondenza dei due che dovrà essere in grado di inviare cioè l'abbassamento e l'innalzamento del volume. Per fare questo è stato utilizzato il seguente codice con cui programmare Arduino.
#include <IRremote.h>

int ricevitore = 10; // al pin 10 è connesso il ricevitore IR
IRrecv irrecv(receiver); // crea l'istanza 'irrecv' come da libreria
decode_results results;

void setup()
{
  Serial.begin(9600); // Il debug dell'applicazione vien fatto da seriale
  irrecv.enableIRIn(); // Inizializza il ricevitore
  pinMode(10, INPUT); // Il pin 10 serve come input
}

void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
    Serial.println(results.value, HEX); // mostra il codice sulla seriale in esadecimale
    irrecv.resume(); // riceve il valore successivo
  }
}
Questo corrisponde ad una configurazione molto semplice in cui il ricevitore ad infrarossi è collegato direttamente da Arduino grazie all'utilizzo di semplici resistenze condensatori.
Parlando dei codici che sono stati ricevuti, eccoli:
vol +:
68733A46 (HEX), 
0110 1000 0111 0011 0011 1010 0100 0110 (BIN), 
1752382022 (RAW)
vol -:
83B19366 (HEX), 
1000 0011 1011 0001 1001 0011 0110 0110 (BIN), 
2209452902 (RAW)
È possibile che i codici ottenuti debbano essere rivisti dal momento che la notazione esadecimale non va bene ed infatti sono stati riportati sia con la notazione esadecimale sia in binario sia in formato grezzo.
È evidente che i dati raw servono a poco se non esiste un metodo univoco per l'interpretazione ma invece convertire in binario ha diversi vantaggi, non ultimo il fatto che sull'oscilloscopio si vedono i bit!
Ecco per quale motivo è stato importante cercare un metodo per effettuare una conversione da esadecimale a binario e, tanto per utilizzare un esempio che noi abbiamo già fatto ecco un paio di comandi in MATLAB che sicuramente vi faranno raggiungere lo scopo, se lo avete a disposizione.
bin_str = dec2bin(hex2dec(hex_str))
se facessimo un esempio potremmo scrivere
hex_str = 'AF5'
bin_str = dec2bin(hex2dec(hex_str))
bin_str = 101011110101
Simpatico, non trovate?
Utilizzando la sonda dell'oscilloscopio sul pin d'uscita è stato possibile scoprire com'erano fatte le forme d'onda.
E qui è cominciato il lavoro più impegnativo, ovvero la ricostruzione delle stesse.
La libreria che è stata impiegata, in mera teoria, sarebbe stata capace di garantirmi l'utilizzo di semplici vettori all'interno dei quali inserire i dati corrispondenti ai bit ma con questa configurazione di dati grezzi non è stato possibile. Lascio ai lettori il compito di verificarne la funzionalità.
Per quanto riguarda il supporto, la libreria è in grado di gestire diversi protocolli di comunicazione tra cui quelli proprietari di aziende come NEC e Panasonic ma anche RC5 ed RC6. Esistono diverse funzioni definite all'interno della libreria che permettono alla stessa di funzionare in maniera egregia. Ciò nondimeno, dal momento che il televisore a disposizione non rientrava in questa casistica, non ho potuto provarlo direttamente ma consiglio a voi di farlo.

Il codice

A questo punto tutto ciò che manca è la stesura del codice, sapendo che per la lettura del livello del volume sarà sufficiente scrivere un comando del tipo:
void setup() {
  Serial.begin(9600);
}

void loop() {
  int livello = analogRead(A0);
  Serial.println(livello); // Lavoro con i valori assoluti
  float tensione = livello * (5.0 / 1023.0);
  Serial.println(tensione); // Corrispondente livello di tensione
  delay(500);
}
e che poco altro sarà davvero indispensabile per la funzionalità completa del programma (lo trovate in allegato).
Naturalmente il codice proposto è certamente perfettibile. Bisogna ottimizzarlo e sicuramente è indispensabile costruire le forme d'onda in maniera diversa, lavorando con la libreria in maniera tale da renderla compatibile con tanti formati diversi, anche quelli non standard. In questo modo la si può "universalizzare" ed utilizzare in qualsiasi altro caso.
Vale la pena di osservare che la soglia di rumorosità viene impostata ad un valore compreso fra 0 e 1023 dal momento che l'ADC disponibile su Arduino è a 10 bit.

Conclusioni

Bene,siamo in chiusura. Avete visto che tutto sommato è stato abbastanza semplice realizzare questo progetto. Lo schema di funzionamento è piuttosto elementare, l'hardware in gioco non è particolarmente costoso e le configurazioni sono, tutto sommato, standard. La parte più interessante sulla quale lavorare è stata l'acquisizione dei segnali, che ha portato via diverso tempo dal momento che, nel mio caso specifico, il protocollo si è rivelato piuttosto particolare.
Ad ogni modo, esistono certamente diversi margini di miglioramento per questo progetto che possono renderlo, in definitiva, molto più completo.
Sono a disposizione nei commenti per rispondere ad ogni eventuale domanda ed eventualmente guidarvi nella realizzazione di questo progetto.

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

34 Comments

  1. AntonioBlescia AntonioBlescia 26 novembre 2013
  2. Piero Boccadoro Piero Boccadoro 26 novembre 2013
  3. Radionova22 26 novembre 2013
  4. Marven 26 novembre 2013
  5. IvanScordato Ivan Scordato 26 novembre 2013
  6. alex272 alex272 26 novembre 2013
  7. Radionova22 26 novembre 2013
  8. Radionova22 26 novembre 2013
  9. Piero Boccadoro Piero Boccadoro 27 novembre 2013
  10. LoryD 27 novembre 2013
  11. Emanuele Emanuele 27 novembre 2013
  12. Emanuele Emanuele 27 novembre 2013
  13. Piero Boccadoro Piero Boccadoro 27 novembre 2013
  14. Piero Boccadoro Piero Boccadoro 27 novembre 2013
  15. AntonioBlescia AntonioBlescia 27 novembre 2013
  16. joshua.tosimori 27 novembre 2013
  17. Piero Boccadoro Piero Boccadoro 27 novembre 2013
  18. andr.rac.9 28 novembre 2013
  19. Marven 28 novembre 2013
  20. Piero Boccadoro Piero Boccadoro 28 novembre 2013
  21. Marven 28 novembre 2013
  22. Radionova22 28 novembre 2013
  23. MichelePennisi 19 dicembre 2013
  24. Radionova22 19 dicembre 2013
  25. Piero Boccadoro Piero Boccadoro 19 dicembre 2013
  26. Piero Boccadoro Piero Boccadoro 19 dicembre 2013
  27. Piero Boccadoro Piero Boccadoro 19 dicembre 2013
  28. Radionova22 19 dicembre 2013
  29. Piero Boccadoro Piero Boccadoro 20 dicembre 2013
  30. Radionova22 20 dicembre 2013
  31. mr-miky 23 dicembre 2013
  32. Giorgio B. Giorgio B. 9 gennaio 2014
  33. Piero Boccadoro Piero Boccadoro 9 gennaio 2014
  34. MrRaulPeeDeeJay 23 dicembre 2014

Leave a Reply

Flip&Click Arduino e Python compatibile

Fai un abbonamento Platinum (EOS-Book + Firmware), ricevi in OMAGGIO la nuova Flip&Click, inviaci il tuo progetto e OTTIENI IL RIMBORSO