Potenziometri digitali: diventa un mago in 10 minuti

Cosa sono i potenziometri digitali? Prima di rispondere a questa domanda dobbiamo farcene una più semplice.

Quiz: cosa sono trimmer e potenziometri?

Oltre alle resistenze a salsicciotto con tutte quelle striscioline strane, che hanno valori fissi, esistono delle resistenze variabili per le quali possiamo impostare il valore ruotando una manopola, un po’ come regoliamo la quantità di acqua che esce dai rubinetti.

potenziometri
Un trimmer (sulla sinistra) e un potenziometro (sulla destra)

Ce ne sono di due tipi:

  • i potenziometri si usano quando abbiamo la necessità di modificare la resistenza di frequente, ad esempio alzare o abbassare (abbassare? l’ho scritto veramente?) il volume dello stereo;
  • i trimmer invece si usano quando la regolazione viene fatta raramente, tipicamente con un cacciavite, ad esempio per i sensori di luminosità sulle lampade crepuscolari.

Entrambi hanno tre piedini: possiamo usarne solo due, ottenendo quindi una semplice resistenza variabile, oppure tutti e tre, per cerare un partitore di tensione (presto su questi schermi).

Ci sono anche moltissimi componenti che si comportano come resistenze variabili: sono i sensori più semplici, come le fotoresistenze, i sensori di forza e flessione e così via.

38 esperimenti per imparare subito a usare i sensori con Arduino e Raspberry Pi

Ci sono però alcuni casi in cui nessuno di questi due componenti va bene: come faremmo se dovessimo variare una luce in modo regolare, o se volessimo suonare una melodia collegando il caro vecchio 555 a uno speaker? Farlo a mano sarebbe molto scomodo, e probabilmente i risultati lascerebbero alquanto a desiderare.

Per fortuna c’è una soluzione.

Potenziometri digitali, questi sconosciuti (ma non per molto)

potenziometro digitale MCP41010
Un potenziometro digitale MCP41010

I potenziometri digitali sono dei componenti che nascondono al loro interno una serie di resistenze che vengono attivate grazie a particolari segnali inviati da un microcontrollore come Arduino. Oggi parleremo del modello MCP41xxx, un prodotto semplice con un solo potenziometro, ma esistono modelli con diversi potenziometri, che ci consentono di controllare più uscite in modo indipendente. Il protocollo, cioè l’insieme di regole utilizzate per la comunicazione, si chiama SPI, che sta per Serial Peripheral Interface: ne parleremo in un articolo dedicato. Per ora ci basti sapere che in un circuito di questo tipo abbiamo un dispositivo master (nel nostro caso Arduino) e uno o più dispositivi slave (nel nostro caso il potenziometro digitale MCP41xxx), che comunicano utilizzando quattro pin. I pin standard per usare SPI su Arduino sono i pin 11, 12 e 13. Per il quarto pin si può usare quello che si vuole, ma per comodità e convenzione si usa il 10 che è vicino agli altri. Proviamo a montare un semplicissimo circuito utilizzando un LED come output.

Potenziometro digitale - circuito
Un semplice circuito per provare un potenziometro digitale con un LED

Per aumentare o diminuire la resistenza dobbiamo inviare un comando: andando a vederci il datasheet scopriamo che è necessario settare il pin CS LOW, inviare un comando e i dati necessari ad eseguirlo. Poi si rimette CS HIGH. Il datasheet riporta tutta una serie di altre istruzioni per sincronizzare l’invio con il clock seriale previsto dal protocollo… ma noi siamo pigri e invece di darci al bit-banging ci affidiamo alla libreria SPI.

Dettaglio del datasheet per i potenziometri digitali MCP41xxx
Dettaglio del datasheet per i potenziometri digitali MCP41xxx

Mostrami il codice!

Prima di tutto includiamo la libreria SPI e scegliamo quale pin useremo come CS; come dicevamo, scegliamo il 10:

#include <SPI.h>
const int csPin= 10;

Poi passiamo al setup: impostiamo il pin CS come output e inizializziamo il sistema SPI. Non abbiamo bisogno di specificare il comportamento degli altri pin coinvolti perché ci pensa la libreria.

void setup() {
  pinMode (csPin, OUTPUT);
  SPI.begin();
}

Il potenziometro digitale MCP41xxx ci mette a disposizione 256 step per cambiare il valore della resistenza. Nel caso dell’MCP41010 in figura questa varierà da circa 100 a 10.000 ohm. Scriviamo un semplice loop che faccia crescere e decrescere l’intensità del LED, proprio come nell’esempio del Fade, solo che invece di un semplice comando analogWrite dovremo scrivere una piccola funzione che usi la libreria. Introdurremo anche due variabili nel setup per gestire il ciclo.

// in testa
int intensita = 0;
int passo = 5;

// nel loop
digPotWrite(intensita);
intensita = intensita + passo;
if (intensita == 0 || intensita = 255) {
  passo = -passo;
}
delay(50);

Ed eccoci finalmente alla funzione per passare il valore al potenziometro digitale:

void digPotWrite(byte valore) 
{
  digitalWrite(csPin, LOW);
  SPI.transfer(B00010001);
  SPI.transfer(valore);
  digitalWrite(csPin, HIGH); 
}

Con la prima linea settiamo il pin CS a LOW, poi passiamo il codice corrispondende al comando (si veda la sezione Command Byte Format nell’immagine del datasheet più sopra), il valore desiderato e infine settiamo il pin CS a HIGH. A questo punto il nostro potenziometro digitale eseguirà il comando e imposterà la resistenza al valore desiderato.

Ecco il codice completo:

#include <SPI.h>
const int csPin= 10;
int intensita = 0;
int passo = 5;
 
void setup() {
  pinMode (csPin, OUTPUT);
  SPI.begin();
}
 
void loop() {
  digPotWrite(intensita);
  intensita = intensita + passo;
  if (intensita == 0 || intensita = 255) {
    passo = -passo;
  }
  delay(50);
}

void digPotWrite(byte valore) 
{
  digitalWrite(csPin, LOW);
  SPI.transfer(B00010001);
  SPI.transfer(valore);
  digitalWrite(csPin, HIGH); 
}

Non è stato difficile, vero?

Per saperne di più:

Lascia un commento