Heat frame expansion: Z compensation possible with RRF?
-
Hello forum,
on larger CoreXY printers (e.g. Voron 2.4) you usually start your print when the bed is heated up at the corner.
But for the frame it can take up to 1-2 hours before the expansion settles down. Which means atm: manually babystep Z down by 20-30 microns during the first 1-2 hours printing.
The script (link below) compensates for that by measuring the frame temperature (separate thermistor needed).It basically works as follows:
- Save measured temperature when homing Z
- Check frame temperature every x seconds and compensate Z whilst printing
Following this: https://github.com/Klipper3d/klipper/pull/4157
I'm asking myself whether it's possible to build this logic with the available conditional code we have with RRF? -
@argo yes you could use conditional GCode, either in daemon.g or in a macro called from the layer change script in your slicer.
-
@argo How long is your Z axis and how hot do you run the machine?
-
It's a Voron 2.4 300mm version.
I would like to start the print right after the bed (corners) reaches their target temperature.
The frame / rest of the printer would normally need an hour but with the Script linked above you can print right away and don't need to worry about heat expansion of the frame.
Now I need to try writing a script that does exactly that. -
@argo How much expansion are you expecting? Is the machine enclosed and heated?
It looks like that printer moves the XY stage up and down with belts, and the Z axis motors are at the bottom of the machine, close to the bed. So the XY stage "hangs" from the belts that loop over the pulleys at the top of the frame. As the frame lengthens with temperature, the top pulleys move up, which would raise the XY stage a bit.
But, the belts are going to stretch a little from the weight of the XY stage, and they will stretch less when the XY stage is near the top of the machine and more when it is near the bottom. They will also lengthen if they are warmed up. As the belts lengthen from stretch or thermal effects, the XY stage will move lower a little.
The thermal lengthening of the belts and the stretch both work to reduce the effect of the lengthening of the frame, so one compensates a bit for the other. It would be interesting to mount a gauge on the printer, zero it while it's cold, and measure the displacement of the bed after the machine has warmed up. You'd have to be sure the gauge can read accurately at both the low and high temperatures.
The print itself is going to experience thermal effects, too. I would expect it to shrink a bit as it gets taller and the plastic cools.
I think it's going to be really hard to take all these effects into account to try to compensate for them, and I would not attempt to do so without actually measuring the error.
-
That isn’t really a new topic and many tests have already been done.
You can find measurements and results here:
https://github.com/Klipper3d/klipper/pull/4157#issuecomment-857050485And here what this actually means for a real print: https://github.com/tanaes/whopping_Voron_mods/blob/main/docs/frame_expansion/frame_thermal_compensation_howto.md
-
@argo Interesting...
-
If anyone is interested.
The Z hop is caused by the aluminium extrusion on Y.
More details:
https://github.com/VoronDesign/VoronUsers/tree/master/printer_mods/whoppingpochard/extrusion_backersThe best solution would be to eliminate the issue mechanically but I created a macro anyways:
daemon.g
if state.status == "processing" M98 P"/macros/RailTempCompensation/railCompensation.g" ; Script to compensation for heat expanson of the aluminium frame
Create in the macro folder a folder called "RailTempCompensation". Inside there two files.
railCompensation.g
if !exists(global.railtempDifference) global railtempDifference = abs(global.railtemp - sensors.analog[3].lastReading) ; Difference should be negative values else set global.railtempDifference = abs(global.railtemp - sensors.analog[3].lastReading) if !exists(global.railtempExpansionFactor) global railtempExpansionFactor = 0.025 ; Microns per rising °C temp else set global.railtempExpansionFactor = 0.025 ; Microns per rising °C temp if global.railtempDifference >= 1 if !exists(global.zCompensation) global zCompensation = -(global.railtempDifference * global.railtempExpansionFactor) else set global.zCompensation = -(global.railtempDifference * global.railtempExpansionFactor) M290 R0 S{global.zCompensation} ; babystepping
and
setRailTemp.g
if !exists(global.railtemp) global railtemp = sensors.analog[3].lastReading else set global.railtemp = sensors.analog[3].lastReading
-
@argo also interesting.
I prevented the problem you describe in my corexy printer by using a larger X axis linear guide (8 x 24 mm) without any aluminum backing. The frame of the machine expands a bit when heated, moving the Y axis linear guides apart. I dealt with that by using two bearing blocks on the X axis linear guide- one for the extruder carriage and one for one end of the X axis.
As the frame expands, the X axis guide rail is fixed to one of the Y axis bearing blocks and moves with it. The other end connects to the y axis bearing block through the second X axis bearing block which allows the X rail to slide but prevents any other motion.
Here's an old photo that shows both ends of the X axis. At P1, the X axis linear guide bolts to the Y axis bearing block via a yellow spacer (replaced with aluminum some time ago) and the aluminum tube that holds the pulleys . The spacer matches the thickness of the second X axis bearing block at P2.
The Y axis linear guides are bolted to aluminum plates, so there's probably something bimetallic going on there, but it doesn't seem to affect prints.
-
@mrehorstdmd
Lol... I told him the same.... the rails are typically made of 440c and the extrusions are alu. So we have the very best bimetal here. The klipper guys try to solve a problem in firmware which is a physical problem at the ned.I fixed the problem my mounting a 2nd rail on the other site of the y extrusion.
Cheers, Chriss
-
@chriss I started working on my corexy printer before they became popular. At the time I saw some forum posts from people who had built them using linear guides complaining that when the temperature in their shop changed 10 or 20 degrees, the XY mechanism would bind. The loose coupling for the X axis (and no additional support) was my response to that problem. I heat that printer to 50C when printing ABS and it never binds.
I haven't had any problems with first layer adhesion, either, even though the printer has no auto tramming or bed unflatness compensation.