Buon pomeriggio,
Ho realizzato un sistema contapersone in ingresso/uscita attraverso un varco, impiegando un MKR 1010 WiFi e una coppia di interruttori infrarossi E3JK-R4-M2. Affiancando i 2 sensori, riesco a determinare l'ordine con il quale vengono impegnati, e stabilire in quale senso la persona sta attraversando (ingresso o uscita). Incremento o decremento una variabile ed invio periodicamente il dato a un cloud.
Il sistema essenzialmente funziona, ma, rilevo errori del senso di passaggio, che aumentano all'aumentare della velocità della persona.
I due infrarossi sono montati parallelamente ad una distanza di 3 cm (non posso aumentarla), e secondo un calcolo che credo giusto, una persona che cammina a 5 Km/h li impegna a distanza di circa 21 ms uno dall'altro. Ho paura che i rele montati a bordo di ogni sensore abbiano velocità di reazione diverse fra loro e per giunta non sempre uguali, quel tanto che basta a scambiare l'ordine col quale le rispettive fotocellule sono state impegnate.
In linea, per ora teorica, si potrebbero sostituire i rele a bordo di ogni sensore con qualcosa di più reattivo ? Se si con cosa ? transistor ? mosfet ? Le mie conoscenze elettroniche sono limitate, ma se mi indirizzate verso una soluzione, non ho problemi a sperimentare.
Oppure esistono apparati simili, ma più reattivi, a prezzi ragionevoli ? Io non ne ho trovati.
Nelle caratteristiche dichiarano un tempo di reazione di 30ms che certamente non sarà precisissimo e perfettamente costante; avendo tu stimato una differenza di 21ms, se il primo impiegasse 41ms e il secondo 19ms, il secondo scatterebbe 1ms prima del primo! Se li scambi, cioè li monti e li colleghi scambiati, che succede? Se uno è costantemente più lento e lo monti come seconda barriera, dovrebbe funzionare meglio.
Considera anche che, così vicini, i raggi dell'uno possono arrivare al sensore dell'altro... Dovresti incrociarli, montando ciascun trasmettitore accanto al ricevitore dell'altra barriera.
Togli il relè e il diodo metti una resistenza al posto del relè (10k dovrebbe andare bene) e prelevi il segnale dal lato connesso tra transistor e relè.
Ottieni cosi un comando digitale.
Devi solo controllare che la tensione in uscita dal sensore sia coorente con arduino.
Se ho capito cosa proponi, direi che l'errore si presenterebbe nel senso di attraversamento opposto. Ricordo che il sistema deve contare in entrambi i sensi.
Non mi pare di rilevare un problema del genere. "Incrociare" i sensori è comunque un ottima idea, ma comporta ulteriore cablaggio. lo farò solo se ce ne sarà bisogno.
Questa è l'indicazione che speravo di ottenere. Per ora ho smontato un sensore e, senza rimuovere componenti, rilevo sulla bobina una tensione di 8,8 V, quando eccitata.
Come la abbasso a 3.3 ?
Con un partitore di tensione, fai attenzione che quando togli il relè potresti avere 12v, e per sicurezza in parallelo alla resistenza a massa uno zener da 3.2V.
Sì, hai ragione.
Il problema si manifesta allo stesso modo in un verso di attraversamento e nell'altro?
Devi scoprirlo: se è quello il problema, quello devi risolvere! Comunque, mi sembra impossibile che due raggi paralleli a 3 centimetri di distanza non interferiscano uno sull'altro sui sensori.
Effettivamente togliendo il rele, ho 12V. A forza di prove sono arrivato a 4.4 con una resistenza da 100K. Considera che in gioco c'è anche un led di controllo con relativa resistenza, che vorrei mantenere.
Per quanto riguarda il circuito che suggerisci; Parli di questo ? DIODO ZENER - STABILIZZATORE DI TENSIONE - DIMENSIONAMENTO
Uhm, 5 km/h sono 5000/3600=1.38 m/s quindi per percorrere i 3 cm esssendo 0.03 m il tempo è 1.38*0.03*1000=41 ms non 21. Detto questo, è possibile che i relè meccanici non siano adeguati per questo tipo di rilevazione, mi chiedo perché tu abbia scelto la versione a relè quando stando ai cataloghi ne esistono con uscita NPN (es. "E3JK-RR12 2M").
In ogni caso, se devi usare quei sensori, secondo me invece di fare cose "invasive" potresti provare a vedere di sostituire i relè meccanici con i relè a stato solido visto che hanno tempi di commutazione generalmente tra 1 e 5 ms (devi solo capire la tensione di attivazione ed installare quelli compatibili) per cui collegando le uscite NO una a GND e l'altra al relativo pin Arduino (impostato INPUT_PULLUP) puoi ricevere su Arduino il segnale LOW corrispondente all'impulso (ossia la transizione "FALLING").
Grazie docdoc.
Ho fatto il tuo stesso calcolo, ma scritto male il valore. 41 è corretto, non 21.
Interessante il sensore NPN. Avevo scelto quello a relè meccanico perchè più "comprensibile" per un "non-elettronico" come me, e molto più semplice da reperire.
I relè a stato solido, dovrebbero avere identiche dimensioni e piedinatura di quelli attuali (meccanici) per trovare posto sulla scheda del sensore. Cercherò.
Grazie
Dipende dalla dimensione del bastone. Una bacchetta da sushi, passa "inosservata", una mazza da baseball no. Inoltre c'è maggiore sensibilità vicino al sensore, e minore verso il catarifrangente.
Potresti usare anche lo schema come datuo link ma se il diodo zener si rompe ad arduino arriverebbero circa 12v friggendolo. Per risolvere devi mettere una resistenza in parallelo allo zener (il condensatore va tolto perche avresti un ritardo nella ricezione del segnale digitale da parte di arduino.
Usa al posto di RZ una resistenza da 33kohm e in parallelo allo zener 12kohm avrai circa 3,3v (controllala prima di collegare arduino senza lo zener collegato. Potrebbe variare per la tolleranza delle resistenze) se la tensione è corretta aggiungi lo zener per avere la doppia sicurezza di non avere una tensione superiore ai 3,3v sui pin di arduino.
Finora non abbiamo assolutamente preso in considerazione i "rimbalzi" dei contatti dei relè!!!
Quando due lamelle si chiudono in un relè o in un interruttore, la chiusura non è immediatamente stabile, ma si verificano dei brevissimi rimbalzi che provocano la riapertura e la richiusura dei contatti che dal velocissimo microcontrollore vengono rilevati come normali aperture e chiusure.
A questo punto dovresti pubblicare lo schema elettrico e, cosa che avresti docuto fare fin dall'inizio, il programma.
Prova anche a mettere un condensatore da 100nF (100.000pF) in parallelo ai contatti dei relè.
Giusta osservazione. Conosco il fenomeno e l'ho valutato fin dall'inizio. Invio a monitor seriale il cambio stato dei pins, e non vedo mai debouncing.
Questo non l'ho capito. Io sto cercando di ridurre al minimo i tempi di reazione. Non capisco come può aiutarmi un condensatore, che per sua natura crea un ritardo.
Appena possibile pubblicherò volentieri schema e codice.
Grazie per l'interessamento.
Se ci sono rimbalzi, bisogna eliminarli... Considera che stiamo facendo delle prove, perché non sappiamo da che cosa dipenda il problema! Dovresti collegare un oscilloscopio al segnale che arriva, sincronizzarlo correttamente e vedere se le chiusure e le aperture sono pulite o no.
Forse intendevi "bounce". Ma sinceramente se il relè meccanico ha un tempo di reazione nominale di 30 ms o più, io non mi fisserei con il problema del debounce hardware.
Se il relè mandasse un segnale assolutamente netto e squadrato (ed i relè che ho usato non lo hanno MAI, dubito che questi siano così precisi), e se non ci sono rimbalsi (che puoi solo mitigare con appositi componenti discreti) o, peggio, interferenze di altro genere, e se il ritardo fosse identico tra i due sensori e costante ed indipendente da altri fattori, allora il problema non si porrebbe. Ma ci sono troppi "se" per i miei gusti...
E dato che pare che così non sia (altrimenti non avresti aperto questo thread), al posto tuo, come dicevo, valuterei l'uso dei relè a stato solido che ti darebbero velocità, stabilità, oltre comunque a mantenere il disaccoppiamento col resto del tuo circuito per via dell'optoisolatore interno.
Se riesci a determinare quale sia la tensione di controllo del relè fisico, prendi un RSS e fai un esperimento.
Ok. posto che non ho un oscilloscopio e non intendo procurarmelo, la prova che ho fatto è:
Interrompere il raggio del sensore per 50 volte, inviando al monitor seriale di Arduino, il cambio stato del relativo pin. Ogni volta vedo un singolo cambio stato.
Credo di poter affermare che anche se si verificano rimbalzi, baunce o debaunce o come si chiamino, Arduino non se ne accorge e questo mi basta e avanza.
No. ma abbiamo una indicazione importante, che ho scritto all'inizio:
Ovvero: Si passa piano e funziona. Si passa velocemente, e il senso di passaggio viene invertito. Non dico che sia ovvio, ma mi orienterei sul ritardo dei rele, più che sul rimbalzo o sui raggi che si incrociano. Anche lo schema elettrico e il codice (che invierò come promesso) sono poco "imputabili", secondo me.
Come da suggerimenti di Arco, ho fatto le seguenti prove:
Arduino è a destra nello schema
Hai tolto i relè e diodo e messo la resistenza sui contatti della bobina del relè?
Fai prima la prova senza zener senza collegarlo ad arduino.
Lo zener va messo come nella prima foto.
Dalle misure che indichi mi sembra che hai usato un diodo normale non uno zener.
Con questa modifica ottieni un contatto pulito senza rimbalzi che avevi con il relè
Si, tolto il rele (la bobina era sui contatti a sinistra nello schema) ed il diodo.
No, non ho messo nessuna resistenza al posto della bobina. Solo quelle che vedi nello schema.
Quello che mi hanno venduto come diodo zener riporta: C3V6PH
A sx (sui contatti ex bobina) ho 11,88V
Senza zener (solo le due resistenze), ottengo 3.15V sui contatti a dx
Aggiungendo lo zener C3V6PH ottengo 1.72V. Ne ho provati 2 per scrupolo.
Ho provato anche uno zener da 2.7V e ottengo 3.15V
Ma lo zener non dovrebbe stabilizzare la tensione alla soglia (2.7) ?
Per ora non ho mai collegato Arduino.
Probabilmente dirò una stupidaggine: Non mi devo preoccupare della corrente ?
Non potrebbe essere talmente bassa da "non attivare" lo zener ?