Skip to content

Einen Blick auf Klipper riskieren

Screenshot
Ich habe das schlechte Wetter heute genutzt, um ein wenig mit der Firmware des AnyCubic i3 MEGA herum zu spielen. Normalerweise läuft hier Marlin, mich hatte aber interessiert, was hinter dem OctoPrint Plugin OctoKlipper steckt. Man muss ja elastisch bleiben. Dabei kam heraus, daß mit Klipper eine weitere Möglichkeit zur Steuerung der Druckerei besteht. Mindestens genau so frickelig wie Marlin, das Display des Druckers wird (leider) gar nicht unterstützt, auch sonst muss man sich halbwegs ordentlich einlesen, um den Drucker überhaupt in Betrieb nehmen zu können. Das ist auch gut so, denn nur so lassen sich Schäden am Drucker oder Druckgut oder schlimmer: an Leib und Leben verhindern.

Grob gesagt unterscheidet Klipper sich von Marlin darin, daß nur ein kleiner Bootloader auf dem Drucker selber verbleibt, der dann mit dem Hostrechner - zum Beispiel einem RaspBerry PI kommuniziert und diesem die ganze Rechenarbeit überlässt. Diese Arbeit stellt die Himbeere vor keine besonders großen Herausforderungen, trotzdem sollte man möglichst zum RaspBerry Pi 3B+ greifen. Zur Installation verweise ich mal auf das Tutorial bei selbstgedruckt.de, die Menschen dort beteiligen sich auch rege in einem deutschsprachigen Fratzenbuch Forum.

Für den AnyCubic i3 Mega habe ich als Einstieg zwar die entsprechende Beispielkonfigurationsdatei auf github verwendet, da unser Drucker jedoch wegen ungebührlichen Lärmens zu einem Austausch der Lüfter (Noctua NF-A4x10 FLX 40mm zur Kühlung von Hotend und der Treiber über den Lüftungskanal hier auf thingiverse und Noctua NF-A9x14 Lüfter für das Netzteil sowie Sunon MF50151VX-A99 Radiallüfter zur Bauteilkühlung) und der Steppertreiber auf TMC2208 V1.2 verdonnert wurde, mussten die Achsen der Steppermotoren invertiert werden. Es gibt u.a. auch in der FAQ zu Klipper den Hinweis, daß die TMCs mitten im Druck aussteigen können. Das ist wohl vor allem dann der Fall, wenn die Geschwindigkeit der Achsen zu sehr hoch gesetzt wurden. (Es soll ja Leute geben, die unter Klipper mit 100mm/sec statt mit 60mm/sec drucken, tstststss...)

Bislang konnte ich derartiges Verhalten bei uns nicht beobachten. Mit der in diesen Tagen erscheinenden neuen Klipper Version sollen jedoch wohl auch diese Problem gelöst sein.

Wie auch immer: Erwähnenswert ist, daß diverse G-Code Variablen zu seltsamem Verhalten führen können. Das betrifft jedoch meistens Start- oder Endcodes sowie diverse Plugins von OctoPrint, die z.B. mit G117 eine Bildschirmausgabe erzeugen wollen.

Ein Switchen zwischen Marlin und Klipper ist problemlos möglich und in 5 Minuten bewerkstelligt, falls mal etwas nicht so klappt, wie es soll. Ich schließe zur Installation von Marlin über die Arduino IDE den ausgeschalteten Drucker via USB an meinen Rechner an, starte die Arduino IDE und wähle kompilieren / hochladen, nachdem ich den Drucker eingeschaltet habe. Das bügelt alles von Klipper weg.

Umgekehrt installiere ich Klipper, indem ich mich als pi per ssh auf dem OctoPI/OctoPrint Server anmelde, mit

cd ~/Klipper

ins Klipper Verzeichnis wechsle und dann erst mal herausfinde, auf welchem USB Port denn der jetzt am OctoPI angeschlossene Drucker lauscht. Dazu

ls -l /dev/serial/by-id/

eingeben, den ausgegebenen Port merken und dann beherzt den Klipper Bootloader mit

make flash FLASH_DEVICE=/dev/gemerkterPort

auf den Drucker kopieren. Dazu sollte man beachten, daß der Drucker nicht mit OctoPrint verbunden ist. Am besten danach rebooten, dann klappt das mit dem Drucken. ;-)

Hier noch mein config File für den AnyCubic i3 MEGA mit TNC2208 V1.2, und 8 Bit Board sowie Ultrabase. Die Achsen sind in der Firmware bereits invertiert, dazu ist das "!" vor den jeweiligen dir_pin gesetzt bzw. entfernt. Die Angaben für das PID Tuning beziehen sich auf meinen Drucker, bei anderen sollte das PID über das OctoKlipper Plugin gemacht werden. In Ergänzung zur Standard Config befindet sich ein Teil zur Regelung der Temperaturtoleranzen, ohne die mein Drucker nach wenigen Layern gleich ausgestiegen ist, die ich 1:1 aus der examples-extras.cfg Datei von Klipper entnommen habe. Noch nicht gekümmert habe ich mich um die anderen Gründe, warum ich mal einen Blick auf Klipper riskiere wie schnelleres und noch schöneres Drucken, schnellere Filamentförderung - Stichwort "pressure advance", Kaffee kochen und die Wäsche waschen...

# Anpassung der Pin Mappings für den AnyCubic i3 MEGA, TMC2208 und Ultrabase 
#
# Verwendung auf eigene Gefahr! Code kopieren und in octopi.url#conf einfügen
# 12 / 12 / 2018 thomas@trueten.de still under developement
#
# https://www.trueten.de/permalink/Einen-Blick-auf-Klipper-riskieren.html
#
#
# This file contains pin mappings for the Anycubic i3 Mega with
# Ultrabase from 2017. (This config may work on an Anycubic i3 Mega v1
# prior to the Ultrabase if you comment out the definition of the
# endstop_pin in the stepper_z1 section.) To use this config, the
# firmware should be compiled for the AVR atmega2560.
# See the example.cfg file for a description of available parameters.

[stepper_x]
step_pin: ar54
dir_pin: ar55
enable_pin: !ar38
step_distance: .0125
endstop_pin: ^!ar3
position_min: -5
position_endstop: -5
position_max: 210
homing_speed: 30.0

[stepper_y]
step_pin: ar60
dir_pin: !ar61
enable_pin: !ar56
step_distance: .0125
endstop_pin: ^!ar42
position_endstop: 0
position_max: 210
homing_speed: 30.0

[stepper_z]
step_pin: ar46
dir_pin: !ar48
enable_pin: !ar62
step_distance: .0025
endstop_pin: ^!ar18
position_endstop: 0.0
position_max: 205
homing_speed: 5.0

[stepper_z1]
step_pin: ar36
dir_pin: !ar34
enable_pin: !ar30
step_distance: .0025
endstop_pin: ^!ar43

[extruder]
step_pin: ar26
dir_pin: !ar28
enable_pin: !ar24
step_distance: .010799
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: ar10
sensor_type: ATC Semitec 104GT-2
sensor_pin: analog13
control: pid
min_temp: 0
max_temp: 260
min_extrude_temp: 170

[heater_fan extruder_fan]
pin: ar44

[heater_bed]
heater_pin: ar8
sensor_type: EPCOS 100K B57560G104F
sensor_pin: analog14
control: pid
pid_Kp: 74.883
pid_Ki: 1.809
pid_Kd: 775.038
min_temp: 0
max_temp: 110

[verify_heater extruder]
heating_gain: 2
check_gain_time: 20
hysteresis: 5
max_error: 120

[fan]
pin: ar9

[mcu]
serial: /dev/ttyUSB0
pin_map: arduino

[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 10
max_z_accel: 60

[heater_fan stepstick_fan]
pin: ar7

# Define the BLTouch servo
[servo bltouch]
pin: ar11
maximum_servo_angle: 180
minimum_pulse_width: 0.0006
maximum_pulse_width: 0.0024

# Define a probe using the BLTouch
[probe]
pin: ar2
x_offset: 26.0
y_offset: 0.0
z_offset: -1.7
activate_gcode:
    SET_SERVO SERVO=bltouch ANGLE=10
    SET_SERVO SERVO=bltouch ANGLE=60
    G4 P200
deactivate_gcode:
    SET_SERVO SERVO=bltouch ANGLE=90
    G4 P100

# Mesh Bed Leveling. One may define a [bed_mesh] config section
# to enable move transformations that offset the z axis based
# on a mesh generated from probed points. Note that bed_mesh
# and bed_tilt are incompatible, both cannot be defined.
[bed_mesh]
speed: 50
#   The speed (in mm/s) of non-probing moves during the
#   calibration. The default is 50.
horizontal_move_z: 5
#   The height (in mm) that the head should be commanded to move to
#   just prior to starting a probe operation. The default is 5.
samples: 1
#   The number of times to probe each point.  The probed z-values
#   will be averaged.  The default is to probe 1 time.
sample_retract_dist: 2.0
#   The distance (in mm) to retract between each sample if
#   sampling more than once.  Default is 2mm.
min_point: 19,32
#min_point: 0,32
#   An X,Y point defining the minimum coordinate to probe on
#   the bed. Note that this refers to the nozzle position,
#   and take care that you do not define a point that will move
#   the probe off of the bed. This parameter must be provided.
max_point: 199,212
#max_point: 175,198
#   An X,Y point defining the maximum coordinate to probe on
#   the bed. Follow the same precautions as listed in min_point.
#   Also note that this does not necessarily define the last point
#   probed, only the maximum coordinate. This parameter must be provided.
probe_count: 5,5
#   A comma separated pair of integer values (X,Y) defining the number
#   of points to probe along each axis. A single value is also valid,
#   in which case that value will be for both axes. Default is 3,3
#   which probes a 3x3 grid.
#fade_start: 1.0
#   The z-axis position in which to start phasing z-adjustment out.
#   Default is 1.0.
#fade_end: 0.0
#   The gcode z position in which phasing out completes.  When set
#   to a value below fade_start, fade is disabled. It should be
#   noted that fade may add unwanted scaling along the z-axis of a
#   print.  If a user wishes to enable fade, a value of 10.0 is
#   recommended. Default is 0.0, which disables fade.
#fade_target:
#   The z position in which fade should converge. When this value is set
#   to a non-zero value it must be within the range of z-values in the mesh.
#   Users that wish to converge to the z homing position should set this to 0.
#   Default is the average z value of the mesh.
#split_delta_z: .025
#   The amount of Z difference (in mm) along a move that will
#   trigger a split. Default is .025.
#move_check_distance: 5.0
#   The distance (in mm) along a move to check for split_delta_z.
#   This is also the minimum length that a move can be split. Default
#   is 5.0.
#mesh_pps: 2,2
#   A comma separated pair of integers (X,Y) defining the number of
#   points per segment to interpolate in the mesh along each axis. A
#   "segment" can be defined as the space between each probed
#   point. The user may enter a single value which will be applied
#   to both axes.  Default is 2,2.
#algorithm: lagrange
#   The interpolation algorthm to use. May be either "langrange"
#   or "bicubic". This option will not affect 3x3 grids, which
#   are forced to use lagrange sampling.  Default is lagrange.
#bicubic_tension: .2
#   When using the bicubic algoritm the tension parameter above
#   may be applied to change the amount of slope interpolated.
#   Larger numbers will increase the amount of slope, which
#   results in more curvature in the mesh. Default is .2.

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [extruder]
#*# pid_kp = 18.387
#*# pid_ki = 0.936
#*# pid_kd = 90.325


HINWEIS:
Alle gemachten Angaben sind ohne Gewähr auf Funktion und Richtigkeit. Für eventuell entstehende Schäden übernehmen wir keinerlei Haftung. Sämtliche Veränderungen geschehen auf Eure Verantwortung und Gefahr.

Das Tutorial ist für das AnyCubic i3 MEGA Board verfasst worden. Bei anderen Boards und Herstellern bitte auf die aktuelle Beschreibung / Installationsanweisung auf https://github.com/KevinOConnor/klipper achten!

Irgendwie muss ich das alles finanzieren, daher sind die allermeisten Links Affiliate. D.h.: Solltet Ihr über diese Links zu einem Onlinehändler geraten und dort etwas bestellen, bekomme ich eine kleine Provision, für Euch ändert das am Preis natürlich nichts. Für die Inspirationen geht ein herzliches Dankeschön an die genannten Personen, insbesondere an die OctoPrint Community!

Keep on Coding Printing!

3D Druckertestlauf gestartet

Heutezutage hat gefühlt jedeR einen Youtube Kanal. Ich natürlich auch, jedoch nur zur Prozessüberwachung. ^^ Auf meinem Kanal kann man unserem AnyCubic I3 MEGA 3D Drucker beim Testlauf zusehen, allerdings nur als Livestream. Ein wirklich toller Drucker, den ich allerdings um einiges günstiger direkt beim Hersteller über ebay gekauft habe. Er hat jedoch den Nachteil, daß er laut ist und auch sonst zu Umbauten / Modding anregt ;-) . Wozu ein 3D Drucker? Wenn man sowieso Teile per CAD konstruiert, sind Prototypen eigentlich nur noch der Druckvorgang und so schneller für's Prototyping gefertigt als "on the Fly" auf unseren Werkzeugmaschinen. Bevor jedoch ernsthafte Teile gefertigt werden, druckt der erst mal ein paar Verbesserungen, Tools und Erweiterungen für sich selber aus und absolviert nebenbei diverse Materialtestläufe. Der Drucker wird über einen RaspBerry PI3B+ gesteuert, auf dem der Opensource Server OctoPI / OctoPrint von Gina Häußge läuft. Gefilmt wird momentan mit einer RaspberryPI Cam, wobei die Bildqualität grauslig ist. 8-)



Hier die Liste der Ergänzungen bzw. Umbauten:

Bedingt durch die Umbauten an den Steppern und der Sensormessung der Druckbettausrichtung war es notwendig, die Druckerfirmware zu ändern. Als Basis dafür habe ich Marlin 1.1.6 genommen und eigene kleinere Änderungen vorgenommen, zum Beispiel PID Tuning von Hotend und Druckbett.

Work in Progress. Geplant ist die Umrüstung auf
Zum Thema Filament:
Ich drucke mit PLA in knalligem AIO Orange von AIO Robotics, Blau von Janbex, sowie 3DJAKE ecoPLA Schwarz.
Für die Temperaturrelevanten Teile verwende ich von 3dkTOP - Grau -, dieses ist nach Ofenbehandlung hitzebeständig bis 230°C sowie 3DJAKE niceABS Rot.
Neben diversesten sonstigem Kleinkram für die Werkstatt oder auch Gehäuse für einen Pocket Operator (==> hier auch mit coolen Symboltasten)lassen sich auch lebensmittelechte und flexible Teile drucken. Dazu ist nur eine kleine Ergänzung am Extruder nötig. Apropos lebensmittelecht: PLA ist ja meistens lebensmittelecht, da aus natürlich wachsenden Rohstoffen gefertigt. Das Problem sind die verwendeten Pigmente, weshalb Druckreste oder Ergebnisse, die man lieber verschwinden lässt, nicht auf dem Komposthaufen landen sollten und wegen der Oberfläche, die nie ganz glatt ist, gute Möglichkeiten für diverse Keime und Bakterien bildet. ;-)

Dementsprechend sollte man Dinge, die länger mit Lebensmitteln in Kontakt kommen sollen, zum Beispiel selbst gedruckte Deckel für Konserverndosen usw. aus entsprechendem Material, beispielsweise das von Formfutura, das es auch in relativ klar gibt, gefertigt werden.

Irgendwie muss ich das alles finanzieren, daher sind die allermeisten Links Affiliate. D.h.:Solltet Ihr über diese Links zu einem Onlinehändler geraten und dort etwas bestellen, bekomme ich eine kleine Provision, für Euch ändert das am Preis natürlich nichts. Für die Inspirationen geht ein herzliches Dankeschön an die genannten Personen, insbesondere an die OctoPrint Community!

Keep on Coding Printing!

OnePlus 6T: Kaum da, schon gerootet ;-)

Zur Abwechslung mal wieder was über Telefone. Nach 4 Jahren mit dem OnePlus One, dem so allmählich die Puste ausging, war es mir mal nach Veränderung, so orderte ich mir eine neue Telefonzelle. Es musste mit 256 GB internem Speicher und 8 GB RAM natürlich gleich der dickste Bolzen sein. ;-) Da mich die Qualität des Gerätes und die Community in den letzten Jahren überzeugte - in unserem Haushalt werkelt ja auch noch ein OnePlus 3T - war eigentlich klar, daß ich markentreu bleibe. Das vor 5 Monaten erschienene 6er Modell hätte mich eigentlich schon gereizt, aber ich dachte mir, bau nochmal einen Austauschakku ein, vielleicht hält das Teil ja nochmal 4 Jahre durch. Naja, der Akku war bzw. ist ok, auch der Austausch war in 20 Minuten erledigt. Dennoch: Die heutige Software zieht schon etwas mehr Strom und letztlich reichte das nicht einmal mehr über den Tag.

Tests zum 6T gibt es genügend, für mich gab es keinen Grund mehr, zu Googles "Pixel" zurückzukehren, nachdem die Preispolitik der vergangenen Jahre konsequent fortgesetzt und dafür an der 1000€ Marke gekratzt wird. Ein Thema, bei dem Durchgeknallte, die mit einem iPhone "X" herumposen - wohl nur zu einem müde Lächeln können. Aber irgendwie bekommt Apple das mit den Mondpreisen schon zu spüren.

Wie auch immer, nachdem OnePlus sein 6T vor 14 Tagen vorgestellt hatte kam es am Dienstag zur Auslieferung, meines bekam ich dann gestern geliefert. Während ich einem Familienmitglied beim Umstieg von einem ebenfalls 4 Jahre alten iPhone auf ein 6T unterstützte, fand ich noch die Zeit, nach einer Lösung zum Rooten für das 6T, denn ich hätte ja doch ganz gerne meine diversen Apps 1:1 wieder auf dem neuen Handy. Mittels Titanium BackUp kein Problem, allerdings setzt das Root voraus. Kein Problem1:

blu_spark TWRP für das OnePlus 6T
dann noch

Magisk herunterladen


Bei uns an den Linux Rechner gehängt, nachdem ich das 6T eingeschaltet und einen "alles überspringen" Setup Lauf durchgeführt hatte, bin ich in die Einstellungen / Über das Telefon / 7 * auf "Build Number" tippen, um den Entwicklermodus freizuschalten, dann wieder in "Einstellungen / System / Entwickleroptionen" und dort "OEM Entsperrung", "USB-Debugging" und "USB-Debugging Authorisierungen aufheben" aktivieren und dem angeschlossenen Rechner Zugriffsrechte erteilen. (Am besten auch noch "erweiterter Neustart" aktivieren, aber das ist Komfortzone.)

Sodann als root berechtigter User das folgende in die Linux Kommandozeile 2 reinhacken:

fastboot oem unlock

Schwupps - so schnell ist das Handy platt. Genau: beim Entsperren des Bootloaders werden alle Daten gelöscht. Das macht nichts, da ich noch keine Daten darauf habe und deswegen ja auch im "alles überspringen" Setup Lauf unterwegs war ;-)

Nach dem Aufheben der OEM Sperre und der Freischaltung können nun TWRP, der blu_spark Kernel und Magisk installiert werden. Mit

fastboot boot twrp-3.2.3-x_blu_spark_v9.86_op6.img

wird das neue Recovery gebootet, anschließend erlaubt man Änderungen durch Wischen auf dem im unteren Bildschirrm angebotenen Schieberegler. Dann wird in dem nächsten Bildschirm unter "Advanced" der Menüpunkt"ADB Sideload" gewählt, "Wipe Dalvik Cache" und "Wipe Cache" gewählt und dann der ADB Zugriff durch Wischen am Schieberegler im unteren Bildschirmrand ermöglicht, der dann auf dem Computer per sideload aufs 6T gebügelt wird:

adb sideload twrp-3.2.3-xblusparkv9.86op6.zip

Dann kann z.B. mit dem blu_spark Kernel eine Alternative zum regulären Systemkern installiert werden:

adb sideload blusparkr56-oos-pieop6-6t9e9a352.zip

Als Abschluß gibt es dann noch die Installation von Magisk per sideload:

adb sideload Magisk-v17.3.zip

Dann lösche ich eigentlich immer den Cache und starte das Handy neu. Magisk lässt sich zukünftig dann direkt aus der App updaten.

Diese im Gegensatz zu früheren root / Flash Aktionen scheinbar etwas umständlichere Methode der Recovery Installation hängt mit den A/B Partitionen zusammen, die ursprünglich mit Googles Pixel 1 eingeführt und für mehr Sicherheit sorgen sollen. So existiert im Gegensatz zu früheren Versionen keine eigene Recovery Partition mehr, sondern das Recovery ist Bestandteil des Boot Images. Grob gesagt muss deshalb TWRP temporär gebootet werden, um erst mit einem weiteren Installationslauf in einem der Slots eingerichtet zu werden. Die beiden Slots sind in TWRP selbst auch anwählbar, zum Beispiel beim Backup. Auch beim Neustart aus dem Recovery lässt sich der gewünschte Slot wählen.

Die verwendete (inoffizielle) blue_spark TWRP 3.2.3-x Recovery Version v9.86 ist noch in einem recht frühen Entwicklungsstadium, das sollte man bedenken, ebenso wie die angepasste Magisk Version. Zum Beipiel läuft hier das Xposed Modul leider noch nicht, auch gibt es in Sachen LineAgeOS bis jetzt auch nur inoffizielle Versionen. Hier habe ich mich auch noch nicht dazu durchgerungen, auf den Zug aufzuspringen. Aber was nicht ist, kann ja noch werden. Momentan schaue ich mir noch sehr wohlwollend das installierte OxygenOS 9.05 an, das unmittelbar nach dem TWRP Flash zum Download bereit stand.

Die A/B Partitionen können wie alles andere in dem kurzen Beitrag hier dargestellte zu Problemen führen, bis dahin, das OnePlus 6T in einen 629€ teuren Briefbeschwerer zu "bricken". Von daher: Alles, was bei mir geklappt hat, kann woanders ins Auge gehen, daher: Nachahmung auf eigene Gefahr, informiert Euch zuvor über die möglichen Folgen, zum Beispiel auch über eventuellen Garantieverlust!

In dem Sinne freue ich mich über Hinweise, Vorschläge, Alternativen und Kritiken, gerne über die Kommentarfunktion!

1: Wem das zu stressig / langweilig / riskant / whatever ist, der kann natürlich auch per OnePlusSwitch bequem von einem alten Android Handy - und auch von iPhones - auf das neue umsteigen. Die App, die in Googles Play Store für Android und hier - leider außerhalb von dem Apple Dingens erhältlich und daher nicht ganz ungefährlich - zu installieren ist, erleichtert einem den Umzug doch sehr, indem ein Barcode auf dem alten durch das neue Handy abzufotografieren ist. Binnen kurzer Zeit landen dann alle Fotos und sonstigen Daten auf dem neuen Gerät.

2: Windows kann das natürlich auch. Möglicherweise gibt es dabei einiges zu beachten, daher verweise ich auf die DroidWiki Anleitung hier.

In diesem Beitrag sind einige Links auf Amazon und eBay gesetzt. Wenn Ihr über diese Links dort etwas bestellt, bekomme ich eine kleine Provision. Irgendwie muss die Kohle für das 629€ teure Teil ja wieder reinkommen. ;-) Für Euch bleibt der Preis derselbe wie bei einem Direktkauf.
cronjob