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.

As you can see, you can always only get one of the offsets right. Of course I could manually set the values I measured but this bed leveling routine needs to be fool proof since stupid people have to be able to level the printer with very few simple steps. It must be something very obvious I'm missing here. Just subtracting the offset of the left nozzle from that found for the right nozzle seems to fix the problem but it's an awkward solution which is probably going to produce weird results in the future.

You can post your paypal account if you like so I can buy you a beer.

Comments

i do not understand why you are constantly changing z offsets for autoleveling. Sounds more like you calibrate extruder offsets.

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 do not understand why you are constantly changing z offsets for autoleveling. Sounds more like you calibrate extruder offsets.

I am indeed calibrating them. I cannot set extruder0 offsetZ to zero because then it will want to go "through" the plate. In other words, after homing the Z axis the distance between extruder0 and the build plate is -0.25 mm.

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.

Because all extruders have the same class and data. And I do not say it is not possible to set it, but then you have no reference any more resp. have to add values to all others to get right reference.

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.

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 have an endstop in the Z-direction. I guess my real question is: how would I go about calibrating homing when offsetZ e0 = 0? The first thing that pops into my mind is to use G92 but you already told me not to mess with that.

Well, I searched my ass off but nowhere can I find something like this: Extruder::current->zOffset = extruder[0]->zOffset + extruder[Extruder::current->id]->zOffset like I expected. Where is the extruder offset for tool 1 defined relative to tool 0?

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.