Willkommen! Anmelden Ein neues Profil erzeugen

Erweiterte Suche

Bed-Leveling Code Modifizieren

geschrieben von Junkie 
Bed-Leveling Code Modifizieren
20. August 2017 12:01
Hallo Zusammen,

ich habe mir ein Z-Taster aus einer Waagezelle ähnlich wie bei Link aufgebaut.
(Die Mechanik ist etwas anders die Hardware ist aber weitgehend identisch und die angebotene Software verwende ich 1:1)

Das Problem, das alle Wagezellen nach diesem Prinzip habe ist eine Drift über die Zeit, weswegen man diese regelmäßig auf Null setzen muss.
Das Kann ich einmalig vor der Bettkalibrierung mit dem M42 G-Code durchführen. (bei mir hat es abweichend vom Instructable nur mit S255 und nicht mit S1 funktioniert - vielleicht hilft das irgendwem)

Mein Aktuelles Skript lautet:
M42 P4 S255 ; zero the load cell by pulsing Digital Pin 4 
M42 P4 S0
G32 S2 ; Probe Z and calculate Z plane
M42 P4 S255 ; zero the load cell by pulsing Digital Pin 4 
M42 P4 S0
G33    ; Measure distortion Matrix
G28    ; Home

Nun ist mein Eindruck allerdings, dass ein paar mehr Nullsetzungen nicht schaden könnten. Am liebsten eigentlich direkt vor jeder Messung.
Und der Eindruck kommt nicht etwa von unsauberen Druckergebnissen, sondern von einem selbstständigen "Notaus" des Druckers während des Bedlevelings nach einer zufälligen Anzahl korrekt gemessener Messpunkte... confused smiley


Im Code vom Sensor-Arduino hat diese Modifikation glaube ich wenig Sinn, da man nicht mit Sicherheit einen Zeitpunkt erwischen wird, zu dem der Druckkopf gerade still steht.

Daher wolle ich das gern in der Repetier Firmwäre ändern - kann ja eigentlich kein Hexenwerk sein - und mit Hilfe der Gemeinschaft in diesem Forum erst recht nicht. smiling smiley

Leider durchschaue ich den Text mit den diversen Funktionen (deren Definitionen teilweise für mich unauffindbar sind) nicht so, wie ichs gern hätte. Ich verfüge aber auch nur über sehr rudimentäre C++ Kenntnisse.
Daher kann ich bisher nur mehr oder weniger raten was zu tun ist und hoffe von euch auf den richtigen Weg gebracht zu werden. Mein Ansatz:

In dem Reiter "BedLeveling.cpp" der aktuellsten Repetier Firmware ab Zeile 306.
Meine Vermutung ist aktuell, dass ich diese wie folgt modifizieren muss
#if DRIVE_SYSTEM == DELTA
        if(r > 0) {
            Commands::processMCode('M42 P4 S255');  //von mir ergänzt
            Commands::processMCode('M42 P4 S0');      //von mir ergänzt
            Printer::finishProbing();
            Printer::homeAxis(true, true, true);
            Printer::moveTo(IGNORE_COORDINATE, IGNORE_COORDINATE, EEPROM::zProbeBedDistance() + EEPROM::zProbeHeight(), IGNORE_COORDINATE, Printer::homingFeedrate[Z_AXIS]);
            Printer::startProbing(true);
        }
#endif

Allerdings verstehe ich absolut nicht was das "*com" in "void Commands::processMCode(GCode *com)" zu bedeuten hat. (muss aber auch nicht sein, wenns am Ende läuft winking smiley)

Zusätzlich wäre vielleicht sogar eine kurze Pause vor dem Nullsetzen nicht verkehrt, damit der Druckkopf auch wirklich stillsteht und ein paar Mikro-Schwingungen abklingen können.
Aber da wüsste ich jetzt nicht wie ich eine Pause definieren muss, ohne das Ganze Programm zu "lähmen" (mindestens Temperaturregelung und Notaus sollten ja ungehindert weiterlaufen)

Das Ganze sollte dann nach Möglichkeit sowohl im Befehl G32 S2 als auch im G33 funktionieren. Wäre das so, wenn ich das an der Stelle einbaue oder muss ich das noch wo anders ebenso machen?

Gruß
Junkie
Re: Bed-Leveling Code Modifizieren
21. August 2017 07:12
Schau dir mal die Firmware von meinem FSR Board auf Github an. Dort werden 2 gleitende Durchschnittswerte gebildet um dem Drift (den die FSR-Sensoren in ähnlicher Form haben) Herr zu werden.


--
Microsoft MVP in den Kategorien DirectX/XNA * Visual C++ * Visual Studio and Development Technologies seit 2011

  • Mein Erster (RAMPS 1.4, Selbstbau WolfStrap-Derivat mit Linearführungen, Wade Extruder und E3D lite6 Hotend)
  • Cub44 (Selbstbau Dual Wire Gantry Derivat mit Zahnriemen und Linearschienen, RADDS 1.5 und DUE, Custom Hotend - E3D like, Compact Bowden Extruder)
  • HexMax (sechseckiger Delta (eigenes Design) mit Druckraum 300mm Durchmesser und >=400mm Höhe, RADDS 1.5, 24V, Custom Hotend, Compact Bowden Extruder)
  • P3Steel Toolson MK2 - Keine Zeit zum selbst planen ;-)

Andere Projekte: FSR Board (ABL-Sensor-Platine inkl. Firmware) * ThirtyTwo (32Bit RepRap-Firmware)
Re: Bed-Leveling Code Modifizieren
22. August 2017 05:02
Hallo,
ich verstehe nicht, das der Nano an den Servo-Anschluß der Rampe gelegt wird.
Der Nano gibt doch bestimmt einen Scchaltimpuls aus, wenn die Wiegezelle auslöst.
So müsste doch der Schaltimpuls des Nano's an den "Z-Schalt-Eingang" der Rampe gelegt werden.

Gruß mh
Re: Bed-Leveling Code Modifizieren
22. August 2017 05:17
@maheau0:
Wie beschrieben muss die Wägezelle genullt werden. So wie jede gewöhnliche digitale Waage über den Knopf, der üblicherweise mit "Tare" beschriftet ist.
Dieses Nullen muss zum richtigen Zeitpunkt ausgelöst werden, um optimale Messergebnisse zu erhalten.

@Galtzemann
Ich hab mir die ersten (gefühlt 100) Seiten deines Threads "FSR Auto-Bed-Leveling-System" durchgelesen. Dabei ist mir aufgefallen, das ich das meiste davon schon vor meinem Wägezellen Umbau gelesen hatte.
Ich habe beim zweiten Lesen darin aber (möglicherweise aufgrund fehlender Geduld eye rolling smiley) keinen Link auf dein Github Projekt finden können. Und auf Github unter der Suche auch nichts gefunden, dass sich eindeutig als dein Projekt identifizieren ließ.
Magst du den Link bitte einmal posten?

Hab ich das richtig verstanden, dass du der Urheber des Quellcodes bist, der mit G33 abegrufen wird? Dann bin ich ja direkt an den richtigen geraten!
Ich würde aber tatsächlich - wie von dir vorgeschlagen - den Weg präferieren das zu optimieren, was der Arduino-Pro-Mini macht. Sonst müsste ich ja bei jedem Firmwareupdate alle meine Äderungen wieder neu einbauen. (Es sei denn in der nächsten FW Version wird ein optionaler Tare-Ausgang bereits berücksichtigt... smiling smiley)

Gruß
Junkie

1-mal bearbeitet. Zuletzt am 22.08.17 05:27.
Re: Bed-Leveling Code Modifizieren
22. August 2017 05:38
Hier ist die URL meines Projektes auf GitHub.

Ich habe für Repetier mal einen Code für G33 beigesteuert. Der wurde leider - zugunsten einer weniger genauen und einfacheren Variante - nicht in Repetier aufgenommen.


--
Microsoft MVP in den Kategorien DirectX/XNA * Visual C++ * Visual Studio and Development Technologies seit 2011

  • Mein Erster (RAMPS 1.4, Selbstbau WolfStrap-Derivat mit Linearführungen, Wade Extruder und E3D lite6 Hotend)
  • Cub44 (Selbstbau Dual Wire Gantry Derivat mit Zahnriemen und Linearschienen, RADDS 1.5 und DUE, Custom Hotend - E3D like, Compact Bowden Extruder)
  • HexMax (sechseckiger Delta (eigenes Design) mit Druckraum 300mm Durchmesser und >=400mm Höhe, RADDS 1.5, 24V, Custom Hotend, Compact Bowden Extruder)
  • P3Steel Toolson MK2 - Keine Zeit zum selbst planen ;-)

Andere Projekte: FSR Board (ABL-Sensor-Platine inkl. Firmware) * ThirtyTwo (32Bit RepRap-Firmware)
Re: Bed-Leveling Code Modifizieren
22. August 2017 12:47
Hallo Junkie und Glazemann,
danke für die Info.
Junkie, du hast aber nicht auf meine Frage geantwortet -- bitte

Gruß mh
Re: Bed-Leveling Code Modifizieren
22. August 2017 14:12
Hallo Maheau0,

ich dachte ich hätte - vielleicht nicht gut genug... Sorry.

Ich nehme an du hast das verlinkte Instructable dazu gelesen?
Wenn du überwiegend auf die Bilder geachtet hast, wird das tatsächlich nicht klar. Im Text steht jedoch, dass D3 vom Arduino-ProMini / Nano an den Z-Trigger angeschlossen wird.
Ich habe vom der Pin-Leiste für die Endstops Masse und 5V für den Mini abgegriffen und den Pin D3 auf den Schalteingang zurückgeführt.
In den Bildern wird nur gezeigt, dass was an den Servo Pin dran geht - das ist das was ich in meinem letzten Post beschrieben habe. Dachte das hätte dich nur verwirrt, weswegen ich nur darauf eingegangen war.

Vielleicht habe ich das Instructable auch etwas abgewandelt ohne es zu merken. Bis auf die beschriebenen Probleme läuft es aber wie erwartet.

Gruß
Junkie

1-mal bearbeitet. Zuletzt am 22.08.17 14:14.
Re: Bed-Leveling Code Modifizieren
23. August 2017 02:57
Hallö Junkie,
danke für die Info
Ich verstehe nur nicht, warum der Servo-Eingang für die Wiegezeile genutzt wird.
Hast du auch eventl. die Änderung in der Firmware - Marlin-?

mfg mh

1-mal bearbeitet. Zuletzt am 23.08.17 03:29.
Re: Bed-Leveling Code Modifizieren
23. August 2017 03:27
Ich denke mal weil der eine Pin von dem sich ohne Modifikationen in der Repetier-FW über den Maschinenbefehl "M42 P4 Sx" ansprechen lässt.
Ist ja auch eher ein Ausgang als ein Eingang.
hat deine Frage tiefergehende Beweggründe? Willst du z.B. die Wägezelle auch implementieren, hast alle Servoausgänge bei dir aber schon belegt ?
Re: Bed-Leveling Code Modifizieren
23. August 2017 03:51
Hallo Junkie,
ich habe z.Zt. einen induktiven Sensor. Ich bin aber mit der "Genauigkeit" nicht zufrieden und würde mir das Abl mit der Wiegezelle aufbauen-
Warum wird denn der Servo-Port überhaupt bei diesen System gebraucht?
Der Arduino-Uno ist doch eine geschlossene Einheit und brauchte nur Strom.
Hast du auch der Änderung der Marlin-FW?


mfg mh
Re: Bed-Leveling Code Modifizieren
23. August 2017 14:43
Hallo Glatzemann,

besteht die Chance, dass du mir noch etwas weiter mit dem Code hilfst? confused smiley
Ich sitze jetzt seit zwei Stunden davor und habe versucht erstmal das weg zu löschen, von dem ich sicher bin, dass ich es für mein Vorhaben nicht benötige. (Alles Thermistoren LEDs, EEPROM, und Befehlen).
Der Rest ist aber immer noch etwas überwältiigend für jemanden, der zum letzten mal vor 2 Jahren etwas programmiert hat. Und dann auch nur in jeweils in einer Datei ohne Klassen und Templates und so einem Hexenwerk.
Die Anzahl von Funktionen, die über mehrer Textdateien ineinandergreifen erschlagen mich gerade etwas.

Die Idee einen Ringspeicher aufzubauen um den gleitenden Mittelwert zu berechnen finde ich super, aber wie ich deinen Code für mich umsetzen kann weiß ich absolut nicht.

Meine Waagezelle gibt mir eine long Variable mit dem letzten Lesewert raus. Den muss ich irgendwie vermittelwerten und dann noch ein Delta vorgeben, das zwischen den letzten beiden Lesungen maximal liegen darf, bevor der Sensor ausschlägt. Dieses Delta hat dann idealerweise noch ein Vorzeichen, da ich ja genau weis in welcher Richtung nur ausgelöst werden soll.

Gruß
Junkie

edit:
hab mich jetzt mal an was eigenem versucht. Sieht bisher recht vielversprechend aus. Hilfe wird also erstmal nicht benötigt - trotzdem danke.

2-mal bearbeitet. Zuletzt am 24.08.17 02:12.
Re: Bed-Leveling Code Modifizieren
25. August 2017 02:11
Hallo Junkie,
du hast immer noch nicht auf meine Frage geantwortet-warum gerade an den Servoanschluß angeschlossen?


nfg mh
Re: Bed-Leveling Code Modifizieren
25. August 2017 02:22
@Junkie: Na klar besteht die Möglichkeit.

Herz vom Ganzen ist eigentlich der CircularBuffer, wie du schon erkannt hast. Der befindet sich in CircularBuffer.h und ist als Template ausgelegt. Das ist aber für dich nicht so wichtig :-) Wie du ihn benutzen kannst, siehst du in Sensor.h und Sensor.cpp. Diese beiden Quelldateien sind dazu da, um die eigentlichen Sensoren zu verwalten.

In Sensor.h siehst du in Zeile 59 und 60 wie zwei CircularBuffer erzeugt werden, ein Short-Buffer und ein Long-Buffer. Ab Zeile 31 in Sensor.cpp siehst du, wie die Buffer befüllt werden. Der Short-Buffer in jedem Zyklus und der Long-Buffer nur alle paar (Milli)-Sekunden. Der Sinn dahinter ist einfach:

Mittels des Short-Buffer wird der aktuelle Sensor-Wert "geglättet". Hier wird einfach der Mittelwert aus den n letzten Messungen gebildet. Gibt es kurze Messspitzen (aus welchem Grund auch immer) am Sensor, so werden diese ausgefiltert.

Der Long-Buffer ermittelt einen gleitenden Durchschnitt über einen längeren Zeitraum. Das ist dazu da, da die FSR-Sensoren und wie du sagst auch die Wägezellen, mit der Zeit einen immer höheren Wert ausgeben. Dieser Wert wird hier ermittelt und im Grunde als "Nullpunkt" angesehen.

Wenn nun der Short-Buffer um einen bestimmten Wert vom Long-Buffer abweicht, so wird einfach der Ausgang getriggered und es wurde ein Kontakt erkannt.

Wie ich das mache, siehst du in der Methode is_triggered ab Zeile 53 der Sensor.cpp.

Den ganzen Rest wirst du vermutlich nicht benötigen und dient hauptsächlich dem Komfort.


--
Microsoft MVP in den Kategorien DirectX/XNA * Visual C++ * Visual Studio and Development Technologies seit 2011

  • Mein Erster (RAMPS 1.4, Selbstbau WolfStrap-Derivat mit Linearführungen, Wade Extruder und E3D lite6 Hotend)
  • Cub44 (Selbstbau Dual Wire Gantry Derivat mit Zahnriemen und Linearschienen, RADDS 1.5 und DUE, Custom Hotend - E3D like, Compact Bowden Extruder)
  • HexMax (sechseckiger Delta (eigenes Design) mit Druckraum 300mm Durchmesser und >=400mm Höhe, RADDS 1.5, 24V, Custom Hotend, Compact Bowden Extruder)
  • P3Steel Toolson MK2 - Keine Zeit zum selbst planen ;-)

Andere Projekte: FSR Board (ABL-Sensor-Platine inkl. Firmware) * ThirtyTwo (32Bit RepRap-Firmware)
Re: Bed-Leveling Code Modifizieren
25. August 2017 03:57
Hallo,
danke für die ausführliche und schnelle Antwort.
Jetzt ist nur noch offen, ob du auch das Ganze auch für Marlin hast.
Es benutze es schon länger ohne Probleme.

mfg mh
Re: Bed-Leveling Code Modifizieren
25. August 2017 04:01
Ich würde die eigentliche Drucker-Firmware nicht modifizieren. Der Code wird in ein Programm für einen Arduino Nano oder Pro Mini oder so eingebaut. Daran hängt die Wägezelle und beim auslösen wird ein Ausgang "durchgeschaltet". Dieser Ausgang ist dann mit einem Endstop-Eingang der Druckerelektronik verbunden. Und Marlin muss dann nur so konfiguriert werden, daß es auf diesen Endstop-Eingang "lauscht".


--
Microsoft MVP in den Kategorien DirectX/XNA * Visual C++ * Visual Studio and Development Technologies seit 2011

  • Mein Erster (RAMPS 1.4, Selbstbau WolfStrap-Derivat mit Linearführungen, Wade Extruder und E3D lite6 Hotend)
  • Cub44 (Selbstbau Dual Wire Gantry Derivat mit Zahnriemen und Linearschienen, RADDS 1.5 und DUE, Custom Hotend - E3D like, Compact Bowden Extruder)
  • HexMax (sechseckiger Delta (eigenes Design) mit Druckraum 300mm Durchmesser und >=400mm Höhe, RADDS 1.5, 24V, Custom Hotend, Compact Bowden Extruder)
  • P3Steel Toolson MK2 - Keine Zeit zum selbst planen ;-)

Andere Projekte: FSR Board (ABL-Sensor-Platine inkl. Firmware) * ThirtyTwo (32Bit RepRap-Firmware)
Re: Bed-Leveling Code Modifizieren
25. August 2017 04:03
Hallo,
danke für den Hinweis.

mfg mh
Re: Bed-Leveling Code Modifizieren
25. August 2017 05:27
Hallo Glatzemann,

vielen Dank für die weiteren Tipps!

Hier ist ein Auszug aus den ungefiltertern Messwerten, die ich aus dem Serial-Monitor erhalte:

Dabei hab ich erst 5 mal so, dass ich gerade eben den Kontakt gespürt habe mit der Fungerkuppe von unten auf die Düse getippt. Dann 5 Mal von oben auf das Hotend und dann noch 5 mal von unten.
Dann hab ich noch etwas laufen lassen, um ein paar Ausreißer einzufangen - mit Erfolg.

Ich hatte mir jetzt erstmal meine Interpretation eines Ringspeichers aufgebaut, indem ich ein Array mit 10 ungefilterten Messungen gefüllt habe und den Durchschnitt daraus erstmalig berechnet habe.

Dann im Loop gucke ich jeweils, wie stark der nächste Messwert vom Durchschnitt abweicht und ignoriere Ihn wenn er einen Grenzwert übersteigt (im negativen strikter als im Positiven Bereich.
Dann schaufel ich mein Array mit einer Schleife einmal um eine Position weiter, so das der letzte Array-Eintrag immer mein aktuellster Wert ist. Das ist der durchschnitt_lang.

In einer weiteren Schleife nehme rechne ich immer nur den Durchschnitt aus den letzten drei Lesungen als durchnitt_kurz.

Das hat soweit auch schon super funktioniert, und ich wollte gestern Abend nur noch eben den Durchschnitt 10 auf 20 Werte verdoppeln, um es etwas mehr zu glätten - da konnte ich plötzlich den µC nicht mehr beschreiben...
Jetzt muss ich mir wohl erstmal einen neuen mit Pinleisten versehen bevor es weiter gehen kann. (Hoffe nur das liegt nicht an meinem Programmer oder irgendwelchen heimlichen Windows10-Updates...)

Gruß
Junkie

1-mal bearbeitet. Zuletzt am 25.08.17 05:28.
Re: Bed-Leveling Code Modifizieren
29. August 2017 02:14
Moin moin,

ich habe jetzt ne Weile mit langem und kurzem Durchschnitt rumexperimentiert.
Leider stellt sich bei meinem Drucker ein Effekt ein, dass bei einer rein horizontalen Bewegung des Druckkopfes beide Durchschnittswerte zu wandern anfangen. Und dass bei der Bewegung in der einen Richtung entgegengesetzt als in der Gegenrichtung. Und merkwürdiger Weise bleibt der Durchschnitt auf dem Wert stehen, bei dem er angekommen ist und wandert nicht zurück zum Ausgangsniveau.
Ich dachte zuerst, ich hätte noch irgendwo eventuell ein Kabel an dem "gewogenem" Bereich des Druckkopfes, das immer zurück in die Gehäusemitte zieht - das hätte das Verhalten für mich erklärt - aber die sind alle über den festen Druckkopf-Teil fixiert.
Das Problem an der Sache ist, dass bei einem horizontalen Bewegungsrichtungswechsel teilweise Sprünge entstehen, die meine vorgegebenen Sensorschwellwert überschreiten und diesen auslösen lassen.
Den Sensorschwellwert hoch setzen hab ich schon weiter ausgereizt, als mit lieb ist. Die Waagezelle hatte ich ja gewählt um nahezu Kraftlos messen zu können...
Das einzige, was bisher geholfen hat - mir aber gar nicht gefällt - ist die xy-Geschwindigkeit beim Bett-Abtasten auf 10 bis 15 mm/s runter zu setzen.

Ich spiele bereits mit dem Gedanken die Zeitpunkte, bei denen das Firmware-Script die Messpunkte nimmt zu stoppen und einen Timer in Arduino-Mini laufen zu lassen.
Dann würde der Sensor nur in definierten Zeitfenstern scharf geschaltet werden. Synchronisieren ließe sich das über den Tare Befehl zu Beginn.
Ich befürchte nur, dass ich irgendwelche Effekte übersehe, die dafür sorgen könnten, dass die Zeiten gelegentlich voneinander abweichen...

Gruß
Junkie
In diesem Forum dürfen leider nur registrierte Teilnehmer schreiben.

Klicke hier, um Dich einzuloggen