Home

fonte wikipediaUn potenziometro è un componente elettronico con 3 terminali formato da un cursore che scorre su di un materiale resistivo. Il cursore è mosso da un alberino che si può ruotare.
E’ possibile usarlo come reostato, unendo 2 piedini e trasformandolo in una resistenza variabile (il valore va da 0 al max valore del potenziometro); oppure come partitore di tensione. Dietro alla manopola del volume del vostro stereo c’è un potenziometro montato come reostato.

Esistono anche i potenziometri digitali: sono dei chip con all’interno una rete di resistenze che vengono attivate o circuitate a seconda di come li si programma. Un chip di questo tipo può essere facilmente comandato da un microcontrollore.

Per un recente progetto ne ho acquistati una manciata. Ho optato per i MCP41050 che contengono 1 solo potenziometro da 50 kohm.

La sigla del chip è semplice: MCP41xxx se ha un solo potenziometro digitale o MCP42xxx se ne ha due.
Al posto delle ‘xxx’ è indicato il valore in kohm. Se non erro sono disponibili da 10, 50, 100 kohm.

Vdd è il pin di alimentazione (+5v). Vss si collega a massa (0V). PA0 e PB0 sono i terminali del potenziometro e PW0 è il cursore o pin centrale. I pin 1, 2 e 3 sono CS (Chip Select), clock e Seria In (MOSI). Il potenziometro si programma utilizzando una porta seriale (SPI).

Non fatevi spaventare: nulla di complicato! E’ necessario inviare al chip 2 byte. Il primo è il “Command Byte” con cui diciamo che tipo di operazione vogliamo che venga eseguita (non sono molte), il secondo è il “Data Byte” usato per impostare il valore di resistenza del potenziometro (da 0 a 255).

Dal datasheet: “Executing any command is accomplished by setting CS low and then clocking-in a command byte followed
by a data byte into the 16-bit shift register. The command is executed when CS is raised.”

Per settare un valore (es. 128):
Command byte: xx01xx01 Data byte: 10000000
I bit con la x possono essere impostati a piacere (di solito si mette 0).
I bit 3 e 4 (da sx) sono pari a 01, cioè il comando di “set” del potenziometro.
I bit 5 e 6 sono ‘liberi’ e gli ultimi due dicono quale potenziometro utilizzare (ne possiamo avere al max 2). Avendone 1 solo si imposta 01.

Quindi il command byte è: 00010001

Molto utile una visita a “SPI By Hand” by Sebastian Tomczak“.

Di seguito le connessioni (per provarlo ho collegato un led al potenziometro):

E lo sketch per arduino o compatibili (parte del codice arriva dal blog di Nick Andersen):

int CS1     = 2;             // ChipSelect sul pin 2 di arduino
int CLKdpot = 4;             // Clock sul pin 4 di arduino
int POT_MOSI    = 5;         // MOSI sul pin 5 di arduino
byte cmd_byte2 = B00010011  ;  // Comando 'PARK'
int resPARK   = 100;

void NoDrive()  { //invia il comando park con valore 100
  spi_out(CS1, cmd_byte2, resPARK);
}

void spi_out(int CS, byte cmd_byte, byte data_byte){
  //metodo usato per inviare il command byte e il data byte
  digitalWrite (CS, LOW);       // per programmare abbasso il CS
  spi_transfer(cmd_byte);     // invio il COMMAND BYTE
  delay(2);
  spi_transfer(data_byte);    // invio il DATA BYTE
  delay(2);
  digitalWrite(CS, HIGH);       // alzo il CS al termine della trasmissione
}

void spi_transfer(byte working) {
  for(int i = 1; i <= 8; i++) { // Set up a loop of 8 iterations (8 bits in a byte)
    if (working > 127) {
      digitalWrite (POT_MOSI,HIGH); // If the MSB is a 1 then set MOSI high
    }  else {
      digitalWrite (POT_MOSI, LOW);                   // If the MSB is a 0 then set MOSI low
    }
    digitalWrite (CLKdpot,HIGH) ;                        // Pulse the CLKdpot high
    working = working << 1 ;                             // Bit-shift the working byte
    digitalWrite(CLKdpot,LOW) ;                          // Pulse the CLKdpot low
  }
}

void setup() {
  pinMode (CS1, OUTPUT);
  pinMode (CLKdpot, OUTPUT);
  pinMode (POT_MOSI, OUTPUT);

  NoDrive();

  Serial.begin(9600); //imposto la seriale per fare debug
  Serial.println("ok");
}

void loop() {
  for (int i = 0; i < 255; i++){
    spi_out(CS1, cmd_byte2, i);
    Serial.println(i);
    delay(50);
  }
  for (int i = 255; i > 0; --i){
    spi_out(CS1, cmd_byte2, i);
    Serial.println(i);
    delay(50);
  }
}

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...