Go Down

Topic: Barriera infrarossi a 38khz senza modulante (Read 414 times) previous topic - next topic

Spaceuniversal

Sep 27, 2013, 07:06 pm Last Edit: Sep 27, 2013, 08:12 pm by Spaceuniversal Reason: 1
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" (http://arduino.cc/en/Reference/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:

Code: [Select]
//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);
 }
 
}



leo72

Non ho capito la logica.
Tu prima fai una lettura dell'eventuale impulso, poi subito dopo leggi lo stato del pin. Solo se la durata è maggiore di 660 e la lettura successiva è low entri nell'if.
Ma tu ricordati che esci dalla pulseIn quando è finito l'impulso low, per cui dopo il pin è per forza su High. Quindi l'if è falso.

Spaceuniversal

#2
Sep 27, 2013, 08:01 pm Last Edit: Sep 29, 2013, 08:45 pm by Spaceuniversal Reason: 1
giustamente hai ragione.Grazie Leo..vedo di ripensare il ciclo.

Alla fine ho risolto con una semplice astuzia:

Code: [Select]

durata = pulseIn(ricevitoreIR,LOW);
  int i=LOW;

l'if seguente per forza di cose mi viene Vero.

anche se avrei preferito arrivarci con una logica di ciclo if o for o while o altro

Go Up