Go Down

Topic: Bottoni multipli su un pin con partitore di tensione (Read 328 times) previous topic - next topic

remix_tj

Ciao,

sto lavorando con un arduino uno per creare un tabellone segnapunti/segnatempo per la mia squadra.

Dovrei collegare 9 bottoni per gestire 4 gruppi di input:

Punteggio Locali +1 / -1
Punteggio Ospiti +1 / -1
Timer PlayPause / Stop / Aggiungi minuti
Tempi di gioco +1 / -1

Ci sarebbero effettivamente pin a sufficienza, ma volevo ridurre al minimo i cablaggi e ho optato per una soluzione che ho trovato nel libro "Arduino Development Cookbook" al paragrafo "1000 buttons to 1 pin".

Allego lo schema che ho implementato per i 3 bottoni, soluzione simile ovviamente è stata implementata anche per i 2 bottoni che servono a diminuire o aumentare i punteggi e i tempi di gioco.


Ho usato resistenze da 220 ohm per questioni di numerosità (me ne sono servite 13 in tutto, non ne avevo abbastanza di altri tagli).

Il problema che ho notato, misurando con il tester, è che talvolta alla pressione del bottone non avviene una variazione di tensione e di conseguenza la porta analogica non riceve il segnale corretto.

Avete qualche suggerimento da darmi su questo tipo di circuito? Come posso fare per evitare che la pressione del bottone non dia il risultato sperato?

Grazie,

Luca

Silente

Se alla prrssione di un bottone corrispondono risultati diversi temo che il problema sia nel bottone, che non riesce a cambiare stato(falsi contatti e simili). Io credo, infatti, che in qualunque circuito un input uguale corrisponda a un output uguale. Se l'output non é uguale vuol dire che c'é un problema nell'input. E se così fosse temo che nessun circuito possa supplire alla mancanza.
Puoi verificare che i pulsanti vadano bene colleganfoli uno alla volta.
Infine sei sicuro che sei pin siano troppi? Potresti infatti collegare i tasti a tastiera 3*3, senza l'uso di hardware aggiuntivo
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

remix_tj

Grazie del suggerimento Silente! Non avevo pensato alla tastiera 3x3. Ora provo a fare qualcosa.

Ho visto http://playground.arduino.cc/Code/Keypad#CurrentVersion e https://playground.arduino.cc/Main/KeypadTutorial e mi sembrano una buona base. Semplifica di molto anche l'attività di scrittura del codice!


 Sembra comunque che ci sia un problema di questi bottoni, non particolarmente buoni. Comunque in futuro dovrò usare bottoni diversi, quindi eventualmente valuterò.

Luca

ricki158

Io non utilizzerei gli stessi valori di resistenza.

Hai 5 volt, un bottone lo metti a 0. I restanti devono dividere in parti uguali i 5 volt. Fai più partitori di tensione, quindi delle equazioni e le metti a sistema le une con le altre. In questo modo risolvi la questione dei valori delle resistenze ed hai dei valori ben spaziati, per cominciare.

docdoc

Diciamo intanto che userei resistenze più grandi per evitare assorbimenti inutili, in genere ne metto da almeno 1k. Ad esempio vedi QUI (la ottima Arduino Basic Connections del nostro pighixxx, che ti consiglio!) dove usa 4 pulsanti per ogni pin, con un partitore.

A parte questo, se da un partitore misuri tensioni non stabili alla pressione di un tasto, forse è un problema del pulsante o dei cablaggi. L'input analogico può variare un poco ma non così tanto, per cui per determinare quale sia il tasto premuto (diamo per scontato che tu NON prema più di un tasto alla volta) ti basta anche sperimentalmente vedere il valore analogico che leggi, e lasciare un minimo di margine.

Ad esempio in un mio progetto su Instructables (un pannello per Flight Simulator, dove ci sono tanti deviatori e commutatori) ho fatto una funzione che, dato il valore corrente dell'input analogico, mi restituisce direttamente l'ID della posizione, da 0 a 3:

Code: [Select]
int Analog2Rotary(int cur) {
    if (cur < 200)  // Posizione 0 (GRD)
      return 0;
    else if (cur < 500)  // Posizione 1 (OFF)
      return 1;
    else if (cur < 900)  // Posizione 2 (CONT)
      return 2;
    else  // Posizione 3 (FLT)
      return 3;
}
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

remix_tj

Grazie dei suggerimenti, ma la soluzione di una matrice di bottoni mi è risultata più semplice da implementare.

Terrò conto del link, comunque, mi è parso ben fatto e a prova di scarsi come me :-)

Go Up