Probleme mit IR Lichtschranke (unzuverlässig)

Hallo,

ich bin ziemlich neu hier in dem Thema und scheitere an einer (vermutlichen/hoffentlichen) Kleinigkeit.

Ich habe diese IR Receiver/Sender Kombination verbaut http://www.ebay.de/itm/291011302050?_trksid=p2060778.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT und nutze folgenden Code:

#include <IRremote.h>

#define PIN_IR 3
#define PIN_DETECT 11
#define PIN_STATUS 13

IRsend irsend;
void setup()
{
  pinMode(PIN_DETECT, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(PIN_STATUS, !digitalRead(PIN_DETECT));
  int reader = digitalRead(PIN_DETECT);
  Serial.println(reader);
}

Das funktioniert allerdings nur bedingt. Zwar bekomme ich 1 und 0 auf dem Serial Monitor angezeigt, aber nur wie folgt:

Strahl nicht unterbrochen (liegt unbewegt):
1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1, etc.

Strahl wird unterbrochen:
1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 etc.

Die Kontroll LED am Sender ist dauerhaft an, die am Receiver blinkt schwach und ist nur kurz nach der Unterbrechung vollständig rot. Benutzt man aber das Beispiel aus der IR Library zum Empfangen von HEX Codes funktioniert alles reibungslos.
Es liegt also vermutlich am Senden.

Wie gesagt ich kenne mich wenig bis gar nicht aus, vermute aber, dass der Sender bereits 38KHz moduliert? Ich das also mit dem obigen Code doppelt mache? Nur den PIN auf HIGH zu stellen funktioniert nicht :frowning:
Bewegt man den Empfänger ein wenig hin und her bleibt er übrigens auch rot.

Kann jemand den Code so verändern, dass das "Richtige" gesendet wird?

Vielen DanK!!

primus852:
Kann jemand den Code so verändern, dass das "Richtige" gesendet wird?

Probiere mal als erstes eine geänderte loop-Funktion, die nur dann etwas auf Serial ausgibt, wenn sich der Status auch tatsächlich ändert:

byte oldStatus;
void loop() {
  byte newStatus=digitalRead(PIN_DETECT);
  if (newStatus!=oldStatus)
  {
    digitalWrite(PIN_STATUS, newStatus);
    Serial.println(newStatus);
    oldStatus=newStatus;
  }
}

Unterschied?

1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, wenn es nur daliegt...

IR Receiver flackert unregelmäßig...

Code etwas geändert um nen Zeitstempel zu haben, Output wie folgt:
Zeitstempel: 8760 / Status: 0
Zeitstempel: 8761 / Status: 1
Zeitstempel: 9072 / Status: 0
Zeitstempel: 9072 / Status: 1
Zeitstempel: 9457 / Status: 0
Zeitstempel: 9457 / Status: 1
Zeitstempel: 9630 / Status: 0
Zeitstempel: 9631 / Status: 1
Zeitstempel: 9640 / Status: 0
Zeitstempel: 9673 / Status: 1
Zeitstempel: 9816 / Status: 0
Zeitstempel: 9817 / Status: 1

Ich erkenne keine Regelmäßigkeit?

Ist es nicht dasselbe wenn man ein Pin auf INPUT setzt und kein PULL_DOWN einbaut?

primus852:
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, wenn es nur daliegt...

IR Receiver flackert unregelmäßig...

Ich sehe kein Datenblatt für Dein Modul.

Eventuell wird ein PullUp-Widerstand am Pin benötigt?

Probiere mal:

 pinMode(PIN_DETECT, INPUT_PULLUP);

Glaube ich fast weniger. Die Empfänger geben normal selbst eine Spannung aus. Außerdem würde ich denken, dass das schon auf der Platine verbaut ist, wenn es nötig wäre.

pinMode(PIN_DETECT, INPUT_PULLUP);

ändert leider nichts

primus852:
ändert leider nichts

Kannst Du die Bauteilebeschriftung des IR-Empfängers identifizieren?

Ob es möglich ist, dass Du keinen 38 kHz Empfänger auf Deinem Modul hast, sondern einen 36 kHz oder 40 kHz Empfänger?

Teste mal:

irsend.enableIROut(36);

oder

irsend.enableIROut(40);

Passiert damit noch etwas, oder ist das voll daneben?
Welches Arduino-Board verwendest Du?

40 oder 36 ändert nichts, benutze das Arduino Uno

primus852:
40 oder 36 ändert nichts, benutze das Arduino Uno

Klingt nach einem Hardwarefehler. Verkabelung mangelhaft oder mit Wackelkontakt. Arduino-Pin defekt. Oder das IR-Sensormodul defekt.

Also Verkabelung prüfen:
Ist der IR-Empfänger an 5V angeschlossen? Und nicht etwa an 3.3V?
Ist die GND-Verbindung vom IR-Empfänger zu Arduino-GND vorhanden?
Wackelkontakte?

Auch bei der Sendediode alles OK? Spannung? GND? Signal?

Ist der Arduino-Pin noch OK?
Wenn der Sensor vom Arduino abgeklemmt wird und der Pin auf INPUT_PULLUP gesetzt wird, toggelt das Signal dann immer noch hin und her?

Nein abgeklemmt toggelt gar nichts :slight_smile:

Dieser Code geht einwandfrei:

*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

An der Verkablung liegt es also nicht.
Ich habe mich inzwischen anderweitig belesen: Der IR Receiver kann kein konstantes 38KHz Signal verarbeiten, weshalb man das Signal modulieren muss. Das tut man lt. Library mit irsend.mark und irsend.space! Leider funktioniert das bei mir nicht?! Ich verstehe es nicht...

If you want an IR receiver that will not reject a continuous signal use Vishay part TSSP4038 or TSSP58038. These are designed for "light barrier systems" and that appears to be what you're trying to create.

Habe ich in einem anderen Thread gefunden... Habe den TSSP58038 jetzt bestellt, ich berichte für interessierte...

Danke trotzdem an alle

Der Empfänger hat einen Open Collektor AUsgang. Du brauchst einen Pullupwiderstand.

Versuchs mal mit diesem Sketch:
Die IR-LED muß an pin 11 oder 3 angeschlossen sein weil der entsprechende Timer verwendet wird.

#define RXTSOP 2      //Pin output TSOP 
#define TXIR 11        // or pin 3 LED IR
#define LED13 13      //LED on pin 13

//flag
boolean transmitting_IR; //transmission flag

// turn_off , turn_on, detect functions come as is from
// http://www.eng.utah.edu/~cs1410/Labs/lab09.html
void turn_off_IR ()
{
  // Instead of just adjusting the output on pin 11, this code also
  // turns off the timer controlling the PWM output on pin 11
  
  TCCR2A = 0; // Disconnect PWM
  TCCR2B = 0; // Stops the timer
  OCR2A = 0;  // No timer top
  digitalWrite(TXIR, LOW);  // Ensure output is off
  
  transmitting_IR = false;
}

void turn_on_IR ()
{
  //   Set up Timer2 (which can be connected to pins 3 and 11)
  //   For full details, see:
  //   arduino.cc/en/Tutorial/SecretsOfArduinoPWM
  //   The syntax here has me baffled, but the patterns of usage
  //   are clear if you look at the ATMega328 diagrams.
  //   _BV appears to stand for 'bit value'
  //   Different bits need to be set to control each timer
  //   Refer to diagrams for clarity

  TCCR2A = _BV(WGM21) | _BV(COM2A0); // This mode toggles output once per timer cycle
  TCCR2B = _BV(CS20);  // Do not scale the clock down - use 16 MHz timer rate.
  OCR2A = 210; // Divide sys. clock by 210, 1/2 cycle = 76 khz, 1 cycle = 38 khz
  
  // Output pin 11 should now be emitting a 38 khz signal.
  
  transmitting_IR = true;
}


void detectIR()
{
    if(digitalRead(RXTSOP)){
    digitalWrite(LED13 ,LOW);
    }else{
    digitalWrite(LED13 ,HIGH);
    }
}

void setup(){  
  pinMode(TXIR, OUTPUT);
  pinMode(RXTSOP, INPUT_PULLUP);
  turn_on_IR();
  delay(100);
}

void loop(){
  detectIR(); // search for IR
  delay(50);  
}