Ciao a tutti 8)
con 3 IR e un Tsop da 38 khz ho realizzato una barriera infrarossi con una portata di circa 5 metri(anche di più al buoio).Devo dire che dal punto di vista hardware tutto risponde molto bene.
la portante da 38 khz è stata realizzata con un ne555.
Siccome non ho una modulante ma solo,appunto, un "treno continuo" da 38khz (portante), il ricevitore è sensibile anche a tutte le interferenze di altri segnali ir a 38khz modulati come appunto tutti i telecomandi in casa..
Cosi senza realizzare un segnale modulante pensavo di risolvere la cosa a livello software.
Anzitutto il ricevitore Tsop da sempre segnale HIGH, mentre quando viene irradiato da una frequenza a 38Khz restituisce segnale LOW continui per un tot di tempo fino a tornare ad High anche se gli IR continuano ad irradiarlo..
Ho pensato quindi di usare il comando "pulseIn" (Arduino - PulseIn) in modo da calcolare il tempo in microsencondi durante il quale il segnale si trova in LOW.
Dal seriale ho notato,come era prevedibile, che in un segnale modulato qualsiasi solitamente il segnale LOW resta per brevi istanti (massimo 600 microsecondi) mentre con il "treno" della portante fissa arriva anche a 10.000 MicroS e ben oltre...
Mi sono dunque chiesto...basta settare che il mio attuattore (in questo caso il led) si accenda se la durata dell'impulso LOW è superiore a 600 nel mio caso.. ma non è andata come speravo: Con l'esempio sotto il led non si accende ne con un segnale modulato ne con barriera..se invece setto una durata inferiore a 600 mi funziona giustamente solo se riceve segnale modulato e non per la barriera..strano
Questo è il codice:
//BARRIERA INFRAROSSO ----> >4 metri (3 LED IR 940 NM)
int rosso = 13;
int ricevitoreIR = 2;
unsigned long durata;
unsigned long frequenza;
void setup() {
pinMode(rosso,OUTPUT);
pinMode(ricevitoreIR,INPUT);
Serial.begin(9600);
}
void loop() {
durata = pulseIn(ricevitoreIR,LOW);
Serial.println(durata);
int i = digitalRead (2);
if ((durata>660)& (i==0))
{
digitalWrite (rosso,HIGH);
delay (500);
digitalWrite (rosso,LOW);
delay (500);
digitalWrite (rosso,HIGH);
delay (500);
digitalWrite (rosso,LOW);
}
}