@T3P3Tony
I was even able to push it a little further. The most pain four our customers is the non-linear-extrusion calibration.
And what should I say, it is even possible to do that with the MFM 🙂
non_linear_extrusion_calibration.gcode
if exists(global.nlecalibration)
set global.nlecalibration = true
else
global nlecalibration = true
G10 P0 S235 ; sets the temperature
M140 P0 S90 ; set bed temp
M107 ; fan off
M144 P0 S1 ; activate bed 1 heater
T0 ; select tool 0
M98 P"0:/sys/meltingplot/home_if_necessary" ; check homing
G29 S1 ; load stored hight map
M83 ; use relative distances for extrusion
G90 ; use absolute coordinates
G21 ; set units to millimeters
M116 ; wait for all heaters
G11 ; unretract
G1 Z300 ; raise z=20mm
G53 G1 X50 Y50 F14400 ; move printhead to center
G92 E0 ; reset e-steps
M572 D0 S0.0 ; disable pressure advance
M592 D0 A0.0 B0.0 ; disable non-linear-extrusion
M591 D0 P3 C"e1stop" S0 R98:102 E0.2 L25.3 ; enable MFM, but do not trigger event
G4 S5 ; wait for restart of MFM
G91 ; relative moves
; 15mm
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
; the mfm should be calibrated now
if sensors.filamentMonitors[0].calibrated == null
echo "Cannot calibrate filament monitor within 15mm - error!"
M99
G4 S1 ; wait for filament monitor send timeout
var totalCommandedBase = move.extruders[0].rawPosition
var totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F60
G1 X50 E50 F60
G4 S1 ; wait for filament monitor send timeout
echo "F60 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F90
G1 X50 E50 F90
G4 S1 ; wait for filament monitor send timeout
echo "F90 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F120
G1 X50 E50 F120
G4 S1 ; wait for filament monitor send timeout
echo "F120 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F150
G1 X50 E50 F150
G4 S1 ; wait for filament monitor send timeout
echo "F150 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F180
G1 X-50 E50 F180
G4 S1 ; wait for filament monitor send timeout
echo "F180 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F210
G1 X-50 E50 F210
G4 S1 ; wait for filament monitor send timeout
echo "F210 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F240
G1 X-50 E50 F240
G4 S1 ; wait for filament monitor send timeout
echo "F240 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F270
G1 X-50 E50 F270
G4 S1 ; wait for filament monitor send timeout
echo "F270 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F300
G1 X50 E50 F300
G4 S1 ; wait for filament monitor send timeout
echo "F300 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F330
G1 X50 E50 F330
G4 S1 ; wait for filament monitor send timeout
echo "F330 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F360
G1 X50 E50 F360
G4 S1 ; wait for filament monitor send timeout
echo "F360 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G10 ; retract
G10 P0 R0 S0 ; disable hotend
M140 S0 R0 ; set bed heater to 0°
M140 P0 S-273.1 ; disable bed heater
T-1 ; unselect tool
set global.nlecalibration = false
The variable nlecalibration is for further use.
non_linear_extrusion_check.gcode
if exists(global.nlecheck)
set global.nlecheck= true
else
global nlecheck= true
G10 P0 S235 ; sets the temperature
M140 P0 S90 ; set bed temp
M107 ; fan off
M144 P0 S1 ; activate bed 1 heater
T0 ; select tool 0
M98 P"0:/sys/meltingplot/home_if_necessary" ; check homing
G29 S1 ; load stored hight map
M83 ; use relative distances for extrusion
G90 ; use absolute coordinates
G21 ; set units to millimeters
M116 ; wait for all heaters
G11 ; unretract
G1 Z300 ; raise z=20mm
G53 G1 X50 Y50 F14400 ; move printhead to center
G92 E0 ; reset e-steps
M572 D0 S0.0 ; disable pressure advance
M592 D0 A0.003 B0.011 L0.2 ; enable non-linear-extrusion
M591 D0 P3 C"e1stop" S0 R98:102 E0.2 L25.3 ; enable MFM, but do not trigger event
G4 S5 ; wait for restart of MFM
G91 ; relative moves
; 15mm
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
G1 X1 E1 F30
; the mfm should be calibrated now
if sensors.filamentMonitors[0].calibrated == null
echo "Cannot calibrate filament monitor within 15mm - error!"
M99
G4 S1 ; wait for filament monitor send timeout
var totalCommandedBase = move.extruders[0].rawPosition
var totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F60
G1 X50 E50 F60
G4 S1 ; wait for filament monitor send timeout
echo "F60 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F90
G1 X50 E50 F90
G4 S1 ; wait for filament monitor send timeout
echo "F90 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F120
G1 X50 E50 F120
G4 S1 ; wait for filament monitor send timeout
echo "F120 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F150
G1 X50 E50 F150
G4 S1 ; wait for filament monitor send timeout
echo "F150 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F180
G1 X-50 E50 F180
G4 S1 ; wait for filament monitor send timeout
echo "F180 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F210
G1 X-50 E50 F210
G4 S1 ; wait for filament monitor send timeout
echo "F210 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F240
G1 X-50 E50 F240
G4 S1 ; wait for filament monitor send timeout
echo "F240 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X-50 E50 F270
G1 X-50 E50 F270
G4 S1 ; wait for filament monitor send timeout
echo "F270 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F300
G1 X50 E50 F300
G4 S1 ; wait for filament monitor send timeout
echo "F300 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F330
G1 X50 E50 F330
G4 S1 ; wait for filament monitor send timeout
echo "F330 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G1 X50 E50 F360
G1 X50 E50 F360
G4 S1 ; wait for filament monitor send timeout
echo "F360 " ^ {(1.0-((sensors.filamentMonitors[0].calibrated.totalDistance-var.totalDistanceBase)/(move.extruders[0].rawPosition-var.totalCommandedBase)))*100.0} ^ "% error."
set var.totalCommandedBase = move.extruders[0].rawPosition
set var.totalDistanceBase = sensors.filamentMonitors[0].calibrated.totalDistance
G10 ; retract
G10 P0 R0 S0 ; disable hotend
M140 S0 R0 ; set bed heater to 0°
M140 P0 S-273.1 ; disable bed heater
T-1 ; unselect tool
set global.nlecheck = false
We have a tool which takes the values from that script and will aproximate the A and B factors of the non-linear-extrusion - but it can be done with excel as well. It will safe you alot of measurements 🙂