Su internet si trovano tante schedine per il controllo del volume tramite potenziometro motorizzato e telecomando infrarossi, unica questione è che sono “as is” il numero di canali gestito è preimpostato e non mutabile, altre funzioni non sono contemplate. Pubblico qui un piccolo e semplicissimo progetto basato su arduino che si limita ad abbassare o alzare il volume di un potenziometro motorizzato in base alla pressione di 2 tasti su un telecomando infrarossi con il sorgente del programma di controllo.
La base di questo progettino però potrebbe tornare utile all’autocostruttore in quanto è completamente espandibile e modificabile a piacere, quindi ad esempio si potrebbero aggiungere funzioni quali timer per ritardi dell’anodica, controllo di sensori o pilotaggio di led o display, selezione degli ingressi e tante altre funzioni a piacimento e a totale discrezione dell’utente, al contrario di quelle schedine che si comprano già fatte alle quali non è possibile apportare nessuna modifica.
Questo è lo schema base
Il PCB
Per scaricare schema e PCB cliccare qui… vol-control.zip
Il telecomando utilizzato è questo qui, che sono riuscito a comprare anche sfuso…
Qui sotto il programma sorgente:
/* Controllo potenziometro motorizzato con telecomando life ricevitore TSOP13238 usare libreria IRRemote 2.8.0 - Driver motore L293D */
/* Codice by Stefano Bianchini - distribuito sotto licenza LGPL */
#include
// Definizione dei pin connessi ai vari controlli
#define vol_up 5
#define vol_down 6
#define power_led 13
// Fine definizione dei pin
#define nbdelay 12288 // Timer non bloccante per fludita' motore del volume
int RECV_PIN = 8;
unsigned char vol = 0;
unsigned int timer = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
int ir_mon() // Slampeggia il led power
{
digitalWrite(power_led, LOW);
delay(50);
digitalWrite(power_led, HIGH);
}
void setup()
{
pinMode(power_led, OUTPUT); // Led Power
pinMode(vol_up, OUTPUT); // vol+
pinMode(vol_down, OUTPUT); // vol-
irrecv.enableIRIn(); // Start the receiver
digitalWrite(power_led, HIGH);
}
void dump(decode_results *results) {
int count = results->rawlen;
if (results->value == 0xE68D78A4 && vol == 0) // Tasto Vol +
{
ir_mon();
vol = 1;
}
if (results->value == 0xE68D78A4 && vol == 1) // Tasto Vol + con pot in marcia
{
ir_mon();
timer = 0;
}
if (results->value == 0x255F0A94 && vol == 0) // Tasto Vol -
{
ir_mon();
vol = 2;
}
if (results->value == 0x255F0A94 && vol == 2) // Tasto Vol - con pot in marcia
{
ir_mon();
timer = 0;
}
}
void loop() {
// Lettura Infrarossi
if(irrecv.decode(&results))
{
dump(&results);
irrecv.resume(); // Receive the next value
}
// funzione per rendere fluido l'andamento del volume con timer non bloccante
if(vol == 1 && timer < nbdelay)
{
digitalWrite(vol_up, HIGH);
timer ++;
}
if(vol == 2 && timer < nbdelay)
{
digitalWrite(vol_down, HIGH);
timer ++;
}
if(timer >= nbdelay)
{
digitalWrite(vol_up, LOW);
digitalWrite(vol_down, LOW);
vol = 0;
timer = 0;
}
// Fine funzione timer non bloccante
}
fallo, provalo e poi mi dici
ma lo step minimo per piccoli ritocchi al volume non può essere eccessivo con diffusori ad alta sensibilità?
nbdelay ? non serve con quel valore gira tutto fluidamente
e usare un ingresso analogico per leggere un valore impostato via trimmer in sostituzione della costante che definisce quanto dura l’impulso di comando del volume? così viene più veloce e comodo da tarare
Pensavo che dovrei pubblicare il codice di un programmino per catturare gli esadecimali ricevuti dal ricevitore IR così uno cattura i tasti di un qualsiasi telecomando per poterlo poi usare.
Interessante e utile – inoltre sei tra i pochi che commentano bene la list del programma. Complimenti!