Problem mit Infrarot Torzähler

Hallo,

vorab möchte ich betonen, dass dies mein erstes Arduino Projekt ist und ich noch sehr wenig Ahnung habe, wie bestimmte Bauteile mit meinem Code interagieren bzw. welche Besonderheiten evtl. zu beachten sind. Programmiererfahrung habe ich bereits. (Ich benutze einen Arduino Uno R3)

Ich habe mir ein Torzählwerk für einen Airhockey Tisch gebastelt. Nach viel Recherchearbeit funktioniert auch eigentlich alles ganz gut nur die Infrarot LED und der Sensor bereiten mir ein wenig Kopfschmerzen.

Beim Programmieren hatte ich die LED und Sensor noch recht eng zusammen stehen, quasi als "Trockenübung" wobei das Reaktionsverhalten noch ganz gut war. (Ich konnte meine Finger oder auch den Puck zwischen beide halten und es wurde fast immer eine Unterbrechung erkannt...)

Ich hatte allerdings schon im Vorraus etwas Zweifel, ob sich das ganze überhaupt mit einer Infrarot LED und einem Sensor realisieren lässt, da ich ahnte, dass der Puck zu schnell und zu dünn für das System ist. Nach provisorischem Einbau in den Airhockey Tisch habe ich nun ein sehr komisches Verhalten des Sensors bemerkt:

  1. Er reagiert nur noch sehr schwer auf jegliche Unterbrechungen egal wie eng LED und Sensor
    zusammen stehen,
  2. Es scheint egal zu sein ob die LED überhaupt leuchtet, wenn ich den Sensor mit dem Finger abdecke
    wird ein Signal registriert.
  3. An der LED kommen nur 0,45V an, obwohl die meisten erst ab 1,3V - 1,9V betrieben werden. (Ich
    habe das Gefühl, dass das Signal zu schwach ist)

Die LEDs sind beide an Port 3~ gesteckt und parallel geschaltet. (Brauche das Signal nur gleichzeitig auf beiden Seiten) Die Sensoren sind an Port 2 und 4 gesteckt.
Um die LEDs anzusteuern benutze ich die IRremote.h Library

Ich war mir lange unsicher ob ich die Sensoren als Digitalen oder Analogen Input interpretieren lasse. Da ich aber nur eine volle Unterbrechung registrieren will, dachte ich, dass die Digitale Variante funktionieren sollte...(nach Guide)

Außerdem habe ich in meinem Code eine Art Menü eingebaut, (Habe ein Display und Schalter zur Spielmodi Wahl/ Torstandsanzeige) welches in der Loop() abgefragt/ aktualisiert wird, sodass die Senorenabfrage nicht in der Loop() sondern in einer While-Schleife stattfindet. Gibt es deswegen Probleme? Ist die While-Schleife zu "langsam" um eine Unterbrechung genau zu registrieren?

Alles in allem habe ich alles nach verschiedenen Guides/Tutorials zusammengebaut und meine eigenen Ergänzungen gemacht. Vor allem was die Schaltung angeht.

Hier die IR-LED/Sensor Kombo die ich benutze:

Code(NUR DAS WICHTIGE):

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <IRremoteInt.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//....weitere unwichtige Variablen
//.
//.
//....................

#define PIN_IR 3
#define PIN_DETECT 2
#define PIN_DETECT_TWO 4
#define PIN_STATUS 13
IRsend irsend;

//....

void setup()
{
  pinMode(enterButton, INPUT_PULLUP);
  pinMode(modeButton, INPUT_PULLUP);  
  pinMode(buzzer, OUTPUT);
  pinMode(PIN_DETECT, INPUT);
  pinMode(PIN_DETECT_TWO, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);

  lcd.begin(20,4);

//.....

  homescreen(); 
 
  updateMenu(); 
 
  
}

void loop() {

//Menü

  if(!digitalRead(modeButton))
  {
    modeCounter++;
    updateMenu();
    delay(100);
    while(!digitalRead(modeButton));
  }
  if(!digitalRead(enterButton))
  {
     execute();
     delay(100);
     updateMenu();
     delay(100);
     while(!digitalRead(enterButton));
  }

}

//Beispielspielmodi
//goalsReq = variable Anzahl von Toren zum Sieg

void goals(int goalsReq){

  lcd.clear();
  lcd.home();
  delay(1000);

  while(digitalRead(enterButton) && isWon == false)
  {     
     irsend.space(0);
     delay(1);
     irsend.mark(0);

     if(!digitalRead(PIN_DETECT))
     {
        beep();
        goalCounter_One++; 
        lcd.clear();
     }
  
     if(!digitalRead(PIN_DETECT_TWO))
     {
        beep();
        goalCounter_Two++;
        lcd.clear();
     }

     updateGoalDif(goalCounter_One, goalCounter_Two);
     checkForWin(goalsReq);
  }

  goalCounter_One = 0;
  goalCounter_Two = 0;
  isWon = false;
  lcd.clear();
}

//......
//....

Ich hoffe jemand kann mir weiterhelfen!

MfG.
NineCookiez

PS: Falls die Schaltung ein Hauptsächlicher Fehlergrund sein könnte, werde ich sie noch posten.(Ist nur etwas blöd verbaut, muss sie erst wieder rausfummlen und sketchen :wink: )

Würde ich ganz anders machen 8)

Mini-Laserpointer als Sender, Fototransistor als Empfänger, optisch abgeschirmt mit schwarzem Trinkhalm oder so dass er nur nach vorne was sieht. Laser funzelt in's Röhrchen und somit auf den Transi.

Vorteil: Extrem schnelle Auslösezeit, kein Gefummel mit IR-Codes, digitaler Eingang in Loop abgefragt und fertig ist die Laube.

Nur das wichtigste:

Diese Kombination kannst du so nicht verwenden, die sind für IR-Fernbedienungen gedacht und müssen mit einem dafür bestimmten Protokoll arbeiten.

Hi

Ein Lichtschranken wird durch den Puck unterbrochen und das soll gezählt werden.
habe ich das so richtig verstanden?

Den Lichtschranken baust du mit einem Sender - z.B. einer IR LED und einem Empfänger der für IR empfindlich ist.

Dazu musst du nur die Sendediode mit 5V versorgen so dass der zulässige Dauerstrom fließt.
Wird der Empfänger angeleuchtet wird er "leitend". Das wertest du mit einem Eingang aus und stellst die Werte am LCD dar.

Delay ist tödlich - während des Delay macht der Ardu nix, auch nicht mitbekommen dass ein Tor fällt.

Idealerweise nimmst du einen Interrupt Eingang am Ardu - der ist sicher schnell genug die Lichtschrankenunterbrechung zu erkennen. Die Luxusvariante ist zu erkennen wenn der LS unterbrochen wird (Zeitpunkt merken) und die Zeit messen bis der Lichtschranken nicht mehr unterbrochen ist.

Da der Puck immer gleich dick ist, kannst sogar die Geschwindigkeit errechnen - ist aber die Luxusvariante.

IR lib kannst gleich löschen.

Du kannst auch nach Drehzahlmessung optisch googeln, gleiches Prinzip.
Nicht geht den LS mit einem LDR bauen, der ist zu träge.

LG

Dazu musst du nur die Sendediode mit 5V versorgen so dass der zulässige Dauerstrom fließt.

Im Prinzip ok, aber viel zu kleine Reichweite - oder man nimmt ne Power-LED, ist aber unnötige Stromvergeudung. Aber viele Wege führen nach Rom.

Klaus_ww:
Im Prinzip ok, aber viel zu kleine Reichweite - oder man nimmt ne Power-LED, ist aber unnötige Stromvergeudung. Aber viele Wege führen nach Rom.

mh - mit Verlaub das wird doch wohl vom Empfänger abhängen.
Ein TAOS TSL12S liefert bei 8µW/cm "Bestrahlungsenergie" 2V (ist ein Licht/Volt Wandler).

Der TAOS230 liefert bei 126µW/cm² (und 640nm) 1kHz also Fullscale. Mit dem
habe ich mal ein Luxmeter mit 1lx FS gebaut. Schon ist, dass der Licht->Freqienz wandelt.

LG
Viktor

Hi Viktor,

ja du hast richtig verstanden, dass es sich um eine Lichtschranke die bei Unterbrechung gezählt wird, handelt.

Dein Vorschlag klingt interessant...

Viktor93:
Den Lichtschranken baust du mit einem Sender - z.B. einer IR LED und einem Empfänger der für IR empfindlich ist.

Die beiden habe ich ja schon... und ich denke auch dass diese Variante funktionieren sollte...
Da verunsichert mich nur die Antwort von HotSystems:

HotSystems:
Nur das wichtigste:

Diese Kombination kannst du so nicht verwenden, die sind für IR-Fernbedienungen gedacht und müssen mit einem dafür bestimmten Protokoll arbeiten.

falls damit genau diese Kombi(meine) gemeint ist, dann muss ich wohl andere beschaffen...

Viktor93:
Dazu musst du nur die Sendediode mit 5V versorgen so dass der zulässige Dauerstrom fließt.
Wird der Empfänger angeleuchtet wird er "leitend". Das wertest du mit einem Eingang aus und stellst die Werte am LCD dar.

Das hatte ich schon versucht, komischer Weise kommen jedesmal nur 0,45V an der LED an.. als würde der Arduino die Spannung selber regeln?!

Delay werde ich rausnehmen. :slight_smile:
Das mit der Geschwindigkeit und der Zeitmessung klingt verdammt sexy! :smiley: Wenn ich das System erst einmal vernünftig zum laufen gebracht habe werde ich das auf jeden Fall noch einbauen.

Die Reichweite ist mehr als Ausreichend... (benötige nur ~30cm).

Ich habe mir auch schon überlegt so etwas wie Röhrchen zu nehmen um nur einen direkten Strahl an IR Licht auf den Sender zu richten.. bin mir aber nicht sicher ob es das bringt...

LG.
NineCookiez

NineCookiez:
Da verunsichert mich nur die Antwort von HotSystems:

falls damit genau diese Kombi(meine) gemeint ist, dann muss ich wohl andere beschaffen...

Ja, der Empfänger ist hier ausschlaggebend. Der braucht zum Arbeiten ein korrektes Protokoll.
Nur einen IR-Strahl ist da nicht ausreichend.

HotSystems:
Ja, der Empfänger ist hier ausschlaggebend. Der braucht zum Arbeiten ein korrektes Protokoll.
Nur einen IR-Strahl ist da nicht ausreichend.

Dh. wenn ich einen anderen Empfänger nehme, zb. diesen hier, dann funktioniert es? Hier ist nichts von einem benötigtem Protokoll beschrieben...

LG.
NineCookiez

Hi

Umgebungslicht oder elektrische Beleuchtung können Dir immer noch einen Strich durch die Rechnung machen.
Der Vorschlag mit einem Laser-Modul (gibt's zum Kilopreis beim FC) und einem Photo-Transistor wurde ja schon gemacht.
Reicht Dir überhaupt EINE Schranke aus?
Klar, normal bewegt sich der Puk nur wenige mm über der Tischplatte, wenn Er aber knapp unter der Latte rein kommt, wird Das die Lichtschranke nicht erfassen oder?
Dann bräuchtest Du eine Art Licht-Vorhang - in dem Fall würde wohl ein Licht-Gitter dicke reichen, Abstand < kleinste Abmessung des Puk.

Aber Du kannst natürlich auch Deine IR-Dioden nehmen - der Arduino ist durchaus im Stande und kann Da einen IR-Befehl nonstop drüber jagen.
Auf der anderen Seite müsste 'nur' geprüft werden, ob der Empfänger fehlerhaften Empfang detektiert oder stillschweigend auf das nächste gültige Paket wartet - beim TV ist's mir ja auch lieber, die Kiste schaltet endlich um, statt mir laufend einen vorzublinken, daß Das wohl Nichts war.

Hatte aber auch schon die Idee, relativ dicht aneinander sitzende Lichtschranken einfach unterschiedliche Dinge senden zu lassen und im jeweiligen Empfänger zu prüfen, ob das Erwartete empfangen wird - wenn nicht, steht was im Weg.
... blieb bisher bei der Überlegung ...

MfG

Hi postmaster,

bei der Lasermethode habe ich a) bedenken dass ein LDR zu "langsam" wäre und b) wie du schon sagtest könnte es dann passieren, dass der Puck leicht drüber fliegt.

Deswegen habe ich mich für IR entschieden weil ich dachte, dass der Lichtkegel viel "dicker" sei und ich ihn dann störungsfreier unterbrechen könnte.

Jetzt habe ich nur in diesem Fall bedenken, dass der dünne Puck dadurch nie den kompletten Strahl abdeckt und somit immer ein wenig IR Licht am Empfänger ankommt. Deswegen hatte ich eben überlegt, es mit Analogen Werten abzufragen um eine Grenze festlegen zu können, ab wie viel oder eben wenig Licht eine Unterbrechung stattfindet. Allerdings hatte ich dabei dann Angst, dass bei zb. leichtem verdecken des Torraumes mit dem Schläger oder der Hand schon weniger Licht registriert wird und ein Tor gezählt wird.

Ich glaube das ist alles eine Frage der Optimierung.
Falls alle Stränge reisen kann ich die Lichtschranke auch einfach im Torkasten einbauen denn da rollt der Puck seitlich durch und verdeckt somit 100% die LED. Nachteil hier ist nur, dass das Tor relativ verzögert angezeigt wird...

LG.
NineCookiez

Wie hast Du die LED und wie den Fototransistor am Arduino angeschlossen?

uwefed:
Wie hast Du die LED und wie den Fototransistor am Arduino angeschlossen?

so:

NineCookiez:
Die LEDs sind beide an Port 3~ gesteckt und parallel geschaltet. (Brauche das Signal nur gleichzeitig auf beiden Seiten) Die Sensoren sind an Port 2 und 4 gesteckt.

(Digital Ports)
Die Sensoren sind logischer Weise außer an die Ports auch an VCC/GND gesteckt.(3 PINs)

Ich habe mir jetzt aber noch ein paar von den zwei-PIN radial IR-Detektoren bestellt. Die benötigen anscheinend kein extra Protokoll.

LG.

Hi

LDR wurde ja schon als recht langsam verworfen.
Photo-Transistor ist Da wesentlich schneller.

Habe gerade Google bemüht, mir ein paar Airhockey-Tore anzuzeigen - Die sind Alle soweit 'Tisch-bündig'.
Nicht viel Material, wo man was dran anbringen könnte.
Eine Prall-Platte im Tor?

Bzw. zeig Mal ein Foto, wie Du Das an Deinem Tisch angebracht hast - bin akut etwas überfragt.

MfG

LED dürfen nicht ohne Vorwiderstand betrieben werden.

Die IR Fernsteuerungs-Empfänger müßten VS-1838B sein. Die Anschlüsse sind entsprechend (von vorne, links nach rechts): OUT, GND, VCC. Die Eingangsspannung sollte im Bereich von 2,7 bis max. 5,5 V bei einem Strom von max. 0,6 mA liegen.

Hast Du sie richtig angeschlossen?

Die Empfänge brauchen ein Signal das mit 38kHz getaktet ist und eine bestimmte anzahl von impulsen zum erkennen und dürfen aber nicht mehr als eine bestimmte anzahl von impulsen bekommen (kein Dauerbetrieb)

Grüße Uwe

HotSystems:
Diese Kombination kannst du so nicht verwenden, die sind für IR-Fernbedienungen gedacht und müssen mit einem dafür bestimmten Protokoll arbeiten.

Das stimmt nicht ganz. Die 38kHz Modulation machst die IrRemote Library. Das Problem liegt nicht an der Software, sondern dass diese Empfänger oft Hardware-seitig dauernde Signale unterdrücken wenn nicht ausdrücklich dabei steht, dass sie für Lichtschranken geeignet sind.

uwefed:
LED dürfen nicht ohne Vorwiderstand betrieben werden.

Habe ich drin :slight_smile:

uwefed:
Die IR Fernsteuerungs-Empfänger müßten VS-1838B sein. Die Anschlüsse sind entsprechend (von vorne, links nach rechts): OUT, GND, VCC. Die Eingangsspannung sollte im Bereich von 2,7 bis max. 5,5 V bei einem Strom von max. 0,6 mA liegen.

Hast Du sie richtig angeschlossen?

Ja, es kommen 5V am Empfänger an und OUT liegt an PIN 2 bzw. 4.

uwefed:
Die Empfänge brauchen ein Signal das mit 38kHz getaktet ist und eine bestimmte anzahl von impulsen zum erkennen und dürfen aber nicht mehr als eine bestimmte anzahl von impulsen bekommen (kein Dauerbetrieb)

mhh klingt kompliziert... dachte das kann ich eben mit der Library lösen...

postmaster-ino:
Bzw. zeig Mal ein Foto, wie Du Das an Deinem Tisch angebracht hast - bin akut etwas überfragt.

Mache ich gleich morgen früh :slight_smile: sieht man aber schlecht...

LG.

So.. habe jetzt mal ein paar Bilder gemacht. Ich hoffe man kann erkennen wie es funktionieren soll.

Die LED/Sensor sind nur provisorisch rangeklebt. Die Position ist noch nicht fest, ich könnte die beiden auch durch ein Loch direkt in den Torkasten bauen aber so wie es auf den Bildern ist, sollte der Puck die Lichtschranke auf jeden Fall unterbrechen.

Ich habe auch ein Testtor gebastelt, welches nur 1-2mm breiter als der Puck dick ist und bei dem die LED/Sensor genau im Zwischenraum sitzen. Dort funktioniert es genau so wenig.. (alle 5-6 Durchschüsse mal eine Registrierung)

Wenn man den Puck allerdings sehr langsam durch schiebt, dann wird fast immer einer Unterbrechung registriert...

Bilder in den Attachments!
LG.

Vergiss die Fernsteuerungs-Empfänger!

Serenifly:
Das stimmt nicht ganz. Die 38kHz Modulation machst die IrRemote Library. Das Problem liegt nicht an der Software, sondern dass diese Empfänger oft Hardware-seitig dauernde Signale unterdrücken wenn nicht ausdrücklich dabei steht, dass sie für Lichtschranken geeignet sind.

Ok, da fehlt mir die Erfahrung mit anderen Modellen.
Der vom TO verlinkte ist aus meiner Sicht als Lichtschranke in diesem Fall ungeeignet.
Für langsame Bewegungen mag es reichen.