Problema Potenziometri multipli con pin lettura comune

Ciao a tutti,
Sto realizzando un dispositivo di gioco che mette insieme, 23 bottoni con altrettanti led, 2 toggle switch on-off-on, 1 microstick a 2 assi e 4 potenziometri.
Avendo deciso di utilizzare una scheda “pro-micro” al fine di limitare lo spazio occupato, ho dovuto ottimizzare al massimo l’utilizzo dei pin e devo dire che funziona quasi tutto alla perfezione.
Dico quasi perchè i potenziometri mi stanno facendo impazzire. A causa del numero di pin limitati, ho optato per utilizzare A0 come unico pin di lettura per tutti e 4 che alimento quindi in modo sequenziale.
Premetto che le mie conoscenze di elettronica sono limitate e che quindi poter aver fatto delle castronerie macroscopiche agli occhi di un e utilizzare di seguito dei termini non appropriati

vi riporto il pezzo di schema relativo all’organizzazione dei potenziometri e lo stralcio di codice che li legge

int ritardo = 30;


void setup() {
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);

}

void loop() {
  digitalWrite(6,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(6,LOW);
  
  digitalWrite(7,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(7,LOW);
  
  digitalWrite(8,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(8,LOW);
    
  digitalWrite(9,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(9,LOW);
  delay(ritardo);
}

Ho pensato di mettere dei diodi tra ogni pot ed il ground e tra ogni pot il pin A0 per evitare che la corrente che do al pot che voglio leggere non “finisca negli altri 3”

E ora vengo al problema:

La lettura di ogni pot è estremamente imprecisa (nel senso che anche non toccando il pot ho delle oscillazioni anche fino a 100 valori) e quando giro la manopola di uno dei potenziometri ottengo una variazione dei valori anche negli altri 3.

Qualcuno saprebbe darmi una dritta?

Grazie mille!

per un pugno di bottoni

credo che il tuo sia un lavoro un po' al limite ma fattibile, ti faccio i miei complimenti

prova a mettere il delay "prima" di fare le letture

io toglierei i diodi a massa e metterei una resistenza in parallelo tra ingresso e massa, per garantire una corrente minima di conduzione sul diodo

se vai a cercare "aiutateci ad aiutarvi" in "software"

dovresti trovare un po' di link interessanti

se li segui (e già che ci sei li leggi, con calma) dovresti trovare una discussione proprio sull'argomento che ti interessa (e capisci anche lo "strano" titolo che ho messo)

… i diodi verso massa sono un po inutili … proprio perche’ e’ “massa” … 4 pin di 4 potenziometri diversi, tutti connessi a GND, in che modo vuoi che si influenzino fra loro ? … indifferentemente da quale potenziometro alimenti, sempre a massa saranno … :wink:

EDIT: discorso diverso invece per i pin che alimentano i potenziometri … prova a metterci 4 condensatorini anche solo da 10n ( fra i pin dei condensatori e massa, giusto per il caso che ci siano disturbi spurii), e poi fare le letture doppie scartando la prima (per dare il tempo all’ingresso dell’ADC di stabilizzarsi) … magari gestendole con millis invece che con i delay :wink:

Bisognerebbe anche ricordarsi che seppure il micro ha piu di un’ingresso analogico, il convertitore interno e’ uno solo, e viene letto in multiplex … in piu tu alimenti i potenziometri in multiplex … quindi in pratica stai leggendo con un multiplex in ingresso, un segnale pilotato da un secondo multiplex in uscita (e di sicuro non sincronizzati) … serve dare il tempo al tutto di stabilizzarsi fra ogni lettura … anche pochi millisecondi potrebbero fare una certa diffewrenza …

Però c'è una cosa che non mi è chiara:

Tu in questa maniera usi i pin 6 7 8 e 9 per la selezione, e il pin 18 per la lettura

Usi 5 pin per 4 potenziometri, che non è che sia un grande guadagno rispetto ad usare i pin 6 8 9 e 18 direttamente

Perché ti incasini così?

Ai tempi avevo affrontato anche io il problema, ma con Arduino. Essendo anche io molto scarso in materia mi sono basato su questo instructable

arduino analog input multiplexer

io comunque nel loop forzerei sempre lo stato dei quattro pin digitali in modo che uno solo sia high e gli altri low tipo:

void loop() {
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(6,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(6,LOW);

  digitalWrite(6,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(7,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(7,LOW);

  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(9,LOW);
  digitalWrite(8,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(8,LOW);
   
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  Serial.print(analogRead(A0));
  digitalWrite(9,LOW);
  delay(ritardo);
}

Con un decoder di questo tipo

potrebbe risparmiare altri due pin digitali e tutti i diodi.

Ciao,
P.

decoder1.png

Standardoil: Perché ti incasini così?

Perchè forse ha fatto il mio stesso errore, ho guardato il pinout del pro-mini invece del pro-micro ;D

Difinov: ... La lettura di ogni pot è estremamente imprecisa (nel senso che anche non toccando il pot ho delle oscillazioni anche fino a 100 valori) e quando giro la manopola di uno dei potenziometri ottengo una variazione dei valori anche negli altri 3. ...

A naso direi che devi anche capire qual'è la tensione massima letta per ogni potenziometro, perchè i diodi abbassano la tensione letta della loro Vf che può variare diodo per diodo, anche se di poco. Da quanto sono i potenziometri? Perchè: "The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less." Quindi se sono da 10k ok, ma se sono più grandi potresti avere letture inaccurate perchè il condensatore interno dell'ADC potrebbe non caricarsi in tempo. Secondo me se li metti da 10k non dovrebbe essere necessario alcun delay nelle letture. Comunque, puoi fare una semplice prova facendo due letture sequenziali e vedere se ti varia il risultato tra la prima e la seconda con la seconda più accurata della prima. Un buon test sarebbe di fare due letture per ogni potenziometro e metterli sfalsati per aver un delta massimo tra l'uno e l'altro. Caso peggiore dove potresti avere un errore maggiore, cioè passando da una lettura a 0V ad una a 5V e/o viceversa.

Per la caduta del diodo, se la vuoi ridurre, potresti usare diodi schottky che hanno una Vf inferiore ai diodi che hai usato, passeresti da una Vf di circa 1,1V a una di circa 0,3V per i 1N5817.

Poi seguirei il consiglio di @Etemenanki sui condensatori, anche se non ho capito esattamente dove li vorrebbe collegare perchè gli è scappato un "condensatori" di troppo ... :P Probabilmente li voleva mettere tra i pin digitali e massa per ridurre i disturbi della tensione ai capi dei potenziometri, lascio a lui precisare perchè se ne intende più di me di sicuro.

Ovviamente do per scontata l'eliminazione dei diodi verso massa.

my few cents Maurizio

Ciao a tutti ragazzi! Tanto per cominciare, ci tengo a ringraziarvi tutti quanti! Non mi aspettavo un supporto così immediato :-) Ho capito abbastanza chiaramente che il diodo tra pot e massa è inutile... :D quindi ho seguito il vostro consiglio e l'ho tolto. Ho inoltre inserito una resistenza tra le alimentazioni e la massa e devo dire che la precisione in lettura è migliorata nettamente (anche se ho ancora dei picchi). Adesso farò una prova invece inserendo i condensatori.

@maubarzi : i pot sono da 10k e ti confermo che ho usato lo schema del pro-micro (questo per intenderci) |500x417 Grazie inoltre per la dritta dei diodi schottky

@Standardoil: non sono sicuro di aver capito la questione dell'utilizzare solo i pin 6, 8, 9 e 18. Intendi dire che avrei potuto alimentarli da vcc e leggere su questi 4 pin che sono gli analogici?

Devo aggiungere un dettaglio circa la scelta dei pin. Questo progetto è l'espansione di una scheda che avevo già realizzato e testato e che gestiva solo i 23 tasti e il microstick a 2 assi. Sto quindi relaizzando una seconda scheda che si "incastra" nella prima e mi permette di aggiungere la gestione dei led, dei pot e degli switch on-off-on

Grazie ancora! Più tardi vi aggiorno sui risultati delle prove con i condensatori

Ma scusa una curiosità: tu attualmente come gestisci i 23 pulsanti? Se già hai qualche extender, non hai modo di liberare 3 pin analogici ed usare quindi un pin per ogni potenziometro "come Ohm comanda"? ;)

Oppure se usi CD74HC4067 hai un multiplexer che è sia digitale sia analogico, quindi puoi usare 4 dei suoi pin anche per i potenziometri...

Stavo scrivendo quasi la stessa domanda:

I pin 6 8 9 e 18 sono analogici, non ti serve di multiplare nulla

Li usi direttamente come analogici con un collegamento classico

Comunque io ho fatto un conto

Hai 18 pin 2 vanno via per la seriale 5 per i potenziometri

Ne avanzi 11, come ci comandi il resto?

Difinov:
@maubarzi : i pot sono da 10k e ti confermo che ho usato lo schema del pro-micro…

@Standardoil: non sono sicuro di aver capito la questione dell’utilizzare solo i pin 6, 8, 9 e 18. Intendi dire che avrei potuto alimentarli da vcc e leggere su questi 4 pin che sono gli analogici?

Eeeeeegià!
Io inizialmente, avendo preso il pinout del mini, ci ero cascato, ma il socio ha l’occhio lungo. ;D
Quindi, si, alimenti da vcc e leggi i 4 analogici direttamente.
Così invece di 5 pin ne usi solo 4 e senza cambiarli, erano già quelli che avevi impegnato allo scopo.

Poi, anche io sono curioso di come comandi tutto il resto con i pochi pin rimasti.

Maurizio

Il segreto che non ammetterò mai

È che ieri avevo sbagliato pro pure io

Ma stamattina ho ricontrollato....

i pulsanti li avevo già organizzati in una matrice in modo da utilizzare solo 10 pin e per i componenti aggiuntivi che ho inserito sulla scheda di espansione ho cercato di sfruttare i pin che potevo riutilizzare. provo ad postare uno schizzo dello schema: |374x500 i pezzi ripassati in rosso ed i due shift register li ho aggiunti in un secondo momento.

Beh, visto che hai aggiunto i 2 shift register, significa che spazio ne hai, dato che devi farci stare anche la camionata di diodi. A questo punto (non dirlo a docdoc, che poi dice di averlo suggerito prima lui :P ), ti do il suggerimento che do sempre in questi casi, e cioè di usare un paio di 74HC4067 (il link spiega il multiplexing, ma per il demultiplexing è lo stesso solo che il pin invece di output è di input). Sono dei multiplexer/demultiplexer analogico/digitali a 16 canali. Così ti eviti sia i 2 shift register che la camionata di diodi. Li puoi usare sia per aumentare le uscite che gli ingressi. Se poi, per le uscite, ti serve, una volta impostato il livello alto o un pwm, che questo rimanga senza costringerti a ripassare l'uscita periodicamente per rialzare il livello o per gestire il pwm, puoi usare dei PCA9685 (meglio Adafruit, ma se vuoi ci sono cloni a molto meno ;D quelli che ho preso io non mi hanno dato problemi) che supportano anche il PWM senza bisogno del micro che lo gestisca di continuo e per di più li comandi con i2c.

Maurizio

Con tutti quegli ingressi ANCHE analogici, perchè non pensare a tanti pulsanti in parallelo (ognuno con la sua resistenza)? Se ho 1024 passi, dieci pulsanti ogni analogico li leggo senza problemi, quindi 20 pulsanti su due analogici, 30 su tre.... Io faccio sempre cosi: meno fili, meno ingressi, meno problemi.

maubarzi: ... Poi seguirei il consiglio di @Etemenanki sui condensatori, anche se non ho capito esattamente dove li vorrebbe collegare perchè gli è scappato un "condensatori" di troppo ... :P ...

E' colpa del sonno, scusa ... ho trasformato potenziometri in condensatori :P :D ... era fra i pin dei potenziometri collegati al micro e massa ;)

Steve: si, ma se preme due pulsanti insieme ... ;)

Etemenanki: ....

Steve: si, ma se preme due pulsanti insieme ... ;)

Beh, davo per scontato che non li prema, come non si premono due tasti insieme su una tastiera o sul telefono o sul citofono ... :)

Ciao a tutti! Oggi mi sono arrivati i 1N5817 che, dietro suggerimento di Maurizio ho deciso di utilizzare. Ho fatto una prova veloce su breadboard e sembra davvero funzionare alla perfezione!!!!! Certo, dopo aver letto bene il funzionamento del multiplexer/demultiplexer, probabilmente quando disegnerò la scheda definitiva converrà fare un po' di "restyling" diciamo. Stasera elimino i diodi di troppo e sostituisco i restanti con questi. Vi aggiorno a lavoro finito. Intanto grazie davvero per il supporto! :)

Ho sostituito i 1n4007 con i 1n5817 e vi confermo che funziona tutto alla perfezione. Grazie infinite per la disponibilità e per gli utilissimi consigli!

Per Difinov e per il 'socio' maubarzi:

Vi ho citati e ringraziati in per un pugno di bottoni