Il semplice controllo di un potenziometro motorizzato basato su Arduino

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
  }

Subscribe
Notificami
guest

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

6 Commenti
Inline Feedbacks
View all comments
AleD
AleD
2 anni fa

ma lo step minimo per piccoli ritocchi al volume non può essere eccessivo con diffusori ad alta sensibilità?

AleD
AleD
2 anni fa

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

Stefano Cairoli
Stefano Cairoli
2 anni fa

Interessante e utile – inoltre sei tra i pochi che commentano bene la list del programma. Complimenti!