Go Down

Topic: Laser Entfernungsmessung (Read 6190 times) previous topic - next topic

MaSc1

Hallo!

Es gibt ja schon einige Threads zum Thema Laser-Entfernungsmessung:

http://forum.arduino.cc/index.php?topic=367867.0
http://forum.arduino.cc/index.php?topic=422443.0
http://www.mikrocontroller.net/topic/334911

Als Argument gegen eine Laser Entfernungsmessung wird immer genannt, dass die Laser bzw. die benötigte Hardware sehr teuer sind.

Ultraschall soll als Alternative dienen. Ich habe ein wenig recherchiert, da ich aktuell ein Problem lösen muss, dass mit Arduino eine Entfernung zwischen 5 und 10m misst. Ultraschall ist also keine Lösung hier.

Allerdings habe ich auch gesehn, dass aktuelle "Abstandsmesser" (für Architekten, etc.) bereits ab 30 € erhältlich sind (z.b. "Aomaso Abstandsmesser"[soll keine Werbung sein], welcher auf 60 m mit einer Genauigkeit von 2mm funktioniert )

Glaub ihr man könnte die Hardware dieses Geräts für einen Arduino verwenden? Jemand schon mal so etwas in der Art Versucht und Erfahrungen?

Mfg

rpt007

#1
Oct 04, 2016, 01:09 pm Last Edit: Oct 04, 2016, 01:11 pm by rpt007
Grundsätzlich sollte das klappen.

Aber:
Du musst dann das Signal/Protokoll des Lasermoduls kennen, um es vom Arduino lesen und weiterverarbeiten zu können.

Ich habe nachfolgend einen Beitrag dank Tante Google gefunden, wo jemand das gleiche Thema angegangen und angeblich gelöst hat. Vielleicht kannst du das entweder nachbauen oder für deine Zwecke anpassen:

http://blog.qartis.com/arduino-laser-distance-meter/

PS: in D kostet das Laserteil ca. 70-80€; beim freundlichen Chinesen (dx.com) kostet es nach 4-6 Wochen Wartezeit unter 30€ incl. Versandkosten.
Before you ask:
Did you really read and understand How to use this forum ?
AND:
Do you have already some solution or is a part of the problem sitting in front of the screen?  :)

guntherb

Ich denke, der Unterschied liegt in der Geschwindigkeit.

Wenn der Arduino eine Ultraschallimpuls aussendet, dann kommt, bei 1m Entfernung, nach ca. 6ms ein Echo.

Das sind Zeiten, die kann der Arduino handhaben.

Bei Lichtpulsen kommt bereits nach ca 6 Nanosekunden die Reflextion. Da hat der Arduino noch nicht mal gemerkt, dass er was gesendet hat.


Mit Schall kann der Arduino selbst die Zeit messen und die Entfernung berechnen.
Mit Licht braucht er ein System, das die Auswertung selbst macht und nur noch das Ergebnis zur Verfügung stellt.
Grüße
Gunther

nix_mehr_frei

Laufzeitmessung scheidet so ziemlich aus. Damit kommt man nicht viel genauer, als +/- 10m.
Eine Interferenzmessung wäre eine Möglichkeit, indem man ausgesandten Laserstrahl und Reflexion "übereinanderlegt" Da sich eine entfernungsabhängige Phasenverschiebung ergibt, wird das Ganze äußerst genau. Allerdings ist das nicht mit Hausmitteln zu bauen.
Machbar wäre mittels Rotationslaser mit konstanter Drehzahl und damit Winkelgeschwindigkeit, den zeitlichen Abstand des Auftreffens des Laserstrahles auf 2 Empfänger bekannten Abstandes zu messen.
Um das zu Veranschaulichen, ein Beispiel: Der Laserstrahl macht z.B. 20 Umdrehungen in der Sekunde. Bei einem Kreisradius von 1m beträgt der Kreisumfang 6,28m, bei 10m Radius 62,8m. Beide Kreisumfänge werden in jeweils einer zwanzigstel Sekunde 1x überstrichen.
Haben 2 Fotozellen gleichen Abstand z.B. 10 cm zueinander, so wird der Strahl beim zehnfachen Kreisradius nur ein zehntel der Zeit brauchen um das Winkelsegment zu überstreichen. Die Winkelgeschwindigkeit bleibt ja gleich. Oder anders gesagt, der die vom Laser überstrichene Fläche ähnelt einem Stück Torte. Der Abstand im Umfang bleibt gleich, aber wenn die Entfernung vom Mittelpunkt steigt, wird der Winkel schmaler.
Ein Strichlaser, wie er zum Nivellieren und anzeichnen von Aufmaßen auf dem Bau verwendet wird, sollte dafür taugen. Man muß nur seine Drehzahl kennen und hinrechend konstant halten  ;)
rot ist blau und Plus ist Minus

DrDiettrich

Grundsätzlich sollte das klappen.

Aber:
Du musst dann das Signal/Protokoll des Lasermoduls kennen, um es vom Arduino lesen und weiterverarbeiten zu können.
Das ist eigentlich nicht nötig, wenn die üblichen Sensoren verbaut sind. Die liefern einfach eine Spannung, die abhängig ist vom Einfallswinkel des reflektierten Strahls. Da hierbei die Basis des vermessenen Dreiecks sehr schmal ist, ist die Justierung des Lasers und Sensors kritisch, kann nachträglich nicht geändert werden. Deshalb sollte man also auch zum Ausschlachten nur ein Gerät mit dem gewünschten Meßbereich kaufen. Oder das Lasermodul mit Datenblatt, das allerdings bei kleinen Abnahmemengen teurer als ein Fertiggerät werden dürfte.

MaSc1

Danke für die Antworten!

Dieser Link (http://blog.qartis.com/arduino-laser-distance-meter/) schaut vielversprechend aus. Wäre auf jeden Fall einen Versuch Wert!

Eisebaer

hi,

das (nachfolge?) - modell plus gibt's bei aliexpress ab 21 euro versandkostenfrei. vor allem aber sind auf dieser seite insgesamt vier modelle mit 40, 60, 80 und 100m reichweite.

https://de.aliexpress.com/item/UNI-T-Digital-Laser-Distance-Meter-UT390B-40M-Bubble-Level-Rangefinder-Range-Finder-Tape-Measure/32643062303.html?isOrigTitle=true

ebay ab 25 euro.

gruß stefan

ThomasNF

Der UT390B+ funktioniert leider nicht.
Wäre schön gewesen, weil man den für ca. 20 € kaufen kann. Ich habe einen gekauft und versucht die serielle Schnittstelle zu nutzen. Es sind zwar Kontakte auf der Platine, die mit Rx und Tx beschriftet sind, aber die sind leider inaktiv. Ich habe auch alle anderen Kontakte mit meinem Oszilloskop durchgemessen. Es gibt nur einen Kontakt der ein Signal zeigt. Das ist aber ein Sinus Signal, kein Datensignal.

Ich habe Sensoren bestellt, die eine serielle Schnittstelle haben. Gleiches Prinzip wie die üblichen Entfernungsmesser. Genauigkeit +/- 1mm.
Wenn jemand einen davon haben will, einfach schreiben....

uwefed

Meiner Meinung nach mußt Du zuerst eine Anfrge für Daten senden und dann gibt das Gerät eine Antwort.
Grüße Uwe

ThomasNF

Guter Vorschlag, auf die Idee bin ich noch nicht gekommen.
Das probiere ich mal aus.

keineZeit

Der UT390B+ funktioniert als Sensor für den Arduino.

Nach Lesen dieses Threads Peek inside UNI-T UT390B+ habe ich keine Versuche über die serielle Schnittstelle unternommen. Es wäre interessant, ob sich der UT390B+ darüber doch ansprechen lässt.

Ich bin einen anderen Weg gegangen und war erfolgreich. Einzig, für den gedachten Anwendungsfall ist der UT390B+ nicht geeignet. Er kann keinen Abstand messen, wenn sich dieser während der Messung zu stark ändert. Dafür ist die Messzeit zu groß. In der Regel schafft das Gerät eine Messung pro Sekunde. Ändert sich der Abstand schneller als ca. 1 m/s, liefert der UT390B+ überhaupt keinen Messwert.

Wenn der Microprozessor des UT390B+ die Entfernung misst und diese ausschließlich dem Display erzählt, belausche ich doch die Kommunikation zwischen den Beiden. Die Schnittstelle hat etwas von einem 68x8 bitigem Schieberegister. Jedes Bit entspricht einem Anzeigefeld. Ich musste drei Signale abgreifen. Das Anlöten am Displaystecker ist knifflig und das Timing mit einem 16MHZ-Arduino gerade so zu schaffen. Aber es geht und der UT390B+ ist so ein preiswerter und guter Laser-Entfernungssensor für den Arduino.

snargus

@keineZeit 
Kannst du dein Programm dazu posten?

keineZeit

Was ich habe, kann ich gerne posten. Gerne auch noch ein paar Bildchen dazu, wie ich den Anschluss gemacht habe.

Es wird aber morgen werden (Nomen est omen ;) ). Mein Ziel war es, den UT390B+ als Laserentfernungssensor für den Arduino zu verwenden. Dieses Ziel habe ich erreicht. Mit einem Arduino kann ich nun große Entfernungen millimetergenau messen. Allerdings darf sich die Entfernung innerhalb der Zeit einer Messung (ca. 1 bis 3 Sekunden) nicht ändern.

Ich hatte mir nicht bewusst gemacht, wie lang so ein Messvorgang wirklich dauert. Für meinen Anwendungsfall ist dieses Messprinzip nicht geeignet und so habe ich das Programm nicht weiter entwickelt. Es funktioniert und zeigt, dass es geht. Für eine Verwendung müsste man die Funktionen noch straffen, sortieren und in eine Klasse packen. Wer sich die Arbeit machen möchte, kann mich gern zu dem Programm fragen.

O.K., das Ganze gibt's morgen.

qualidat

Such mal bei Ebay nach zwei Stichworten:

1. LIDAR
2. Time-of-Flight

Sind teilweise rel. preiswerte Entfernungsmesser ...

keineZeit

#14
Mar 18, 2018, 03:29 pm Last Edit: Mar 20, 2018, 03:40 am by keineZeit
So, hier nun das versprochene Programm. Ich habe dieses Programm geschrieben, um zu testen, ob ich den UT390B+ als Sensor an den Arduino anschließen kann. Der Versuchsaufbau besteht aus dem Arduino, dem UT390B+ und einer Taste. Drückt man die Taste, schaltet das Programm den UT390B+ ein und führt permanent Messungen durch und gibt die Messwerte über die serielle Schnittstelle aus. Drückt man die Taste erneut, wird der UT390B+ wieder ausgeschaltet.

Die Kontrolle des UT390B+ über die Ansteuerung seiner READ-Taste und OFF/CLEAR-Taste über I/O-Pins ist kein Problem. Der UT390B+ läuft prima mit 5V Versorgungsspannung. Um den verbauten 3,3V-Mikroprozessor nicht unnötig zu stressen, habe ich darauf verzichtet, die OUTPUT-Pins auf OUTPUT und HIGH zu schalten. Da die Eingänge des UT390B+ aktiv LOW sind, schalte ich die Pins auf INPUT und nur zum Aktivieren kurzfristig auf OUTPUT (LOW). Das hat auch noch den Vorteil, dass ich über OFF/CLEAR prüfen kann, ob der UT390B+ eingeschaltet ist.

Der UT390B+ zeigt die gemessene Entfernung auf dem Display an. Dabei interessiere ich mich nur für die unterste Zeile. Zweimal in der Sekunde sendet der STM32 68 Byte an das Display. Einzelne Bits dieser Nachricht stehen dabei für konkrete Segmente des LCDs. Ich musste also nur den Bitstrom mitlesen und herausfinden, welche Bits für welche Segmente in der untersten Zeile stehen.

Drei Signalleitungen habe ich identifiziert und sie Clock, Data und ByteSequenz getauft. Ich habe auch noch das Piepsersignal abgegriffen, einen wirklichen Mehrwert bringt das aber nicht. Genauso gut könnte man die Anzeige auf der untersten Zeile überwachen.

Der Bitstrom wird über Int0 und Int1 mitgelesen. Der Rest des Programms arbeitet nach dem Handball-Strafminuten-Prinzip. Ich habe mich immer gefragt, woher weiß der Schiedsrichter beim Handball, wann ein Spieler seine Strafminuten abgesessen hat und wieder mitspielen darf. Der Spieler bekommt eine Zeitkarte. Ist diese Spielzeit erreicht, darf er wieder mitspielen. Nach diesem Prinzip vermeide ich delay() und brauche auch keine Timer um bestimmte Zeitabstände einzuhalten. Den einzelnen Prozessschritten werden Status zugeordnet. Tritt ein Ereignis ein, wechselt der Status und der Prozess bekommt eine Zeitmarke, an dem die Verarbeitung weitergeht.

Wer eine Anwendung für solch einen Sensor hat, kann sie günstig - keine 20 Euro - realisieren, man muss nur sehr fein löten können  ;)

Go Up