sto costruendo una semplicissima fotocellula ad infrarossi con emettitore e un ricevitore a 940 nm acquistati su internet.
il sistema funziona con uno script elementare, in cui il loop esegue la lettura ciclica del ricevitore. In particolare, connesso in pull_down con una resistenza da 10K, il ricevitore produce un segnale analogico pari a 146 quando è illuminato e pari a circa 0 quando l'emettitore è schermato.
vorrei trasformare lo script utilizzando un interrupt, ma al momento non sembra funzionare. secondo voi, devo cercare un errore di programmazione nel mio script o nella cablatura dell'hardware, oppure ritenete che ci sia un problema fisico alla base (per esempio il segnale analogico è troppo debole per essere rilevato da un pin digitale)?
in quest'ultimo caso, come si può affrontare il problema?
Al PIN digitale deve arrivare un segnale digitale non analogico, devi condizionare il segnale in uscita al fotodiodo o fototransistor mediante un AGC e un comparatore o almeno un comparatore, immagino che non usi nessuna portante, ne a frequenza custom ne a 38khz che sarebbe lo standard per questo genere di oggetti
Come ha accennato @icio, per usare un interrupt ti serve un ingresso digitale e non analogico. Puoi sostituire il sensore con uno dotato già di un circuito che fornisce un segnale digitale al superamente di una certa soglia, tipo QUESTO che si regola tramite un trimmer.
Se vuoi comunque approfondire e cercare eventuali alternative, per darti qualche risposta più precisa dovresti intanto postare il link a questo sensore ossia la coppia "emettitore" e "ricevitore", come sono connessi ad Arduino (anche uno schemino fatto a penna, fotografato e incollata qui la foto), e se possibile posta comunque anche lo script (racchiudendolo tra i tag "code").
Poi questo è un progetto semplciemente "educativo" per far capire come funziona una cosa del genere (e quindi non ha uno scopo reale e "pratico") oppure verrà usato per qualche scopo (e quindi quale? Contare le persone che entrano in un locale? Contare i pezzi che passano su un nastro?...).
A quel punto potrai ricevere sicuramente consigli più "mirati", che riguardano forse anche l'hardware.
grazie, sei gentilissimo.
la tua risposta è decisamente più utile e costruttiva di quella precedente.
avevo capito che, per attivare l'interrupt è necessario passare dal pin analogico a quello digitale. ho letto che i pin digitali del processore atmega32u4 possiedono una soglia di input particolarmente bassa (Low VoltageTTL) (uso un pro micro) e questo mi faceva pensare che il pin di interrupt avrebbe potuto riconoscere ugualmente il segnale del mio ricevitore.
come si può vedere nel link, sto usando una semplicissima coppia di diodi Hailege, che ho acquistato senza assolutamente curarmi di verificare le specifiche .
siccome l'esperienza mi ha detto che le cose non funzionano, ho postato qui.
nel frattempo, sto cercando di utilizzare un transistor tra quelli che ho in casa.
Per gli interrupt tipici di Arduino Uno R3 non si può usare un qualunque pin digitale non analogico, ma bisogna usare solo il 2 (Interrupt 0) o il 3 (Interrupt 1). Per altri pin bisogna usare un Pin Change Interrupt, ma bisogna operare da fuori dall'ambiente Arduino:
C'è una bellissima libreria che gestisce TUTTI i tipi di interrupt su AVR (ad altre architetture) ... EnableInterrupt ... probabilmente una delle più complete
Non avevo considerato possibili librerie.
Io, quando li ho usati per il provacavi LAN per riconoscere la durata degli impulsi sui singoli conduttori, ho fatto tutto a mano, ma non è stato difficile.
E non vanno bene se vuoi usare un interrupt, ti serve "qualcosa" che di cambi lo stato di una uscita digitale da LOW a HIGH (o viceversa) al superamento di una certa soglia. Questa cosa te la fa il circuito (come per quello del link che ti avevo postato) che è collegato al ricevitore IR, che confronta il segnale con il riferimento (che imposti via trimmer) ed n uscita dà solo un segnale digitale, al quale puoi associare un interrupt (come diceva @Datman , dovrai usare il pin 2 o il 3, lascia perdere gli altri discorsi).
Quindi un fotodiodo "nudo" non ti basta, devi acquistare un sensore IR con quel tipo di circuito e fare le prove in quel modo per capire se e come usarlo nella tua applicazione.
PS: nel tuo caso, non avendoci ancora descritto l'ambito nel quale lo vuoi impiegare, non possiamo dirti di più ossia se basti lasciare quell abasetta com'è oppure se staccare il diodo IR per metterlo dal lato opposto come "barriera", o usare direttamente quello che già hai. Cosa devi rilevare? Un oggetto vicino o lontano? E lontano quanto? Ci "passa" o resta fermo? Eccetare...
Per favore spiegaci lo scopo di questa cosa, e magari anche qualche disegno o foto, così capiremo meglio cosa ti potremmo consigliare.
Se per l'uso che ne devi fare va bene la misura 0/146 (che dalle informazioni in nostro possesso non possiamo calcolare a quale tensione Vmis corrisponda), allora bisogna interporre un comparatore di tensione a soglia regolabile che fornisca un'uscita digitale: LM311
(esempio)
Al di là delle altre considerazioni legate all'hardware (il mio consiglio resta quello di provare ad usare un modulino già fatto che ti dà una uscita digitale e quindi puoi impostarci un interrupt), mi resta comunque in testa la domanda: "perché?"
Perché hai necessità di usare interrupt? Non mi pare che sia un programma complicato né che ci siano requisiti di elevata precisione temporale (quantomeno senza una spiegazione del progetto e suoi scopi, come chiedevo fin dal mio post #3, incluso l'ambito se educativo o operativo per qualche scopo particolare).
A questo punto, scusami, ma o spieghi e descrivi bene il progetto ed i suoi requisiti ed ambito, e magari posti anche l'attuale sketch (magari se hai problemi di temporizzazioni è perché usi i delay() invece di millis()?), oppure tutto il discorso è talmente evanescente da non essere particolarmente utile per te, ma diventa frustrante per noi che dobbiamo cercare di indovinare...
suvvia, non te la prendere.
finalmente ho ricevuto una ricca batteria di resistenze.
proteggendo l'emettitore con un coppia in parallelo di 220 Ohm (dunque 110), ottengo un segnale analogico ben superiore a 400 (se non sbaglio, la conversione in Volt si ricava ponendo 5V a 1023), che corrisponde a un 1 fisso sul digitale del micro. non pensavo che un emettitore alimentato a 5V potesse generare un segnale così solido sul ricevente. Adesso mi sono fatto un'idea migliore del meccanismo di soglia del segnale digitale del mio pro micro.
per la cronaca, prima usavo una coppia da 560 e non bastava.
in realtà la fotocellula che mi serve costruire non deve lavorare in condizioni particolarmente critiche. i diodi sono disposti uno di fronte all'altro a pochi centimetri di distanza, per essere oscurati dal passaggio di un cartoncino sottile.
quanto al perché dell'interrupt: credo che sia il modo corretto di utilizzare la fotocellula. oggettivamente, il ciclo continuo, per quello che sto facendo adesso, è pressoché equivalente, ma usare l'interrupt mi sembra decisamente preferibile.
grazie a tutte per le risposte interessanti che ho ricevuto.
Ripeto, quel modulino che ti ho indicato è più che sufficiente (è il classico sensore di ostacoli, e non è neanche realmente necessario mettere il led dal lato opposto, basta tenerlo così com'è con la coppia che lavora in riflessione) e ti permette di impostare persino un interrupt. La scelta è tua ovviamente, se fare una cosa che si fa da decenni per rilevare un "ostacolo" oppure impelagarti con transistor, resistenze, ed altre considerazioni: ne vale la pena? Fare un circuito fatto da te è possibile, e se vuoi una uscita digitale con una soglia devi introdurre un operazionale ed un trimmer per stabilire la soglia di intervento. Praticamente quelo che già ha onboard quel modulino...
Questione di gusti o di implementazione, e dipende anche dalla frequenza degli eventi o dal tempo di risposta. Se lo sketch non deve fare altro mentro "conta", va bene pure lavorare nel loop() senza usare l'interrupt. Altrimenti si, ovviamente usare una ISR semplifica la gestione e permette di tenere "libero" il processore per fare altro mentre si aspetta un evento.