TSOP36136 Lichtschranke (2)
13. Januar, 2014 in: Elektronik, StudiumVor einiger Zeit schrieb ich über eine kostengünstige Selbstbaulichtschranke, mit der es möglich sei mehrere Meter problemlos zu überbrücken – theoretisch zumindest!
Als ich nun vor etwa 3 Wochen die Lichtschranke für einen Testversuch provisorisch auf der Kegelbahn installiert hatte, zeigte sich leider keine Funktion. Die zu überbrückende Strecke waren nur die Breite einer Standard Classic Kegelbahn von 1,70m und jedes 0815 Gerät im Haushalt lässt sich per Infrarot von einer größeren Distanz aus bedienen (noch dazu mit einem verglichen popeligem Pulsstrom, da Batteriebetrieben). Wo liegt der Fehler?
Zunächst verringerte ich den Abstand, da ich sonst keine Möglichkeiten vor Ort hatte. Ab etwa 30cm funktionierte die Lichtschranke wieder ordnungsgemäß. Für meinen Anwendungsfall, der eben genau in der Messung auf der Kegelbahn mit einer nötigen Messweite von 1,70m, natürlich etwas wenig. Später zu Hause baute ich die Schaltung auf dem Steckbrett nach und alles funktionierte. Mit der Fernbedienung meines TVs konnte ich aus >5m noch den Empfänger erreichen, also war der Sender das Problem.
Der Sender ist nur ein ATTiny45 der in der Main Routine ein 36kHz Signal erzeugt und dieses wiederrum mit etwas über 1kHz gepulst ausgibt. Theoretisch zumindest! Da ich mir zum Abschluss meines Studiums ein Oszilloskop geschenkt hatte, konnte ich nun das Ausgabe Signal überprüfen. Zu meinem Erstaunen musste ich feststellen, dass der Tiny nur ein Signal von mickrigen 28kHz am Ausgang lieferte. Ich überprüfte den Quellcode und musste feststellen, dass ich diesen mithilfe der Arduino IDE programmiert hatte.
Der Code besteht im Wesentlichen nur aus einer For-Schleife, mehreren Delays und der Funktion digitalWrite(), welche sich als äußerst langsam erwies. Ich ließ den Code wie er war und ersetzte die digitalWrite Funktionen durch direkte Manipulation des entsprechenden PORT Registers. Das Ausgangssignal erreichte mit diesen Änderungen sofort die gewünschte Form und die Lichtschranke funktionierte nun auch für größere Distanzen.
Infolge der Optimierung ist allerdings nun ein neues Problem aufgetreten: Die Lichtschranke funktioniert zu gut. Meine Sende IR-LED besitzt einen Abstrahlwinkel von 10° und die auftretenden Reflexionen die in diesem Bereich entstehen machen es kleinen Objekten unmöglich die Lichtschranke auszulösen, auch wenn sich der Empfänger im Schatten des Objekts befindet. Eine mechanische Anpassung des Senders bzw. und des Empfängers wird nun nötig um die korrekte Funktion sicherzustellen. Ein Röhrchen mit 5mm oder ein Schrumpfschlauch über die LED geschoben, sollten das Problem allerdings lösen 😉
Und das Fazit: Zeitkritische Signale niemals mit den Arduino Funktionen digitalRead und digitalWrite erzeugen.