Pages: [1]   Go Down
Author Topic: Barriera infrarossi a 38khz senza modulante  (Read 353 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti smiley-cool

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:
//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);
  }
  
}

« Last Edit: September 27, 2013, 01:12:41 pm by Spaceuniversal » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22914
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

giustamente hai ragione.Grazie Leo..vedo di ripensare il ciclo.

Alla fine ho risolto con una semplice astuzia:

Code:
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
« Last Edit: September 29, 2013, 01:45:09 pm by Spaceuniversal » Logged

Pages: [1]   Go Up
Jump to: