Arduino analog keys

Salve, ho fatto una tastiera analogica 10 tasti per arduino. In realta sono 9 per mancanza di un tastino.
Come libreria ho usato mhvlib, e quindi il codice non è compatibile con arduino, ma tutta la logica (ops la analogica) si.

Mi sono accorto che premendo due tasti comtemporaneamente ottengo la stessa cosa di premere il tasto successivo, es 1+2 e come se premessi il tasto 3. Questa cosa non va bene deve essere possibile premere almeno due tasti contemporaneamente senza generare corrispondenza con uno dei tasti presenti. Penso di riuscire a risolvere modificando i valori di resistenza su ogni tasto, penso ci sia spazio per molti altri tasti, sempre nello stesso canale ADC.

Al momento ho un tolleranza di 6 punti ADC, cioè 6 x 0.004882813 = 0,029296878. Quindi se il tasto premuto porta la tensione a 1.0volts è ammesso un valore di maggiore di 1 - 0,029296878 e minore di 1 + 0,029296878. Ovviamente si può aumentare questa tolleranza e andrebbe impostato un valore che dipende dalle variazioni minime e massime a cui il regolatore di tensione (da usare come rifermento) è soggetto.

Quindi, che regolatore tensione posso usare? che stabilità posso aspettarmi da un regolatore dedicato ad alimentare la tastiera?

C’è un’altro problema che mi viene in mente: anche se usassi un regolatore per la tastiera stabilissimo, quello usato per il 328 dovrebbe avere pari requisiti di stabilità, e quindi alla fine conviene un solo regolatore, oppure usare un riferimento esterno?
Cioè posso alimentare il riferimento di arduino con 5Vdc?

Le tensione sono queste:

#define V_KEY02 2.790
#define V_KEY03 2.488
#define V_KEY04 2.240
#define V_KEY05 1.992
#define V_KEY06 1.790
#define V_KEY07 1.470
#define V_KEY08 1.229
#define V_KEY09 0.990
#define V_KEY10 0.753

Questi valori hanno il difetto di cui parlavo prima, cioè la pressione di due tasti adiacenti produce l’effetto del tasto successivo.
1+2= 3, 2+3 = 4, 3+4 = 5 ecc.

Non credo convenga creare una lib con questa funzionalità, perchè ci si gioca la possibilità di usare l’ADC.

Ciao.

daci lo schema eletrico. Ciao Uwe

Ho usato resistenze a strato metallico all’1%, perchè li avevo dentro, la cosa si può fare anche con le quelle al 5% ma probabilmente non bastano più 2 resistenze per partitore.

Con qul sistema lì hai rimbalzi di contatto a tutta randa. Metti un C da 0,1uF poliestere tra il nodo e la massa. E' un sistema un pò grezzo ma un bel pò di spike te li leva.

Con qul sistema lì hai rimbalzi di contatto a tutta randa. Metti un C da 0,1uF poliestere tra il nodo e la massa. E' un sistema un pò grezzo ma un bel pò di spike te li leva.

No nessun rimbalzo, anche se me ne aspettavo qualcuno. Evidentemente i microswitch usati sono ottimi. Solo uno da qualche segno di rimbalzo, ma raramente.

In realtà qui non c'è da combattere solo il rimbalzo del conttatto, ma anche il fronte di salita o discesa da un livello all'altro. Il problema l'ho risolto così via software:

Abilito interrupt "fine acquisizione" e nella ISR viene chiamata la funzione "int nKey = keyPressed, che mi ritorna il tasto premuto. Un case switch su nKey esegue un case per volta:

Pseudocode:

switch (nKey) case 0: eseguito se nessun tasto viene premuto case 1: keyCounter1++; if (keyCounter1 > 250) keyBuffer.append('A'); break case 2: keyCounter2++; if (keyCounter2 > 250) keyBuffer.append('B'); break Case 3: ecc.

Comunque la porta adc deve essere chiusa alle alte frequenze, quindi un C da 0.1uF è giusto inserirlo.

I valori dei resistori li ho scelti secondo questi calcoli: 1024 valori di tensione con passo di 5/1024 0,004882813 Moltiplicando il passo 0,004882813x51 = 0,249023463/2= 0,249023463 ottenga la prima tensione di un pulsante premuto.

key10 0,004882813x102 = 0,498046926 key9 0,004882813x153 = 0,747070389 key8 0,004882813x204 = 0,996093852 key7 0,004882813x255 = 1,245117315 key6 0,004882813x306 = 1,494140778 key5 0,004882813x357 = 1,743164241 key4 0,004882813x408 = 1,992187704 key3 0,004882813x459 = 2,241211167 key2 0,004882813x510 = 2,49023463 key1 0,004882813x561 = 2,739258093 0,004882813x612 = 2,988281556 0,004882813x612 = 2,988281556 0,004882813x663 = 3,237305019 0,004882813x663 = 3,486328482

Che però non vanno bene, perchè devo fare in modo che tutte le combinazioni di tasti producano ognuna una unica differenza di potenziale. Sembra proprio che per il momento io non ne sia capace. Chi la dura la vince.

PS: nota che dovro fare in modo che alla prima pressione viene aggiunto un carattere al buffer, per inserirne altri il tasto deve rimanere premuto x tempo. Insomma il funzionamento tipico di una tastiera PC.

Ciao.

È normale che se schiacci 2 pulsanti ne metti in paralello le rispettive resistenze e puoi misurare una tensione che corrisponde a un azionamento di un altro pulsante. Il programma l' avrai scritto aspettandoti che sia premuto un unico pulsante alla volta. Ciao Uwe

uwefed: È normale che se schiacci 2 pulsanti ne metti in paralello le rispettive resistenze e puoi misurare una tensione che corrisponde a un azionamento di un pulsante. Il programma l' avrai scritto aspettandoti che sia premuto un unico pulsante alla volta. Ciao Uwe

basta pensare in binario: a ogni pulsante raddoppi la resistenza

es pulsante 1 = 1V (sono esempi) pulsante 2 = 2V pulsante 3 = 4V pulsante 4 = 8V

se ne premi due in contemporanea avrai ad esempio 3V = 1+2 12V = 4+3 9V = 1+4

se guardi è come si conta in binario XD

Allora Ti serve una rete resistiva R-2R: http://digilander.libero.it/desdeus/Trasmissione/Convertitori_DAC_R-2R.htm Ciao Uwe

se guardi è come si conta in binario smiley-lol

Chissa perchè, credevo di riuscire a fare diversamente. boh misteri della mente.

Dunque grazie, ora è tutto un pò più chiaro.

Se volessi 10 tasti, e volessi sfruttare tutte le combinazioni dovrei avere LSB 1024/5 = ~0.0048V

Evidentemente questa strada non è percorribile basta un niente per falsare la decodifica del tasto.

Mentre da un vecchio documento su ST6 javascript:openreq('http://www.datasheetcatalog.org/datasheet/SGSThomsonMicroelectronics/mXyzrxv.pdf') si vede come fare una tastiera analogica con anche più di 10 tasti, ma ogni tasto ha una priorità maggiore dell'altro e non è possibile decodificare la pressione di più tasti.

Alla fine credo che con 5Vdc ci sia spazio anche per 55 tasti singol key code, se sono necessari i tasti modificatori tipo shift, control ecc, si può sfruttare l'altro canale ADC.

PS: io non sono riuscito a pensare ad uno schema con 10 bit (10 reti R-2R) usando i normali pulsantini switch, servirebbero dei deviatori.

Grazie uwe, superlol.

Ciao.