Arduino Uno Schrittmotor Abstandssensor

Ok, ich hab das anders verstanden.

... ich dachte, der sollte stehen bleiben und sich nicht mehr bewegen. :man_shrugging:

Wenn der Abstand größer als 30mm ist darf sich der Motor drehen wenn der Taster 1 gedrückt wird.
Sobald der Abstand kleiner 30mm ist soll der Motor stoppen.

Ich möchte den Abstandssensor genau genommen als Endschalter verwenden, damit Tisch inklusive Material nicht gegen das Lasermodul fährt.

Leider kann ich keinen richtigen Endschalter verwenden, da dieser unterhalb des Lasermoduls befestigt werden müsste und somit die Gefahr wäre, dass der Endschalter sich beim lasern im Material verfängt.

Tut er ja wohl auch bereits jetzt schon. D.h. da liegt nicht das Problem.
Der Ansatz von Stefan könnte durchaus die Lösung sein ... :wink:

Ok, dann war meine Vorstellung schon richtig und Dir fehlt jetzt für 40ms der Antrieb..
Die Frage ist jetzt: Wie weit bewegt sich der Schlitten innerhalb welcher Zeit?

Das hab ich jetzt auch gemerkt :slight_smile:

Das wäre in der Tat zu klären, was da akzeptiert werden kann. Bei einer Lösung mit den MobaTools wird sich der Motor auch während der Messzeit bewegen. Da müsste man eben schauen, was da an Tempo zulässig wäre. Gegebenenfalls muss man evtl. langsam wieder zurückfahren, bis der Abstand gerade so wieder >30mm wird.

Durch die Verwendung einer Lib wird die Steuerung ja nicht zwangsläufig komplizierter (was innerhalb der Lib passiert muss dich ja nicht kümmern :wink: ). Aber sie muss eben auch die Anforderungen erfüllen.
Die Bedienung kann sowieso gleich bleiben.

@flolan ,

noch eine Idee:
Ob die wirklich praktikabel ist kann man erst dann beurteilen wenn du Bilder von deinem Lasergerät gepostet hast.

Eine horizontal strahlende Lichtschanke. Wenn Strahl unterbrochen Höhengrenzwert erreicht.

Noch eine Sensorvariante wäre ein Abstandssensor mit Analogausgang.
Und auch da braucht es mehr Details von dir
Der Sharp GP2Y0E03 misst Abstände über reflektiertes IR-Licht. Der muss kalibriert werden
auf die Reflektivität der Oberfläche. Haben die Oberflächen immer die gleiche Reflektivität oder variiert die?

Ein Schrittmotorantrieb braucht nun mal ein sehr exaktes Timing.
Da kommt es jetzt darauf an würde das Einlesen des Analogeingangs schnell genug gehen so dass der Schrittmotor immer noch mit gewünschter Frequenz / Drehzahl läuft.

40 Millisekunden ist ja vergleichsweise kurz aber stört die hochfrequente Schrittausgabe an den Schrittmotor. Eine Lösung wäre einen zweiten kleinen Microcontroller mit der Abstandsmessung zu beauftragen und dann einen IO-pin LOW/HIGH schalten.
Einen einzelnen IO-pin abfragen geht sehr schnell. Das würde man in der hochfrequenten Schrittausgabe unterbringen können.

@MicroBahner
da hätte ich ja auch noch eine Idee für die MobaTools aber keine Ahnung ob das überhaupt gehen würde oder wie viel Aufwand das wäre so etwas mit einzubauen.

Eine Option, dass die MobaTools den Wert einer vom User mitgeteilten booleschen Variable
auf true/false checken und wenn true oder false dann Schrittausgabe stoppen.
Um kleinstmögliche Latenzzeit zu erreichen wird die Variable in einer PIN-interrupt-routine gesetzt.

Hallo Stefan,

die Option mit zusätzlichen Controller für die Abstandsmessung ist mir gestern eingefallen.

Welchen Controller würdest du empfehlen?
Arduino nano?

Eine andere Möglichkeit wäre einfach ein Endschalter am Lasermodul.
Diesen müsste ich aber immer nach unten klappen und wieder hoch, damit er nicht beim fahren stört.
Leider habe ich da noch keinen gefunden der automatisch hoch fahren kann.

Bitte nicht falsch verstehen ich bin relativ neu im Arduino Geschäft.
Für euch sind da manche Funktionen viel einfacher umzusetzen.
Ich glaube aber, dass ich noch ein bisschen Übung benötige.

Ich werde heute Abend noch ein paar Bilder hochladen.

Vielen Dank für alle Antworten und Unterstützung bis hierher. Das kommt nicht in jeden Forum vor.

Das macht meiner Meinung nach wenig Sinn. Die Verzögerung bleibt die gleiche, nur dass jetzt der Pin mit einer entsprechenden Verzögerung aktiviert wird. OK, dann kann man in der Zeit im Sketch Steppulse erzeugen, aber das geht mit den MobaTools genau so.
Außerdem böte die VL53L0X-Lib eh schon eine vergleichbare Funktion: Messung starten ( ohne Blocking ) und dann auf 'Messung-Fertig' Pin am Modul reagieren (braucht aber einen LevelShifter für 5V MCU's). Da gibt's auch ein Beispiel für.
Das Problem, dass der Motor die 'Stop-Info' erst verzögert erhält bleibt immer die gleiche. Das liegt einfach daran, dass der Sensor eben erst mit einer Verzögerung von 40ms erkennt, dass die 30mm unterschritten sind. Da kommt man nicht drumherum - da würde nur eine schnellere Abstandsmessung helfen.

@flolan muss erstmal sagen, wie weit die 30mm unterschritten werden dürfen. D.h. wieviele Schritte darf der Motor in den 40ms überhaupt machen. Um die Position dennoch genau erreichen zu können, ohne dass es zu lange dauert, kann man den Stepper dann ganz langsam wieder die paar Schritte zurückfahren lassen, bis die 30mm genau erreicht werden.

P.S. Die Lib bietet auch die Möglichkeit einer kontinuierlichen Messung mit Abfrage, wann eine Messung fertig ist. Da braucht man den 'Fertig-Pin' nicht und hat trotzdem keine Blockierung. @flolan nutzt halt bisher die primitivste ( blockierende) Variante der Lib - die kann aber wesentlich mehr. Da I2C aber nicht die schnellste Kommunikation ist, und immer etwas Zeit braucht, wären die MobaTools für die Steperzeugung unabhängig davon die bessere Wahl.

Hallo Zusammen,

hier die Bilder vom Laser und dem höhenverstellbaren Tisch.

Auf das Wabengitter wird das Material z.B. 3mm Sperrholz gelegt.
Wenn ich jetzt Taster 1 drücke, wäre es schön wenn der Tisch bis zum idealen Abstand zum Lasermodul, Beispiel 30mm je nach Montagehöhe des ToF am Lasermodul, fährt.

Nach unten wird der Motor durch einen Endschalter gestoppt, sodass der Tisch nicht beschädigt wird.
Diese Funktion ist einfach umzusetzen, da ein Endschalter zum Einsatz kommt.

Am Lasermodul kann ich leider keinen Endschalter montieren, da dieser unterhalb des Moduls sein muss, um beim hochfahren auslösen zu können. Wenn er aber unterhalb ist kann er sich beim Lasern im Material verhängen.

Vielleicht kennt jemand einen Endschalter der einen Stift, per Ansteuerung, ausfährt und bei Materialkontakt schaltet.

Das aktuelle Problem ist, dass sobald die Abstandsmessung eingefügt ist, der Motor ruckelt. Wahrscheinlich wegen der zu langsamen Messgeschwindigkeit des ToF.

Vielleicht hat jemand eine Idee die ich als Arduino Anfänger testen kann.
Vielen Dank an alle.





Danke für die Bilder - das macht ein paar Dinge klarer.

Dir wurde doch schon die Problematik aufgezeigt und ein paar Vorschläge gemacht.
Und meine Frage hast Du auch noch nicht beantwortet.

Also der Laser schneidet Holz oder Kunststoffteile eventuell macht er auch nur Oberflächenbeschriftung.

Bilder mit Fragen

Der maximale Fahrweg den der Tisch rauf/runter fahren kann ist Schätzungsweise 50 mm.

Der Sollabstand des Lasers zur Oberfläche ist 30 mm.
Welcher Abstand ist das?

A: Die aller aller unterste Kante vom dem schwarzen Gehäuse? (roter Maßpfeil)?
oder
B: vom oberen Ende des rosa Pfeils bis zur Holzplattenoberfläche (rosa Maßpfeil)?

Wie lange darf den der Positioniervorgang dauern?

0,5 Sekunden?
5 Sekunden
25 Sekunden?

Wenn du die Mobatools benutzt dann fährt der Schrittmotor auch während der Messung mit hoher Geschwindigkeit auch wenn eine einzelne Messung mit dem ToF-Sensor VL53L0X 41 Millisekunden dauert.

Das funktioniert so weil die Schrittmotoransteuerung quasi parallel zur Messung gemacht wird. Es ist nicht wirklich parallel sondern

ein Stückchen fahren
ein Stückchen Messung machen

ein Stückchen fahren
ein Stückchen Messung machen

ein Stückchen fahren
ein Stückchen Messung machen

Deshalb wird die Holzplatte zuerst etwas zu weit nach oben gefahren.
Aber die "große" Wegstrecke von 20 mm wird in schnellem Tempo gefahren
und die letzten 1 bis 2 Millimeter werden langsam gefahren. Aber immer noch deutlich schneller als mit einer Schrittfrequenz von 25 Schritten pro Sekunde.

Wenn denn 0,1 mm nicht genau genug ist, dann könnte man die Strecke pro Annährung reduzieren.

Du musst aber auch herausfinden was für eine Wiederholgenauigkeit der VL53L0X hat.
Und du musst schreiben was für eine maximale Toleranz im Abstand Oberfläche zu Laser noch gute Schnittergebnisse liefert.

Da du mindestens 10 mm Abstand zwischen Holzplattenoberfläche und dem schwarzen Gehäuse hast macht es nichts wenn die Holzplattenoberfläche erst einmal 1 bis 2 mm zu weit nach oben gefahren wird.

Die 1 bis 2 mm kann man dann in 0,1 mm Schritten wieder nach unten fahren
und nach jedem 0,1 mm Schritt anhalten und neu messen.
Das braucht dann noch einmal 10 * 0,041 Sekunden = 0,4 Sekunden reine Messzeit
plus vielleicht 10 * 0,5 Sekunden Fahrzeit.
Macht dann 5,4 Sekunden.
Von 50 mm Abstand um 20 mm hochfahren dauert ca. weitere 5 Sekunden.
Also alles in allem auf passenden Abstand fahren ca. 11 Sekunden.

Findest du das akzeptabel oder machst du da eine Hochgeschwindigkeits-Produktion bei der es auf jede Zehntel Sekunde ankommt?

Wenn man es mit einem mechanischen Schalter macht dann könnte das gehen wenn der Taster um 90 Grad schwenkbar ist zur Positionierung nach unten geschwenkt Höhe justieren und dann nach oben schwenken. Der Schwenkmechanismus muss spielfrei sein und einen mechanisch festen Anschlag haben damit der Sensor auch nicht im geringsten weniger als bis zum Anschlag = 90 Grad geschwenkt ist.

Da du einen unteren Referenzschalter hast könntest du auch auf den Referenzschalter fahren. Dann weiß die Höhensteuerung die exakte Position. Dann wird die Materialstärke über einen Drehencoder eingestellt und dann kann sich die Höhensteuerung ausrechnen wie weit Sie vom unteren Anschlagspunkt nach oben fahren muss damit der Abstand 30 mm zustande kommt.
Für den Referenzschalter würde ich dann aber einen Taster nehmen ohne Hebelarm sondern der eine Mechanik hat wo der "Knopf" nur senkrecht nach unten gedrückt wird und einen der eine Wiederholgenauigkeit von 1/100 Millimeter hat.

Vielen Dank Stefan.

Ich habe das ganze jetzt mit einem zweiten Arduino gelöst.
Arduino 1 misst den Abstand und schaltet über ein Relais einen digital Pin.

Arduino 2 steuert den Motor und sobald der gewünschte Wert erreicht wird stoppt der Motor.

Das einzige Problem was ich aktuell noch habe ist, dass der Abstandssensor zwischen z.B. 70 und 71 mm springt.

Wenn jemand hier noch einen Tipp hat wie ich das lösen kann wäre ich sehr dankbar.

Die Option mit der Moba Tools ist bestimmt super, ist für mich aber programmier technisch noch zu kompliziert.

Die Option mit festen Endschalter wäre umsetzbar, aber es wäre eben mit einem Abstandssensor etwas bequemer.

So mal als allgemeine Anmerkung:

Wenn man DIR Fragen stellt, dann solltest du auch wirklich die beantworten.
Wenn du denn die Fragen von @MicroBahner wirklich beantworten würdest
dann würde er dir auch weiterhelfen wie man das mit den MobaTools umsetzt.
Da gehört nicht viel dazu.

Noch mal die Frage:

Welche maximale Abweichung vom Idealabstand 30 mm liefert noch gute Ergebnisse?

Die Frage solltest du WIRKLICH beantworten.
Die Alternative dazu ist, dass man dir einen ellenlangen Text mit den verschiedensten Vorschlägen posten MÜSSTE je nach dem welche Genauigkeit erforderlich ist.
Aber das mache ich NICHT!

Die alles erschlagende Pauschalantwort ist:

Kauf dir für 2000 Euro ein Laserinterferometer dann haste Micrometerauflösung.

Danke Stefan für die nette Antwort.

Der Idealabstand zwischen Laserkopf UK und Material beträgt 4,5mm.

Die maximale Abweichung sollte 1mm sein.

Das wichtigste wäre, dass der Tisch immer bei einem Abstand von 30mm stoppt. Da sonst der Fokus des Lasers nicht optimal sitzt und somit schlechter Ergebnisse erzielt.

Ob es 30mm sind oder 40mm ist relativ egal, da das von der Montagehöhe des Sensors am Laserkopf abhängt.
Ich habe eben 30mm jetzt zum testen festgelegt.

Und nochmal Entschuldigung für meine ungenauen Antworten.

Ok also die Abweichung soll maximal 1 mm sein.
Idealerweise noch weniger.

Das bedeutet du hast den ToF-Sensor Typ VL53L0X momentan so montiert, dass der Sensor 70 mm misst wenn der Abstand Unterkante Laserkopf zu Material 4,5 mm beträgt.
Aber der gemessene Abstand springt zwischen 70 mm und 71 mm hin und her.

Machst du diese Messung am realen Laserkopf mit realem Material?

Es kann sein, dass der ToF-Sensor Typ VL53L0X es einfach nicht genauer hinbekommt.
Deswegen solltest du diese Messung am realen Laserkopf mit realen Material machen.
Und dann ein Testprogramm das auf Tastendruck den Abstand um 0,1 mm ändert und dann wieder misst.
Das dient dazu herauszufinden ob denn die Messung immer um einen Millimeter schwankt oder ob du da genau bei 0,5 mm bist und deshalb Messwert schwankt.

Eventuell kann man da noch ein bißchen mehr Wiederholgenauigkeit herauskitzeln wenn du in 0,1mm Schritten fährst bis der Messwert stabil bleibt.

Wenn der Messwert auch dann immer noch um 1 mm schwankt dann musste mit 1 mm Abweichung leben oder einen andere Messtechnik verwenden.

Super Präzision gibt es nicht zum Nulltarif.
Entweder ein schwenkbarer mechanischer Sensor den du höchstwahrscheinlich selbst konstruieren und bauen musst (= bezahlen mit Zeit )
oder ein anderer optischer Abstandssensor der von Hause aus schon 0,1 mm Genauigkeit mitbringt. Der wird aber sicherlich mehr als 10 Euro kosten.

ich würde mal eher sagen er hat das Datenblatt vorher nicht gelesen.
Wolle hat sich damit auch schon auseinandergesetzt, da finden sich wichtige Infos dazu auch zur Genauigkeit und wovon die abhängig ist.
Und ja, in dem Datenblatt findet man auch mm Angaben, aber um auf 1 mm genau zu sein braucht es auch eine Auflösung von 0,1mm.

Hallo Zusammen,

kurz zur Info, ich hab das Projekt jetzt fertiggestellt.
Leider funktionieren die tof Sensorern nicht mit der nötigen Genauigkeit.

Lösung:

Endschalter am Lasermodul verbaut und mit einem Abstandsstück die Höhe zum Material eingestellt.

Ich hab ein paar Fotos angefügt, vielleicht interessiert jemanden das Ergebniss.

Danke für die überwiegend positiven Antworten und die Unterstützung.

Gruß Florian