Pages: [1] 2   Go Down
Author Topic: 6 o piu pulsanti su un pin  (Read 1521 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* mancanza pin.JPG (37.27 KB, 833x365 - viewed 51 times.)
« Last Edit: September 26, 2012, 10:20:57 am by GINGARDU » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2288
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-razz
« Last Edit: September 26, 2012, 08:58:36 am by pitusso » Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 502
Posts: 12307
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Concettualmente sembra valido, io diminuirei a 100K le due esterne ed aumenterei a 2,2K quelle interne
Logged

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

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

direi che l'unico limite è dato dall aprecisione delle resistenze e dell'ADC.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Full Member
***
Karma: 2
Posts: 243
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 26, 2012, 03:53:12 pm by liso » Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 250
Posts: 21215
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 27, 2012, 01:11:39 am by uwefed » Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 502
Posts: 12307
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@ 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.
Logged

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

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-cry
 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
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2   Go Up
Jump to: