Lichtschranke mit genauer Zeiterfassung

Hallo zusammen!

Ich bin neu hier im Forum und auch in der gesamten Arduino-Welt, in welcher ich nun mit einem kleinen Projekt einsteigen möchte.

Erstmal ein bisschen was von mir: Ich programmiere jetzt schon seit ein paar Jahren (zuletzt hauptsächlich C# und JavaScript) und hatte zuletzt vor ca. sieben Jahren auch mal was mit C++ zu tun, eine erneute Einarbeitung sollte mir hier also gelingen. Von Elektrotechnik habe ich leider nur sehr wenig Ahnung.

Nun zu meinem Vorhaben: Ich würde gerne ca. 2-10 Lichtschranken (je nach Anwendungsfall) betreiben und für jede einzelne erkennen, wann diese unterbrochen wird. Bei jeder Unterbrechung möchte ich einen Zeitstempel aufnehmen und zusammen mit der "ID" der Lichtschranke an einen per USB angeschlossenen Raspberry Pi senden, der die Daten dann in aller Ruhe auswerten kann, damit Webclients über eine Websocket-Verbindung dann die Zeiten in Echtzeit angezeigt bekommen (ein gewisser Delay bis zur Anzeige ist dabei OK).

Da ich eine Genauigkeit der Zeiterfassung von 1ms haben möchte, benötige ich (wie ich gelesen habe!) wohl ein Arduino-Board, weil beim Raspberry wohl zu viel Overhead vorhanden wäre.

Könnt ihr das so bestätigen?

Jetzt wäre noch die Frage, welches Board sich hier eignen würde?

Und in einem anderen Thread habe ich gelesen, dass man für eine Lichtschranke als Sender eine IR-Diode und als Empfänger ein TSOP4838 nutzen kann (HIER). Hier fehlen mir auch noch Grundlagen, wie ich das anschließen müsste und was genau man dann im Arduino anstellen muss.

Für den Anfang würde ich gerne wissen, ob die Komponenten für meinen Aufbau geeignet sind, oder ob vielleicht etwas anderes besser geeignet wäre (tinkerforge?). Falls meine Idee soweit passt, würde ich mich über geeignetes Einlesematerial freuen :slight_smile: Ich erwarte schließlich nicht, dass mir hier jemand alles haarklein vorkaut...

Vielen Dank schonmal für eure Hilfe!

Bitte genauen Aufbau skizzieren, was du genau und wie erfassen willst. die 1ms ist nicht das Problem. Würde auch mit dem Rasp gehen.

Im Anhang einmal eine Skizze. Reicht dir das so oder was bräuchtest du da noch für Infos?

skizze.png

Mir gings eher um die Hardware Aufbau. Also wie du was messen möchtest. Lichtschranke zum erkennen von Besuchern etc.

Achso, ja, das habe ich vergessen :slight_smile: Die Lichtschranke muss eine Breite von etwa 10 bis 20cm haben und entsprechend erkennen, wenn sich ein Objekt (lass es z.B. ein kleines, ferngesteuertes Auto sein) dazwischen befindet.

Hat hier niemand Tips für mich?

Eike1:
einen Zeitstempel aufnehmen und zusammen mit der “ID” der Lichtschranke an einen per USB angeschlossenen Raspberry Pi senden, der die Daten dann in aller Ruhe auswerten kann, damit Webclients über eine Websocket-Verbindung dann die Zeiten in Echtzeit angezeigt bekommen (ein gewisser Delay bis zur Anzeige ist dabei OK).

Wenn Du die Daten nicht seriell senden möchtest sondern über ein Netzwerkprotokoll, wäre es wahrscheinlich am günstigsten das verbindungslose UDP-Protokoll zum Senden von Daten zu verwenden anstelle von TCP-Protokollen, die einen Verbindungsaufbau benötigen.

Eike1:
Da ich eine Genauigkeit der Zeiterfassung von 1ms haben möchte, benötige ich (wie ich gelesen habe!) wohl ein Arduino-Board, weil beim Raspberry wohl zu viel Overhead vorhanden wäre.

Meinst Du wirklich “Genauigkeit” oder meinst Du “Auflösung”?
Eine Auflösung von 1ms ist kein Problem für einen Mikrocontroller. Aber um eine “Genauigkeit” von 1 ms zu erreichen, mußt Du einen um so höheren Aufwand treiben, je größer die zu messenden Zeiträume sind.

Eike1:
Jetzt wäre noch die Frage, welches Board sich hier eignen würde?

Wenn die Lichtschranke immer nur für extrem kurze Zeiten unterbrochen wird, bietet sich eine Erfassung der Unterbrechungen per “Interrupt-Behandlungsroutine” an. Am einfachsten sind “Externe Hardware-Interrupts” zu programmieren, da dieses von der Arduino-Core-Library gut unterstützt wird. Allerdings gibt es davon nur eine begrenzte Anzahl, z.B. 2 Stück auf einem UNO und 6 Stück auf einem MEGA-Board. Diese wäre dann gleichzeitig die Höchstzahl an “einfach” auszuwertenden Lichtschranken an so einem Board mit der Vorgabe “Unterbrechungsdauer ist extrem kurz”.

Wenn Du also mit begrenzten Kenntnissen etwas “für bis zu 6 Lichtschranken” machen möchtest, nimm ein “MEGA2560” Board!

Für mehr gleichzeitig betriebene Lichtschranken würde es etwas kniffliger werden.

Eike1:
Und in einem anderen Thread habe ich gelesen, dass man für eine Lichtschranke als Sender eine IR-Diode und als Empfänger ein TSOP4838 nutzen kann (HIER). Hier fehlen mir auch noch Grundlagen, wie ich das anschließen müsste und was genau man dann im Arduino anstellen muss.

Ja, das ist im Prinzip möglich, damit Lichtschranken aufzubauen.

Eike1:
Für den Anfang würde ich gerne wissen, ob die Komponenten für meinen Aufbau geeignet sind

Zum Start würdest Du erstmal den passenden IR-Empfänger benötigen, z.B. t

  • Vishay TSOP4838 (38 kHz, 950 nm)
    Und für jeden Empfänger eine dazu passende IR-Sendediode (950 nm) mit entsprechend dimensioniertem Vorwiderstand. Da Du nur kurze Entfernungen zu überbrücken hast, kannst Du den Strom der IR-Sendediode direkt aus einem Arduino-Ausgang heraus ansteuern.

Die Vorwärtsspannung von IR-LEDs liegt bei ca. 1,2…1,8V, wenn Du beispielhaft mit 10 mA Sendestrom und 1,5V VF rechnest, würde man am Vorwiderstand also 3,5V bei 10 mA abfallen lassen, also
R= U/I = 3,5 V / 0,01 A = 350 Ohm, ==> nächster Wert der E12-Reihe 390 Ohm.

Und dann steuerst Du Deine mit Vorwiderstand angeschlossene IR-Sendediode über einen Ausgang (pinMode OUTPUT) und mit einer 38 KHz-Frequenz an und richtest sie auf Deinen TSOP-Empfänger, der an einem Eingang (pinMode INPUT) betrieben wird, und testest mal, wie das Signal zwischen HIGH und LOW wechselt.

Der TSOP-Empfänger müßte dabei wohl ein Original “Vishay” sein und kein Noname-Nachbau. Die Noname-Nachahmerprodukte haben bei Dauerstrichanwendungen wie bei Lichtschranken nämlich oft das Problem, dass der Empfänger nicht dauerhaft “HIGH” signalisiert, wenn er ständig angesteuert wird, sondern dass der Pegel zwischendurch immer wieder kurz auf LOW zurückfällt. Das sollte mit originalen Vishay TSOP Empfängern nicht passieren, so dass sich diese dann auch problemlos in Lichtschrankenanwendungen verwenden lassen (und nicht nur in IR-Fernbedienungen).

Es gibt auch Vishay Sensoren die explizit für Dauerbelichtung gemacht sind. Die nennen sich TSSP statt TSOP:
http://www.vishay.com/docs/82458/tssp4038.pdf
http://www.vishay.com/docs/82479/tssp58038.pdf

Da steht dann dabei "for Light Barrier Systems" oder "presence sensor" statt "for remote control"

jurs:
Wenn Du die Daten nicht seriell senden möchtest sondern über ein Netzwerkprotokoll

Da habe ich mich vielleicht nicht klar genug ausgedrückt: Das Arduino-Board soll die Unterberechnung erkennen und dann per USB an Raspberry, Notebook oder dergleichen senden. Das Empfängsgerät stellt dann die Daten den Webclients bereit (mit NodeJS oder SighnalR, mal gucken). Das Arduino-Board soll also nicht direkt im Netzwerk hängen (vielleicht irgendwann später) sondern im Grunde nur getrennt nach Lichtschranke den Zeitpunkt der Unterbrechungen erkennen und entsprechend senden.

jurs:
Meinst Du wirklich "Genauigkeit" oder meinst Du "Auflösung"?

Puh, das kann ich nicht sagen... Ich möchte die Dauer zwischen zwei Unterbrechungen (die jeweils nur sehr kurz sind) in Millisekunden haben. Je nach Einsatzgebiet liegen zwischen den Unterbrechungen wenige Sekunden bis hin zu einer Minute. Ist das problematisch?

jurs:
Allerdings gibt es davon nur eine begrenzte Anzahl, z.B. 2 Stück auf einem UNO und 6 Stück auf einem MEGA-Board. Diese wäre dann gleichzeitig die Höchstzahl an "einfach" auszuwertenden Lichtschranken an so einem Board mit der Vorgabe "Unterbrechungsdauer ist extrem kurz".

Ok, sechs sollten vorerst reichen. Notfalls kann ja noch ein zweites Board dazukommen. Ich gucke mir das Mega-Board dann noch genauer an.

@Serenifly: Hast du einen Shop parat, wo die Empfänger lieferbar sind?

Benötige ich abgesehen vom Arduino-Board, dem IR-Sender und -Empfänger noch etwas für den Anfang? Z.B. irgendwelche speziellen Kabel? Dann würde ich schonmal langsam gucken, dass ich mir eine Bestellliste zusammenstelle.

"TSSP4038 Versand" bei Google ist ein guter Anfang. Das spuckt u.a. das aus:
https://hbe-shop.de/Art-2251441-VISHAY-TSSP4038-IR-SENSOR-KLEIN-F-LICHTSCHRANKE

Bei dem Shop hast du auch als Privatkunde Zugang zum Farnell Sortiment. Wobei der Versand nicht billig ist. Und dann gibt es noch einen Aufschlag wenn man unter 30 Euro ist...

Hier kosten die zwar 2 Euro pro Stück:
http://www.ebay.de/itm/IR-SENSOR-SMALL-FOR-LIGHT-BARRIER-Part-VISHAY-TSSP4038-/271621441587?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item3f3de64833
Aber das ist vielleicht insgesamt billiger wenn du nur eine handvoll bestellst. Wenn du gleich 10 nimmst, dann lohnt sich auch HBE.

Wobei man auch immer wieder sieht das Leute mit den TSOPs auch Lichtschranken aufbauen und das zu funktionieren scheint, auch wenn dabei steht, dass die auch moduliertes Dauerlicht unterdrücken.

Und dann bei den IR-LEDs darauf achten dass sie 950nm haben.

Was du auch noch brauchen kannst sind Treiber für die LEDs. Die betreibt man nämlich idealerweise bei Pulsbetrieb mit mehr als den üblichen 20-30mA. z.B. 100mA. Dann hat man eine höhere Reichweite. Das macht aber der µC nicht direkt. Am besten Logic-Level FETs wie den IRLZ44 nehmen. Du brauchst nicht unbedingt für jede LED einen. Man kann die LEDs auch parallel schalten wenn jede einen eigenen Vorwiderstand hat (die brauchst du natürlich auch).

Anmerkung zu der TSSP Bezeichung: Darunter gibt es auch Näherungssensoren wie den TSSP4P38 (z.B. Reichelt). Die sehen genauso aus, aber das willst du nicht!

Eike1:
Puh, das kann ich nicht sagen... Ich möchte die Dauer zwischen zwei Unterbrechungen (die jeweils nur sehr kurz sind) in Millisekunden haben. Je nach Einsatzgebiet liegen zwischen den Unterbrechungen wenige Sekunden bis hin zu einer Minute. Ist das problematisch?

Ein Mikrocontroller-Board für sich alleine kann Zeiten nur so genau messen wie der Soll-Takt des Boards von der Hardware genau eingehalten wird.

Bei Boards mit "Schwingquarz" liegt diese Genauigkeit bei beispielsweise 30 ppm.

Bei Boards mit "keramischem Resonator" liegt die Genauigkeit bei relativ schlechten 3000 ppm (typisch).

Während es "UNO" Boards sowohl als Original mit recht ungenau gehendem Resonator gibt, gibt es davon immer noch Third-Party Nachbauten, die mit Schwingquarz als Taktgeber lieferbar sind.

Beim "MEGA2560" gibt es meines Wissens nach sowohl als Arduino Original-Boards als auch als Third-Party Nachbauten nur Boards mit "keramischem Resonator". Und die 3000 ppm Abweichung bedeuten dann ggf., dass pro eine Million Sekunden das Board um 3000 Sekunden falsch tickt. Oder pro 1 Mio. Millisekunden um 3000 Millisekunden. 1 Mio Millisekunden = 1000 Sekunden. Also absoluter Messfehler typischerweise bei 3 Millisekunden pro Sekunde bei einem MEGA2560.

Wenn Du eine hohe absolute Genauigkeit der Zeitmessung benötigst, obwohl der Mikrocontroller nicht genau taktet, benötigst Du eine Echtzeituhr (RTC, Realtime-Clock) für genaue Zeitmessungen.

Da gäbe es zum einen die billigen "RTC Tiny DS1307" Module, die dann trotz Schwächen in der Schaltung immerhin die Genauigkeit "schaffen" wie ein Board mit Schwingquarz. Also dann Genauigkeit typischerweise 3 Millisekunden pro 100 Sekunden.

Und ansonsten gäbe es die DS3231 Module mit hoher Ganggenauigkeit, die nur ca. 64 Sekunden Gangabweichung pro Jahr haben. Wenn ich das jetzt richtig gerechnet habe, wäre das 1 Millisekunde Abweichung pro 500 Sekunden.

Wenn Du eine RTC zur exakten Zeitmessung heranziehst und nicht den Controller-Takt des Boards, verkompliziert sich allerdings die Programmierung nicht ganz unwesentlich. Also von daher kommt es schon drauf an, ob Du nur eine 1ms-Auflösung "zwischen den Zeiten" benötigst, also dass Du genau sagen kannst "Lichtschranke x wurde 1 ms nach Lichtschranke y unterbrochen", oder ob Du bei einer Zeitmessung wirklich Zeiten von 10 Minuten auf weniger als 1 Millisekunde "absoluten Gesamtfehler" herausbekommen mußt.

Bei hoher geforderter "Genauigkeit 1ms" und nicht nur "Auflösung 1ms" benötigst Du also noch ein RTC-Modul, z.B. eines mit DS3231.

jurs:
Beim "MEGA2560" gibt es meines Wissens nach sowohl als Arduino Original-Boards als auch als Third-Party Nachbauten nur Boards mit "keramischem Resonator".

Der Freeduino hat einen Quarz:
http://www.komputer.de/zen/index.php?main_page=product_info&cPath=21&products_id=191

Das mit den Buchsenleisten ist in der Realität nicht ganz so schlimm wie es da aussieht. Zumindest bei meinem.

Man könnte aber auch einen Uno nehmen und mit Pin Change Interrupts arbeiten. Mit der Library ist das nicht mehr Programmier-Aufwand als mit externen Interrupts und der Zeitverlust sollte im µs-Bereich liegen.

Oh man, jetzt habt ihr ja richtig was rausgehauen :smiley: Also, ich bin am überlegen, ob ich es nicht lasse. Bevor ich da vernünftig etwas zusammenbekomme dauert das ja ewig... Ich tendiere jetzt doch dazu, es über Tinkerforge zu lösen und auf die Millisekunden-Genaue Angabe der Abstände zu verzichten. Das Charmante daran wäre, dass ich auch weitere Funktionen mit Leichtigkeit integrieren könnte. Ist halt deutlich teurer am Ende des Tages, kostet mir aber auch bedeutend weniger Zeit.

Interrupt:
Es wäre denkbar, über etwas Peripherie mehrere Lichtschranken einen gemeinsamen Port zwecks Interrupt nutzen zu lassen und dann pro Lichtschranke einen INPUT zu nutzen.
Dann wäre mit Interrupt->suche INPUT, der "ausgelöst" ist, mehr als 2 (UNO), 4 (Leonardo) oder 6 (Mega) möglich. Dann wären nur Auslösungen, die sich überschneiden möglicherweise zu prüfen.

Wie gesagt, es gibt Pin Change Interrupts:
http://playground.arduino.cc/Main/PinChangeInt

Der UNO kann auf allen Pins einen Interrupt auslösen! Der Mega auf allen Pins die hier mit PCINTx bezeichnet sind:
http://greentechhobby.com/images/Arduino/ArduinoMega.pdf

Der Unterschied zu normalen externen Interrupts ist, dass sich immer 8 Pins einen Interrupt Vektor teilen. Dadurch verliert man etwas Zeit, da man noch abfragen muss welcher Pin genau ausgelöst hat. Aber wenn man sowieso nur Genauigkeit im ms-Bereich möchte ist das überhaupt kein Problem.

Auf dem Mega hat man außerdem etwas Probleme da einer der PC Interrupts z.B. auf Serial liegt und damit schonmal wegfällt. Pin 14 (TX3) geht laut der Readme auch nicht. 4 weiteren fallen weg wenn man SPI verwendet. Und mehrere die auf dem Prozessor vorhanden sind, sind gar nicht auf das Arduino Board herausgeführt. Aber prinzipiell geht es und man hat ca. 16 weitere Interrupt Quellen.