Go Down

Topic: 6 o piu pulsanti su un pin (Read 2076 times) previous topic - next topic

gingardu

Sep 26, 2012, 03:47 pm Last Edit: Sep 26, 2012, 05:20 pm by GINGARDU Reason: 1
visto la mia "mancanza cronica" di pin a disposizione
per avere piu "pulsanti da premere"  ho provato a risolvere cosi  

volevo sapere  se vedete qualche "controindicazione"

uso un pin Analogico  su cui cortocircuito   delle resistenze tutte di valore uguale
man mano che viene schiacciato un pulsante A1  rileva  un valore predefinito di tensione
if  (analogRead(A1) > 550 && analogRead(A1) < 600).........

le resistenze da un mega servirebbero per non lasciare A1 libero di fluttuare
se le altre resistenze vengono messe vicino alla pulsantiera rimovibile
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

pitusso

#1
Sep 26, 2012, 03:56 pm Last Edit: Sep 26, 2012, 03:58 pm by pitusso Reason: 1
Ciao,
un modo è di usare resistenze tutte uguali, qui un link per chi volesse approfondire:
http://tronixstuff.wordpress.com/2011/01/11/tutorial-using-analog-input-for-multiple-buttons/

un altro è questo (usando resistenze di diverso valore):
http://arduino.cc/playground/Code/AnalogButtons

Il tuo schema ancora non l'ho guardato bene, ma penso arriverà a breve qualche parere più tecnico  :P

Michele Menniti

Concettualmente sembra valido, io diminuirei a 100K le due esterne ed aumenterei a 2,2K quelle interne
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

direi che l'unico limite è dato dall aprecisione delle resistenze e dell'ADC.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

gingardu

perche' scusa?   quando verifico con if di sicuro non cerco la lettura esatta  ma che sia all'interno di un minimo e massimo
con resistenze al 5%  ci stai dentro molto bene,

ovviamente ci sono delle cose a cui  fare attenzione i pulsanti piu importanti  sono quelli che spostano la lettura agli estremi
perche è  impossibile che A1 ci va da solo (anche per un attimo) da quelle parti  per un falso contatto
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

liso

#5
Sep 26, 2012, 10:44 pm Last Edit: Sep 26, 2012, 10:53 pm by liso Reason: 1
Praticamente stai utilizzando un convertitore Flash al contrario...allora perchè non utilizzare direttamente un DAC?
se trovo qualche esempio o ritrovo le dispense di elettronica II te le mando!
Qualcosa tipo questo...
http://people.scs.carleton.ca/~barbeau/SDR/BF537/DAC08.pdf

lesto


perche' scusa?   quando verifico con if di sicuro non cerco la lettura esatta  ma che sia all'interno di un minimo e massimo
con resistenze al 5%  ci stai dentro molto bene,

ovviamente ci sono delle cose a cui  fare attenzione i pulsanti piu importanti  sono quelli che spostano la lettura agli estremi
perche è  impossibile che A1 ci va da solo (anche per un attimo) da quelle parti  per un falso contatto


non sto dicendo che non ci stai dentro, ma che il limite dei pulsanti deriva da quei due fattori (se li usi uno alla volta, se no si complica)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

uwefed

#7
Sep 27, 2012, 12:14 am Last Edit: Sep 27, 2012, 08:11 am by uwefed Reason: 1
GINGARDU

Il Tuo schema consuma sempre corrente visto che hai collegato massa e 5V ai partitori resistivi. Usando una serie di Resistenze e una resistenza Pullup non hai corrente quando non hai schiacciato nessun pulsante.

Quote

volevo sapere  se vedete qualche "controindicazione"

L' uso di una lettura analogica e una serie di conftronti se il valore letto é in certi range comporta un ralentamento rispetto una lettura di diversi pin digitali.

Personalmente preferirei usare un espander I2C e mettere lí i pulsanti con i loro Pullup/down.

Ciao Uwe

Michele Menniti

@ Lesto: tutte queste soluzioni a partitore in genere presuppongono la pressione di un solo pulsante per volta, diversamente bisogna pensare a circuiti a matrice oppure a soluzioni più professionali come quelle suggerite da Uwe.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

lesto

però matematicamente prevendo i paralleli che si vengono a formare e scegliendo le R di consegunza si potrebbe fare. molto complesso però, forse usando numeri primi di resistenze...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

gingardu


GINGARDU



Quote

volevo sapere  se vedete qualche "controindicazione"

L' uso di una lettura analogica e una serie di conftronti se il valore leto é in certi range comporta un ralentamento rispetto una lettura di diversi pin digitali.

Personalmente preferirei usare un espander I2C e mettere lí i pulsanti con i loro Pullup/down.

Ciao Uwe



hai hai   =(
forse devo rivedere il mio modo di "progettare"  sono gia a 24k  di memoria occupata
e un pin  (4) solo come un gambo di sedano  libero

mi sa che e meglio che rifaccio tutto  da capo
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

gingardu


però matematicamente prevendo i paralleli che si vengono a formare e scegliendo le R di consegunza si potrebbe fare. molto complesso però, forse usando numeri primi di resistenze...


ma il valore letto non lo devi per forza calcolare prima,   basta mettere  residtenze piu o meno uguali,

quelle che si hanno  poi di fa la lettura su  A1  dei vari pulsantie si calcola bene per stare ben lontano dalla soglia di commutazione tra una lettura e l'altra,

se un pulsante premuto da 120 di lettura faccio
if  (analogRead(A1) > 100&& analogRead(A1) < 140).........
ovviamente se i pulsanti aumentano in maniera enorme es 2-300  qualche problemino verra fuori se non usi resistenze 1%
ma questa e un'altra storia
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

lesto

bhe i valori li devi precalcolare un minimo, altrimenti non sai il rage ADC a quale pulsante corrisponde (salvo fare prove direttamente)
Comunque mi riferivo al fatto di premenre più di un pulsante contemporaneamente, in tal caso bisogna studiare un attimo il modello matematico
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Si potrebbe pensare ad una serie di resistenze calcolate sulla potenza del 2 per riprodurre la numerazione binaria.
Si ha ad esempio
1-2-4-8
Per fare 3 si somma l'1 ed il 2.
Basta quindi trovare 2 resistenze che compiano lo stesso scopo e con 4 valori si possono gestire fino a 16 pulsanti (2^4=16).
Esempio:
68
120
220
470
560

Se leggo 0 nessun pulsante.
Se leggo x (68) 1° pulsante
Se leggo y (120) 2° pulsante
Se leggo z (68+120=188) 3° pulsante
ecc...

I valori poi si trovano in modo da non creare coppie con letture molto vicine.

lesto

così puoi gestire 2 pulsanti conteporaneamente, non di più. in oltre il parallelo si fa con le moltiplicazioni, non solo con le addizioni.
Quindi mi sa che bisogna andare di numeri primi, e che non esiste un modo "veloce" per passare da analogico a pulsanti se non col brute force.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up