Is there a way to enter distortion values manually in unrechable Z-Probing areas

Hi, at my self made cartesian printer with double extruder the BLTouch sensor has an offset of Y +28mm.
So matrix distortion measurement is limited to Y > 28. Ymin for the matrix is therefore 28.
In the area of Y=0 there are little bumps I like to be corrected also.

Do you see a chance of a workaround (including software mods) to manually define distortion correction values for the line Y=0?



  • I forgot to mention: V1.0.4
  • That is a problem. Firmware will assume last value for the remaining bed. You can also change values afterwards with G33 X Y Z, but only where grid points are and for cartesian they need to be inside reachable area. So either you can measure automatically with smaller grid or you need to enter all values manually but can select any grid size you like.

    The measurement is done in distorion.cpp in this function:

    bool Distortion::measure(void) {
    fast8_t ix, iy;

    float z = RMath::max(
    EEPROM::zProbeBedDistance() + (EEPROM::zProbeHeight() > 0 ? EEPROM::zProbeHeight() : 0),
    static_cast<float>(ZHOME_HEAT_HEIGHT)); // EEPROM::zProbeBedDistance() +
    // (EEPROM::zProbeHeight() > 0 ?
    // EEPROM::zProbeHeight() : 0);
    Com::printFLN(PSTR("Reference Z for measurement:"), z, 3);
    // It is not possible to go to the edges at the top, also users try
    // it often and wonder why the coordinate system is then wrong.
    // For that reason we ensure a correct behavior by code.
    Printer::homeAxis(true, true, true);
    EEPROM::zProbeBedDistance() + (EEPROM::zProbeHeight() > 0 ?
    EEPROM::zProbeHeight() : 0), IGNORE_COORDINATE,
    Printer::homingFeedrate[Z_AXIS]); #else if(!Printer::isXHomed() ||
    !Printer::isYHomed()) Printer::homeAxis(true, true, false);
    Printer::moveTo(Printer::invAxisStepsPerMM[X_AXIS] * ((isCorner(0, 0) ? 1
    : 0) * xCorrectionSteps + xOffsetSteps), Printer::invAxisStepsPerMM[Y_AXIS] *
    ((DISTORTION_CORRECTION_POINTS - 1) * yCorrectionSteps + yOffsetSteps),
    // Com::printFLN(PSTR("radiusCorr:"), radiusCorrectionSteps);
    // Com::printFLN(PSTR("steps:"), step);
    int32_t zCorrection = 0;
    #if Z_PROBE_Z_OFFSET_MODE == 1
    zCorrection -= Printer::zBedOffset * Printer::axisStepsPerMM[Z_AXIS]; // runZProbe adds this!

    if (!Printer::startProbing(true)) {
    return false;
    IGNORE_COORDINATE, Printer::homingFeedrate[Z_AXIS]);
    for (iy = 0; iy < DISTORTION_CORRECTION_POINTS; iy++)
    for (fast8_t iix = 0; iix < DISTORTION_CORRECTION_POINTS; iix++) {
    ix = iy & 1 ? DISTORTION_CORRECTION_POINTS - 1 - iix : iix;

    When you make for (iy = 0; iy < DISTORTION_CORRECTION_POINTS; iy++) start with iy = 1 it would maybe work, but complete y=0 row has then no set values. That is the best I can offer.
  • Thank you very much for the quick reply and your hint, that really helps.

    I plan to mod it in like this:
    start the loop with iy=0
    inside the loop:
        if iy !=0
             probe and safe value in matrix
        if iy =1 copy the result also to the matrix row of ix=0

    Then i have the same distortion correction behaviour like now after G33
    plus it is possible to enter manual correction values for the ix=0 row.
  • You can still start iy=1 and copy to iy=0 makes no difference. Idea is good to gen sensible values automatically with option to modify them later. Also remember
    G33 L0
    lists all commands to restore. So take them for y min and modify Z for replay.
Sign In or Register to comment.