Gestione Interrupt e BUS in contemporanea

Salve,

volevo capire se è possibile con Arduino uno, mega e nano gestire in contemporanea: - BUS per la comunicazione Master/Slave con altri arduini - Interrupt per pulsanti

In pratica, vorrei instaurare una comunicazione tra i vari arduini attraverso il BUS(RS485) e lasciare ai singoli arduini la possibilità di gestire gli interrupt si pin.

Esempio : Se premo un pulsante vorrei eseguire subito uno spezzone di programma/procedura che modifica un flag o memorizzi l'attimo in cui lo stesso e stato fatto e in contemporanea non perdere la possibilità di comunicare con il master/slave.

Avete idee?

Thanks

Certo che è fattibile e anche in più modi. Se colleghi un pulsante per pin o anche se usi una matrice di pulsanti. Tutti i pin hanno il trigger PIN_CHANGED, solo che ci sono 3 ISR, una per gruppo di pin. Cerca nel playground la lib (credo) interruptPinChanged (ho connessione internet pessima).

Ciao.

Eseguirò una ricerca sui punti da te indicati.

Sai consigliarmi qualche topic/tutorial in italiano per la creazione di un BUS Master/Slave tra gli arduini?

Gestire i pulsanti con degli interrupt è sempre problematico, dato che rende difficoltoso il debounce, e comunque non è nemmeno necessario, visto che non sono segnali che cambiano in modo estremamente rapido. Puoi benissimo gestirli in polling nel tuo loop().

Per la RS485 c'è sicuramente in giro qualche libreria pronta all'uso, prova a cercare! Mi pare ce ne sia una di Nick Gammon, uno dei guru del forum.

L'obiettivo finale sarà quello di gestire le tapparelle applicando logiche sul fatto che il pulsante resti premuto per un "delta".

Al momento sto decidendo l'architettura. Le opzioni sono: - Avrò un arduino master e tanti slave per quante tapparelle; ogni slave avrà il compito di gestire i pulsanti e i relè della tapaprella oltre che ricevere i comandi dal master per la chiusura automatizzata; - Avrò un arduino master che pilota tutte le tapparelle e gestisce tutti i pulsanti;

Al momento non ho la possibilità di eseguire dei test perchè non ho l'hardware con me (sono in trasferta).

Ho spiegato questo perchè ciclare poi eventualmente sullo stato di "20 bottoni" (ipotizzando 10 tapparelle) potrebbe poi generare qualche "delay".

Alberto

20 pulsanti per 62.5 ns ciascuno? :sunglasses:

Comunque potresti forse fare una via di mezzo con uno per stanza.

Non mi è chiaro cosa volevi dire.

Ogni tapparella dovrà avere due pulsanti (uno salita e uno di discesa) e gestire due uscite (salita e discesa) - pertanto devo utilizzare 4 pin dell'arduino (2 in input e 2 in uscita).

A secondo della soluzione scelta, dovrò gestire nel primo caso un'estensione (MCP23017?) della GPIO dell'arduino, mentre nel secondo caso mi basterà instalalre un arduino nano a tapparella (slave).

Chiaro ora il concetto?

Volevo dire che l'Arduino va pur sempre a 16 MHz, per cui la lettura di una porta, se fatta "bene", impiega 62.5 ns. Anche gestendo la cosa in polling, credo che si possano pilotare qualche centinaio di migliaia di tapparelle prima di avvertire delay significativi. È appunto più difficile trovare così tanti pin di I/O :D.

Come giustamente dici, puoi usare qualche I/O expander o anche dei banali shift register. Ci sono delle librerie che te li fanno usare in modo del tutto simile ai pin normali!

Poi dicevo che, in alternativa, forse puoi riuscire a pilotare tutte le tapparelle di una stanza con un solo Arduino, trovando una sorta di compromesso tra l'averne uno solo e uno per tapparella.

Se riesci a indicarmi qualcosa su shift register ti sarei grato.

Il fatto è che vorrei progettare una soluzione "generalizzata" da condividere con tutti il forum e non specifico al mio caso. Mi piacerebbe anche creare poi il PCB finale con fritzing ... Ora mi accontento di creare il prototipo.

Io ho già il mio sistema BTICINO a due fili ... e non è detto che non lo sostituisca.

Alberto

Dai un'occhiata qua, ad esempio:

http://bildr.org/2011/08/74hc595-breakout-arduino/

Comunque non l'ho detto perché mi sembrava ovvio, ma potresti anche usare un Arduino Mega :D.