Extruder offsets
Hi everybody,
I think I need some help again. For reference, my forked and edited repetier repository is in here:
https://github.com/Anteino/Repetier-Firmware/tree/500XL-Minimal/src/ArduinoDUE/Repetier
In ui.cpp you will find my custom bed leveling routine, starting on line 2453. I think the workflow is pretty straightforward. You turn the knob until the nozzle is exactly 5 mm removed from the bed (we have a special 5 mm tool to measure this.. a drill bit). On clicking, the current offset is saved to Extruder::current->offsetZ and Printer::offsetZ and is then saved to the eeprom. This works fine for the first nozzle. However, after that, the printer switches to the right nozzle.
For some reason, I don't know how, the offset of the left nozzle is always added to the offset found for the right nozzle. Let me demonstrate two possible cases with their outcome.
You can post your paypal account if you like so I can buy you a beer.
I think I need some help again. For reference, my forked and edited repetier repository is in here:
https://github.com/Anteino/Repetier-Firmware/tree/500XL-Minimal/src/ArduinoDUE/Repetier
In ui.cpp you will find my custom bed leveling routine, starting on line 2453. I think the workflow is pretty straightforward. You turn the knob until the nozzle is exactly 5 mm removed from the bed (we have a special 5 mm tool to measure this.. a drill bit). On clicking, the current offset is saved to Extruder::current->offsetZ and Printer::offsetZ and is then saved to the eeprom. This works fine for the first nozzle. However, after that, the printer switches to the right nozzle.
For some reason, I don't know how, the offset of the left nozzle is always added to the offset found for the right nozzle. Let me demonstrate two possible cases with their outcome.
- When starting the bed leveling routine, the left extruder is selected firstly. You rotate the button until the display says 5.00 mm. Therefore the offset of the left nozzle becomes 0.00. This isn't correct but bear with me. After this, the right nozzle gets selected, you rotate the button until the nozzle touches the 5.00 mm tool. The display now says 4.75. The offset of the right nozzle is thus -0.25 mm. This is saved to the eeprom. The bed leveling routine is finished.
- This time we are going to accurately level the left extruder. You rotate until the nozzle touches the tool. The display says 4.00 mm, the offset of the left nozzle becomes -1.00 mm (this is actually correct, I checked). Now you do the same thing for the right nozzle. Again, you turn until the nozzle touches the tool and the display says 4.75 once again. However, the offset now gets saved as -1.25 mm instead of the (correct) value of -0.25 mm. It looks like the offset of the left nozzle is added to that of the right.
You can post your paypal account if you like so I can buy you a beer.
Comments
Extruder 0 zOffset should always be 0 as this is the reference. All other extruders z offset is relative to this extruder height. So to calibrate extruder offsets just set e0 to 0 and calibrate on your 5mm. Switch extruder (which changes z already to compensate to current z offset without changing coordinates), measure correction to your 5mm and add correction to z offset. That is how you should calibrate extruder offsets. Do not start with also adding G92 offsets. That might confuse easily.
I mean you can change it at Z=10 and it will work there not going through plate. Then of course you need to calibrate z min endstop (i think you have that) or z probe height so that z homing is at the right height for extruder 0 and then start calibrating the reminding extruders.
Having to many offsets correcting errors they were not designed for just makes everything very complicated.
Solution is what I already said. Make e0 offset 0 and calibrate homing for that offset and then continue. How depends on homing direction and if you use z probe of endstop.
I would like to NOT define extruder1->zOffset relative to extruder0->zOffset but rather define both of them to absolute zero since I have no way of physically calibrating my endstop position.
if(Printer::isHomedAll() && next->zOffset < current->zOffset) { // prevent extruder from hitting bed - move bed down a bit
Printer::offsetZ = -next->zOffset * Printer::invAxisStepsPerMM[Z_AXIS];
is one case. There is another one if new offset is higher then current. So it is relative to current selected. And I guess on homing it uses the offset of current to add to z as well.