Coda di output

Buongiorno,

vi scrivo perche sono ad un passo dalla realizzazione del mio progetto (controllo tapparelle via web), ho realizzato l'interfaccia html e il codice di gestione delle chiamate ad arduino e dell'aggiornamento dei dati in pagina web. Mi son posto questo obiettivo: creare una coda di output. Ho 6 tapparelle da abbassare, ogni tapparella ci mette 30 secondi, ha un finecorsa interno che taglia la corrente quando arriva a fondo corsa. Io vorrei che, premendo il relativo pulsante in pagina grafica, venga inserita quella tapparella in una coda di output in modo che non devo aspettare 30 secondi per abbassarne un'altra, ma programmo la sequenza e arduino tiene 30 secondi un'uscita asserita e poi passa alla successiva. Per il pulse di 30 secondi ho trovato questo link che mi sembra faccia al caso mio:
http://playground.arduino.cc/Code/Timer

Dopo tutta la parte di interfaccia tra webserver e html arriva il momento della registrazione del comando dato da pagina web, lo gestisco cosi:

void writeIO(char outputType, int pin, int output)
{
  if (outputType == 'D'){
    (output-48 == 0) ? digitalWrite (pin-48, LOW) : digitalWrite (pin-48, HIGH);
  }
}

Questa funzione dovrà essere modificata, qui che dovro inserire il comando nella coda, e poi eseguire la coda nel setup().

Però non riesco a trovare una soluzione per creare la coda, che struttura e tipi di dati usare, e come fare per gestirla nel setup()...

Mi potete aiutare?

perchè devi aspettare 30 secondi e chiuderne una alla volta?

non vorrei che l'assorbimento dei rele superi la corrente max erogabile da arduino...
mod: 30 secondi è la durata dell'intera corsa di chiusura di una tapparella

amacbr:
non vorrei che l'assorbimento dei rele superi la corrente max erogabile da arduino...
mod: 30 secondi è la durata dell'intera corsa di chiusura di una tapparella

Io alimenterei i relé non da Arduino ma da una alimentazione separata.

la scheda Rele è alimentata a 12 volt, ma ha anche dei pin 5V. Ho gia aperto un post chiedendo se fosse sufficente alimentarla a 12V ma devo provarla, la scheda è questa
http://www.ebay.it/itm/16-canali-channel-5V-Rele-Relay-Board-Module-AVR-PIC-ARM-DSP-MCU-/170915329028#ht_2961wt_1397
e il post è questo

Ancora non devo collegare arduino alla scheda, dici che potrebbe essere possibile eccitare 6 rele tutti insieme?

A bordo di quella scheda vedo un regolatore fatto con un LM2576. Vedendo il suo datasheet, leggo che può erogare fino a 3A. Siccome il produttore di quella scheda dice che i relé necessitano di 20 mA di corrente di pilotaggio, 16 relé tutti attivati contemporaneamente assorbirebbero 20*16=320 mA. Quindi ben dentro le capacità di quel regolatore (basta che tale assorbimento sia retto dall'alimentatore a 12V che stai usando).

quindi mi confermi che non ho bisogno di collegare la 5V da arduino per pilotare la scheda?

Non solo, mi sembra che abbia 8 optoisolatori e 2 Darlington Driver 8-Channel ULN2803, ma non li leggo quei chip, lo puoi confermare la sigla 2803 ?

Quella scheda è strana. Ci sono 16 relè, 2 integrati driver 8 uscite (forse ULN) e 16 accoppiatori ottici.

Rimane da capire lo schema di collegamento interno.

Se le 2 porte di arduino pilotano i 16 accoppiatori ottici c'è da tenere in conto quanto corrente assorbono dalle porte di arduino. Se ogni led del accoppiatore ottico deve essere portato in conduzione con 20mA 20x16 = 320 mA che sono richiesti al microcontroller e sono tanti.

Questa scheda dovrebbe essere pilotabile da arduino con un impegno di corrente di pochi mA (1, 2mA) per tutti e 16 i relè altrimenti il vantaggio dov'è?

A me quella scheda non piace per nulla, mi sembra progettata da chi non sa nulla di elettronica, ma purtroppo non posso giudicare in mancanza di schema teorico.

Se dovessi fare una scheda simile userei direttamente gli integrati driver e senza accoppiatori ottici, che sono una inutile ridondanza, come pure l'alimentatore switching a 50Khz da 3 A mi sembra una ridondanza, come pure la tensione di 5V non mi sembra adatta comandare 16 rele. Allora relè da 24Vdc (o 12) che assorbono meno corrente, che mi permette di usare un regolatore più economico. I driver si comandano con una corrente richiesta ad un pin di arduino minore anche di 1mA per pin, ma anche se fosse 1mA si tratterebbe di assorbire 16 mA in totale corrente largamente gestibile da arduino.

Boh.

purtroppo non ho la scheda sottomano per verificare la sigla dei chip!
Il punto è questo: se posso pilotare tutti i rele insieme evito di programmare la coda di output. Purtroppo la mia ignoranza in fatto di elettronica non mi permette di stabilire se posso farlo oppure no, e purtroppo ancora devo provare la scheda.
A breve proverò a pilotare un rele collegando il pin di un DO di arduino con un pin della scheda e il GND di arduino con il GND della scheda, alimentando la scheda a 12V.
Nel caso non funzionasse potrei provare a collegare anche il pin 5V di arduino con il pin 5V della scheda.
Una delle due configurazioni dovrebbe funzionare.
Ma questo non risponde alla domanda: posso pilotarli tutti insieme?

Ce l'hai un tester?

collega i 6 comandi 5v tutti insieme "NON prelevare i 5v da arduino!, ma da un alimentatore 5v diverso" e misura con un amperometro quanta corrente totale prende per 6 relè, una volta che sei certo di quanto assorbimento hai su un pin ti fai i tuoi conti

ciao

ok, a breve faro queste prove, spero che il mio alimentatore arrivi fino a 5V.
Vi faccio sapere.

ho trovato la documentazione della scheda, ve la posto mentre provo a capirci qualcosa.

16 relay 2.pdf (55.1 KB)

16 RELAY.pdf (491 KB)

Allora io non ho la scheda e non capisco cosa sono nella realtà i componenti contrassegnati con da PR1 a PR8.

I relè sono da 12V per questo è necessario fornire 12V alla scheda, da questa sorgente di 12V ne viene derivata una da 5V attraverso il LM2576, questa tensione si trova nel connettore Low Level Input a 20 pin.

La tensione di 5 volts è richiesta perchè gli accoppiatori ottici necessitano di una corrente di 15/20 mA ognuno per essere eccitati, la corrente serve per pilotare il led interno ad ogni accoppiatore ottico.

Per tanto per pilotarli insieme devi procurarti dei transistor o degli integrati ULN2803. Diversamente tutta la corrente di ogni accoppiatore (15/20 mA) graverà su ogni uscita di Arduino portando l'assorbimento complessivo oltre il consentito.

Tuttavia sapendo cosa sono quei componenti PR1, PR2 ecc, potrei dire meglio, in quanto potrebbe essere possibile comandare i relè "bypassando" gli accoppiatori ottici e collegandosi direttamente agli ULN2803 presenti nella scheda relè.

Io non ho detto niente, ma vedo sperimentatori sentirsi più sicuri usando relè connessi attraverso l'uso di accoppiatori ottici, i quali di per se sono in grado di comandare fisicamente un relè. Ma questa pratica non ha niente di sicuro in più e mette a anzi mette a rischio il microcontroller in caso di molti relè. In quella scheda gli accoppiatori sarebbero in grado di fornire la commutare la corrente necessaria alla eccitazione del relè, invece vengono connessi agli ingressi del ULN2803 che un driver.

Vedi di fare una foto della scheda che mostra i connettori PR1 to PR8, così ti so dire di più.
Dimmi anche quale è la scheda Arduino che intendi usare.

Ciao.

vi allego le foto della scheda

http://sdrv.ms/XyPhrR
http://sdrv.ms/V6gySi

Mi dispiace ma quei link a me non funzionano causa firefox non aggiornato.

PS: non ho intenzione di aggiornare firefox, quello che ho è perfetto.

Ciao.

son riuscito e sto facendo un po di prove, ma c'è un problema a monte del'assorbimento: riesco a comandare un rele ma al contrario!
quando leggo il bit 0 il relè si accende, quando lo porto a 1 il rele si spegne! se tolgo la corrente ad arduino il rele si accende!!
ho collegato un'uscita digitale (in questo caso la 5) sull'ingresso digitale del Low_level_iput numero 5, e il gnd con il gnd. Non ho collegato la 5v.

Si il comportamento è corretto, se guardo lo schema l'anodo del diodo led interno all'accoppiatore ottico (U19,U18 ecc) è collegato a +5V tramite una resistenza di valore che dipende dal componente siglato PR?.

Pertanto quando dal pin di arduino escono +5V il rele non si eccita, se dal pin escono circa 0V il relè si eccita.

Risolvi usando dei transistor o 2 ULN, ma con i transistor ti servono anche 16 resistenze da 10k.

Come collegare i 2 ULN lo devi dedurre dallo schematico della scheda relè ed è semplice perchè quella scheda già ne adopera 2.

È evidente che un povero cristo compra una scheda relè per evitare di pasticciare con pcb millefori e altri componenti elettronici, ma in questo caso sei obbligato a pasticciare o ad acquistare un'altra scheda relè decente.

Il relè poteva essere collegato direttamente agli accoppiatori ottici, che non sono necessari, perchè il relè è già un disaccoppiatore non ottico ma meccanico. Allora la cosa sensata è usare i relè con gli ULN senza gli accoppiatori ottici, che ti risolvono il problema dell'isolamento e della corrente necessaria per ogni relè che è inferiore ad 1mA, 1x16= 16mA che sono erogabili dai pin di arduino come del resto da tutti i microcontroller del mondo, o meglio anche altri microcontroller non sono in grado di fornire tutta la corrente rischiesta da quella scheda relè.

Quello che ha progettato quella scheda mi sa che di elettronica non ne capisci un tubo.

Ciao.

potrebbe anche modificare la scheda unendo con una punta di stagno i pin degli accoppiatori ottici fino ad entrare direttamente nel uln

Purtroppo con l'elettronica non me la cavo, ho ovviato tenendo le uscite di arduino sempre asserite e mettendole a 0 per eccitare il rele. Ho inserito nel SETUP del programma la scrittura a 1 dei pin interessati. Per il resto funziona tutto; non mi rimane che verificare quanta corrente assorbono tutti i rele ma per curiosità ho provato ad eccitarne 2 insieme, poi 3, fino a tutti e sei 6 e non ci sono mai stati problemi.
Vi riepilogo come ho fatto:
uso arduino UNO + ethernet shield, ho collegato le uscite digitali di arduino interessate ai pin della scheda, ho collegato il GND con il GND della scheda, la scheda alimentata a 12V con alimentatore esterno, arduino alimentato da usb. Su arduino ho programmato un webserver che su richiesta http invia una stringa JSON con lo stato dei contatti, e riceve sempre tramite http richieste per la scrittura dei bit. In pagina grafica ho usato ajax per leggere e scrivere. Ho programmato lo script per inviare un comando di eccitazione allo scatenarsi dell'evento onMouseDown su un pulsante, e il comando di diseccitazione sull'evento onMouseUp. La prossima modifica sarà un temporizzatore, in modo che non c'è bisogno di diseccitare un rele tramite la pressione di un tasto, ma vorrei che lo faccia arduino x secondi dopo l'eccitazione. Ho fatto poche prove con al libreria Timer ma non ha funzionato molto bene, sicuramente non l'ho usata nel modo giusto.
Per ora comando solo la discesa delle 6 tapparelle, vorrei riuscire a controllare anche la salita ma non ho abbastanza uscite digitali. Probabilmente il prossimo acquisto sarà arduino MEGA sempre con ethernet shield.

Direi che il motivo per cui ho aperto il post è decaduto, non ho piu bisogno di una coda di output se riesco ad eccitare insieme tutti i rele.