Un pulsante due funzioni (input+resume from sleep)

Ciao a tutti,
sto cercado di creare una piccola interfaccia con soli tre pulsanti, questi sono collegati a tre pin d'input di arduino e fin qui tutto ok.
Adesso vorrei estendere il progetto poiché arduino sarà alimentato a batteria e vorrei mandarlo in sleep. Per svegliarlo ho visto che per Arduino Uno è possibile utilizzare i pin 2 e 3 in modo tale che quando il segnale va a LOW si passa da sleep alla modalità standard. Avendo tre pulsanti ho pensato di mettere i pin d'input più il 2 in input e settare l'alta impedenza scrivendo il valore HIGHT, quindi vorrei collegare i tre pulsanti a GND e farli andare ai rispettivi pin, inoltre vorrei collegarli tutti e tre al pin 2 mettendo un diodo tra lo switch e il pin 2 in modo tale da far sentire il segnale al pin 2 ma non anche agli altri pin dei due pulsanti non coinvolti. E' fattibile o la cosa non funziona, da prove fatte con LTSpice con led e relativi diodi ho un picco istantaneo sul led (pin 2) quindi sembrerebbe non funzionare.
Per chiarezza metto anche lo schema elettrico.

Grazie a chiunque vorrà rispondere

Inizio modifica
Nel circuito non ci sono le resistenze perchè i led in realtà sono i pin di arduino
Fine modifica

Ok, vista l'assenza di risposte credo che non sia la via giusta. Invertirò il funzionamento in modo tale da non usare i pullup intermi am metterò dei pulldown sui vari pin e ai pulsanti farò arrivare i +5V, dopodichè per svegliare il micro piazzo un paio di porte OR in modo da disaccopiare pin dei pulsanti e pin per il risveglio.

Grazie comunque e ciao

In effetti dopo 3 giorni senza risposta uno pensa che non si può fare, ma in tal caso ti sarebbe stato detto e invece non hai ricevuto commenti al tuo post. Perché?

Io ad esempio questo post lo sto leggendo per la prima volta adesso che sto rispondendo, per una concomitanza di coincidenze il tuo post è passato inosservato.

Però non è che ti sei spiegato benissimo, cioè potevi fare di meglio.

Ora io penso che quello che vuoi fare è questo:
Hai 3 pulsanti + relative pull-up che usi come interfaccia utente per il normale funzionamento.
Ora vorresti mettere il micro in sleep e risvegliarlo usando uno il segnale proveniente da i tre pulsanti, ma purtroppo hai solo due pin che possono essere sfruttati (in realtà sono di più e in vario modo). L'idea di sfruttare i diodi è ottima ma quello schema LTspice porta fuori strada chi lo vede, magari sarà corretto ma mi confonde.

Se i pulsanti usano un pull-up devi connettere il catodo del diodo al nodo pin-pulsate di ogni ingresso, e l'anodo di ogni diodo connessi insieme al pin 2 e su questo devi abilitare la pull-up interna o ne usi una esterna.

Il codice può avvantagiarsi di questa configurazione hardware, come?
Al momento usi la tecnica polling per testare la pressione o meno di un pulsante da parte dell'utente, invece questa tecnica non è più necessaria perchè adesso la pressione di uno dei pulsanti provoca la chiamata a funzione utente collegata alla richiesta di interrupt, per tanto la funzione potrà abilitare la tecnica polling per stabilire quale dei tre pulsanti risultano premuti.

Inoltre se non ricordo male si può risvegliare il micro con interrupt sul timer agendo sul pin esterno, inoltre tutti i pin del microcontroller hanno una gestione di interrupt abilitabile ma sono sensibili sia al fronte di salita che quello di discesa e si chiamano PCINT, cioè equivale all'interrupt sul pin 2 con l'argomento CHANGED. Mentre non ricordo se è possibile risvegliare il micro con un PCINT.

Ridisegna il circuito con ltspice o altro usando i componenti originali, quali pulsante resistenze e per le porte usa un buffer TTL (triangolo) o qualunque altra porta logica, magari non riesci a simularlo ma almeno posso vedere se sono connessi correttamente.

Ciao.

Per esser certi che si possa risvegliare il micro usando un interrupt si deve usare o un interrupt hardware, come gli INT0/1 che sono sui pin 2/3 come hai detto. Ma il segnale da usare è il LOW, solo questo funziona con gli interrupt hardware quando il micro è in sleep profondo.
Alternativamente i PCINT, che puoi attivare su uno qualunque dei pin (devi però usare una lib apposita).

Se usi l'INT0 o l'INT1, sui pin 2 e 3, non devi preoccuparti del segnale che va agli altri pin perché solo il pin agganciato all'interrupt "sentirà" il segnale.

Ciao, innanzitutto grazie! Allora il tentativo con lo spice era per provare tutte le soluzioni in mio possesso prima di rompere sul forum.
Spiego meglio la situazione e metto le due imamgini fatte con eagle e allego anche lo schema.
I tre pin di arduino corrispondenti ai tre pulsanti sono settati in modo tale che le resistenze di pullup interne siano attive.
Nella porta degli switch ho messo anche il gnd in modo che alla pressione di un pulsante il corrispondente pin vada a low. La scelta deriva dal risparmiare spazio e resistenze e anche dal fatto che ho letto quanto ribatito da Leo ovvero che ho bisogno di un segnale low per risvegliare il micro.
Credo di aver necessità dei diodi in quanto il micro andrà in sleep profondo solo dopo alcuni secondi di inutilizzo, quindi con il micro attivo ho necessità di separare gli input altrimenti non saprei con certezza il pulsante premuto.
Il funzionamento dei pulsanti prevede la distinzione tra pressione breve o lunga e in alcuni casi lunga e contemporanea di due pulsanti quindi credo che dovrò restare con l'attuale polling per mantenere il comportamento voluto.
Adesso non ho a disposizione lo sketch ma non ci sono problemi a condividerlo in seguito. Per il momento allego le immagini e lo schema in modo che possiate aiutarmi e capire ciò che sto cercando di fare.

Ovviamente sfrutterò anche un altro pin per mandare in sleep anche l'xbee (quando lo inserirò).
Lo schema per me abbastanza "complesso" prevede la gestione della riprogrammazione del micro come da "guida Menniti", in un primo momento la trasmissione dei dati avverrà via cavo e quando funzionerà il tutto inserirò l'xbee.

Transmitter.sch (880 KB)

Ma se attivi le pull-up interne e monti i diodi collegando gli anodi ai pin, fai scorrere corrente (anche se poca) dai pin. Questo non va bene se l'idea di mettere il micro in sleep era per risparmiare le batteria.

leo72:
Ma se attivi le pull-up interne e monti i diodi collegando gli anodi ai pin, fai scorrere corrente (anche se poca) dai pin. Questo non va bene se l'idea di mettere il micro in sleep era per risparmiare le batteria.

Se non preme nessun tasto la corrente che scorre è quella che basta per tenere l'ingresso alto e questa dovrebbe essere molto bassa, ma quando c'è di mezzo la batteria il conto di quanto bassa è questa corrente si deve fare e si potrebbe finere con il dire che anche se bassa è complessivamente troppo alta. Ora al momento non ho proprio voglia e tempo di indagare circa la corrente necessaria a mantenere alto il pin.

ciao.

Aspe, le pull-up le attiva sui pin PD7, PB0 e PB1. Allora sì, non si scarica la corrente perché a quelle linee ci sono i catodi dei led. Avevo visto male lo schema.

Le R di pull-up interne secondo il datasheet sono da 20/50K.

Ciao, grazie mille delle conferme, ho anche notato un errore nel collegamento dell' AREF e la mancanza di un paio di condensatori (presenti in uno schema postato da astro tempo fa).
Se non ho sbagliato i calcoli con la resistenza da 20K dovrebbero essere 250uA e se fosse 50K 100 uA, verificherò sul campo...
Quando porto avanti il progetto aggiornerò il topic, magari può essere utile ad altri che, come me, sono alle prime armi.
Grazie di nuovo a voi che avete avuto la pazienza di rispondermi

Ciao a tutti,
sono veramente soddisfatto, finalmente il mio primo prototipo funzionante di un progetto :sweat_smile:
Quasi non ci credo finalmente sono risucito a realizzare la scheda anche grazie all'aiuto ricevuto!
A questo punto mi sento in dovere di pubblicare quanto realizzato, magari non serve a nessuno perchè è un progetto un po' strano e dedicato ma non si sa mai.
Anche perché per la realizzazione ho scelto la strada più impervia (almeno per me) ovvero inserire complessità anche se non era necessaria al progetto stesso.
Spiego brevemente cosa fa questo progettino: prende in input da tre pulsanti o da un modulo xbee (attualmente non in mio possesso) e li trasmette via seriale ad un raspberry.
L'alimentazione 5V arriva dal GPIO di raspberry.
Il bello (almeno per me) è che ho inserito alcune porte di comunicazione aggiuntiva che mi permettono di riprigrammare il tutto senza rimuovere il micro (un enorme e doverosissimo GRAZIE al prof. Michele Menniti per la sua guida).
Inoltre una volta alimentato raspberry e quindi anche la scheda il relè mantiene l'alimentazione finchè il raspberry non ha terminato in modo corretto le operazioni di shutdown (necessari un pin aggiuntivo poiché anche quando chiuso correttamente il raspberry mantiene i 5V sul pin relativo).
Allego il file eagle dello schema (non la board perchè l'ho implementata solo per vedere gli spazi necessari alla costruzione della scheda su millefori quindi ci sono piste a 90 gradi che nella realtà non sono così e via dicendo)
Allego anche il codice ancora da verificare a fondo ma dai primi test funzionante.
Grazie di nuovo a tutti!

receiver.sch (550 KB)

Receiver.ino (8.64 KB)

fabpolli:
L'alimentazione 5V arriva dal GPIO di raspberry.

Cosa intendi per GPIO? Un GPIO (General Purpose Input/Output) indica un pin di un microcontrollore. Significa forse che l'alimentazione dell'Arduino lo fornisci da un pin del Raspberry?

Ciao, si mi sono espresso male utilizzando il termine GPIO in quel modo. Comunque si l'alimentazione la prendo dal pin +5V del raspberry presente nella porta identificato come GPIO delle varie documentazioni che si trovano su internet.
Dal GPIO si può anche prelevare i 3.3V ma ho preferito non farlo in quanto la corrente prelevabile è troppo bassa per alimentare l'eventuale XBEE. Nelle prime prove di utilizzo effettuate con arduino+convertitore di livelli 4050 alimentavo quest'ultimo con i 3.3V presi anch'essi dal raspberry.