Problema con Barriera IR

hai detto una scemenza relativa, l'interruzione è una pratica del processore, che consiste nell'interrompere una cosa che sta facendo (ma c'è tutto un criterio sulle priorità) per farne un'altra, quindi non consiste nell'arresto completo delle attività. Comunque qui ti aiuta Leo.
La prova che ti ho consigliato, ma il fatto è che tu non leggi quello che ti si scrive, stai sempre a fare tutto in fretta, senza meditare, non è un bene, si basa sull'idea che il tuo sensore possa lavorare ad impulsi quindi se tu lasci qualcosa fisso ad interrompere il fascio tu ottieni solo un impulso poi ritorna su 1, anche se il fascio resta interrotto, ecco perché dovresti fare una prova ad interrompere e ricollegare il fascio in continuazione, e così dovresti ottenere tanti 1 e ogni tanto qualche 0, poi ti fermi una decina di secondi e vedi se esce sempre 1 e quindi ricominci, per vedere se ricompare qualche 0; se funziona così allora non hai problemi, semplicemente ti serve un sensore che lavori a tempo. La prova di Leo è molto più efficace, in quanto ogni volta che interrompi il fascio devi vedere il led che fa un solo lampeggio, così hai conferma di quanto penso io.

ah quindi nel codice di leo devo far spegnere il led dopo un po'.
Comunque prof intendevo dire che forse non è un ricevitore del genere che dite voi perchè altrimenti mi avrebbe dato un solo 0 e non tutti quegli zeri o sbaglio?
Posso fare un video del comportamento del circuito e farvelo vedere? magari capite meglio che dalle mie descrizioni xD (intendo il circuito col led e il programma suggerito da leo)

@toti:
modifica il tuo programma così:

#define led 6
#define rx 2
byte ledFlag = 0;
void setup()
{
 pinMode(11, OUTPUT);
 pinMode (rx, INPUT);
 pinMode (led, OUTPUT);
 digitalWrite (led, LOW);
 OCR2A = 210;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
 Serial.begin (9600);
 attachInterrupt(0,trovato,RISING);
}
void trovato ()
{
  digitalWrite (led, HIGH);
  ledFlag = 1;
}
void loop ()
{
int i= digitalRead (rx);
Serial.println (i);
if (ledFlag == 1) {
  delay(500);
  digitalWrite(led LOW);
}
}

In questo modo se l'interrupt vede un cambio di stato, hai un'attesa di 500 ms prima che il led venga rispento ed i dati tornino ad essere spediti. Comunque prova anche cambiando modalità dell'interrupt. Da quel che ho capito, il tuo sensore dovrebbe portare il pin a 0 quando viene interrotto, per cui potresti usare anche "LOW" come evento dell'attachInterrupt.
Per il resto ti aiuta Michele che di sensori iR ne sa sicuramente più di me :wink:

figurati Leo, Toti è un bel banco di prova per chi si vuole adoperare per il Forum :sweat_smile:
@ Toti: concettualmente avresti ragione, di fatto io non so se deve uscire uno o più 0, certo è che ogni volta dovrebbe uscire una sequenza simile. Prova lo sketch di Leo, l'unico dubbio che ho, ma vado molto indietro con la memoria...., è che ricordo che quella libreria prevede il falling, il rising, il change e uno solo tra HIGH e LOW, quindi non sono certo che il low sia contemplato, verifica. Io però direi di usare il change, così possiamo sequenziare l'intero periodo di variazione dello stato.

Il segnale LOW è contemplato. E' l'HIGH che non c'è.

OK, grazie, comunque se posso permettermi, prova a fargli usare il CHANGE invece del rising, in questo modo avremo due eventi ad ogni interruzione

Comunque prova anche cambiando modalità dell'interrupt. Da quel che ho capito, il tuo sensore dovrebbe portare il pin a 0 quando viene interrotto

Forse ho capito male ma il ricevitore da 0 quando riceve il segnale e 1 quando viene interrotto ? o il contrario?
Comunque il led mi lampeggia sempre e ogni tanto si ferma per poco, ho usato questo codice:

#define led 6
#define rx 2
void setup()
{
 pinMode(11, OUTPUT);
 pinMode (rx, INPUT);
 pinMode (led, OUTPUT);
 digitalWrite (led, LOW);
 OCR2A = 210;
 TCCR2A = 0b01000011; 
 TCCR2B = 0b00001001;
 Serial.begin (9600);
 attachInterrupt(0,trovato,LOW);
}
void trovato ()
{
  digitalWrite (led, HIGH);
  delay (500);
  digitalWrite (led, LOW);
}
void loop ()
{
int i= digitalRead (rx);
Serial.println (i);
}

Anche mettendo "RISING" a posto di "LOW" il risultato non cambia, mentre con "CHANGE" l'unica cosa che cambia è che all'inizio invece di stare acceso fisso sta spento fisso ovviamente
Allego un video per farvi vedere il risultato.
Sinceramente dal lampeggio del led .... non capisco se il rx riceve o no :.

Video0053.mp4 (3.22 MB)

Allora usa un po' il cervello, se ti muovi a casaccio, a casaccio lampeggerà il LED ammesso che stia funzionando il sensore; Quindi devi darti una regola:
1 - collega ed alimenta tutto e premi il RESET di Arduino (lascia il CHANGE)
2 - mantieni a vista LED e sensore (fascio "collegato") per 15 secondi, il LED deve restare spento senza MAI lampeggiare
3 - dopo i 15 secondi prendi un oggetto e fallo "dondolare" tra LED e sensore, cioè fai in modo da collegare e scollegare il fascio almeno 4- 5 volte, il LED dovrebbe accendersi e spegnersi anche in modo casuale, non importa, basta che dia diversi segni di vita.
4 - a questo punto interrompi in modo fisso il fascio per 15 secondi ed il LED dovrebbe bloccarsi, mi dovrai dire tu se resta sempre spento o sempre acceso
5 - dopo i 15 secondi ripeti la manovra del punto 3
Fammi un riepilogo dettagliato di tutto ciò che succede in realtà punto per punto, e lascia perdere i video, per ora.

Allora quando non ostruisco il fascio, il led lampeggia e a volte rimane acceso pe run po'.
Quando tolgo e rimetto l'oggetto per ostruire il fascio il led lampeggia.
Quando rimango con l'oggetto fermo ad interrompere il fascio, il led rimane per lo più acceso ma a volte fa qualche lampeggio e poi rimane acceso

Prova ad aggiungere una R da 10k tra l'uscita del sensore e 5V e ripeti le prove. Questo comportamento mostra apparente instabilità del sensore. Ti sei ricordato di mettere in serie al positivo del sensore una R da 100 ohm e poi un C da 4,7-47µF tra positivo e negativo del sensore? Guarda che è importante!

Si ho messo tutte le resistenze e il condensatore l'ho messo da 10 nano farad e anche con la resistenza da 10k tra l'uscita e 5v, il led ha lo stesso comportamento

10nF? solito odio verso i condensatori eh? con un 4,7µF c'è più o meno la differenza che passa tra un pidocchio e un cavallo, contento tu...

Tra pin 3 e pin 2 devi mettere un C elettrolitico da minimo 4,7µF a massimo 47µF col + sul 3 e - sul 2

quindi 10µf rientra nel range direi

e infatti l'ho messo da 10 micro farad XD ho sbagliato a scrivere

no, così non si può, continua a divertirti, quando scopri qualcosa di interessante ne riparliamo, a starti dietro c'è solo da impazzire

Mi sa che faccio prima a comprare un ricevitore nuovo....

direi di sì, TSSOP34838 e andiamo sul sicuro.

ok appena posso lo compro