Sukonstravau spausdintuvui priedą automatiniam z_offset kalibravimui. Kaip jutiklis naudojamas 27mm skersmens piezo diskas. Impulsus registruoja, su šiluminiu dreifu ir triukšmu tvarkosi attiny13a mikrovaldiklis. Schema beveik identiška naudotam z-probe jutikliui. Skirtumas tik toks, kad prie PB3 porto prijungtas 10k potenciometras jautrumo reguliavimui, ir naudojamas kitas mikrovaldiklis.
Z_OFFSET kalibravimo principas yra toks: spausdintuvas susiranda pradinius koordinačių taškus, tada pabaksnoja spausdintuvo purkštuku į jutiklį ir pasimatuoja aukštį, po to microprobe ant to paties jutiklio pasimatuoja aukštį, ir tų dviejų aukščių skirtumas yra mūsų pageidaujamas Z_OFFSET dydis.
Jutiklio korpusas sudarytas iš trijų spausdintų detalių ir M10 varžto. Viršutinė dalis atspausdinta iš ABS plastiko su įsuktu maržtu, kurio kalvutė nulyginta, kad gautūsi plokščia aikštelė kalibracijai atlikti. Apatinė dalis, kuri tvirtinasi prie aliuminio platformos profilio taip pat atspausdinta iš ABS plastiko, tarp jų įsprausta tarpinė iš TPU A85 plastiko.

Jutiklio korpuso 3D modelis
Toliau pateikiamas programos kodas attiny13a mikrovaldikliui.
const int isejimas = 0; //išėjimo pinas
const int jutiklis = A2; //ADC keitiklio pinas prijungtas prie piezo disko
const int pot = A3; //ADC keitiklio pinas prijungtas prie potenciometro
uint16_t signalas = 0; //kintamasis nuskaityto signalo lygio saugojimui
uint16_t lygis = 0; // suvidurkintas signalo lygis
int diodas = 0; //diodo būsena
uint16_t jautrumas = 0; //mažinant didinam jautrumą prisilietimui
void setup() {
pinMode(isejimas, OUTPUT);
for ( int i = 0; i <= 500; i++) { //ciklas jautrumo lygiui nustatyti
jautrumas = (jautrumas * 10 + analogRead(pot)) / 11;
}
jautrumas = (jautrumas / 100 ) + 0;
for ( int i = 0; i <= 10000; i++) { //ciklas pradiniam signalo lygiui kalibruoti
lygis = (lygis * 10 + analogRead(jutiklis)) / 11;
if ( (i % 500) == 0) { //mirksinam diodą po maitinimo įjungimo
digitalWrite(isejimas, diodas);
diodas = !diodas;
}
}
digitalWrite(isejimas, LOW);
}
void loop() {
signalas = analogRead(jutiklis);
if (signalas > (lygis + jautrumas)) { // jeigu signalas didesnis už (vidutinis lygis + jautrumas) siunčiam signalą
digitalWrite(isejimas, HIGH);
delay(150);
digitalWrite(isejimas, LOW);
signalas = analogRead(jutiklis);
signalas = analogRead(jutiklis);
}
lygis = (lygis * 10 + signalas) / 11; //koreguojame vidutinį signalo lygį
}
Klipper nustatymai kalibravimui, alibravimo paleidžiamas komanda CALIBRATE_Z_OFFSET. Prieš tai reikia įkaitinti ekstruderį, kad neliktų kabančių plastiko likučių skriptas bandys nuvalyti juos NOZZLE_CLEAN kamanda, ekstruderio temperatūrą reikia parinkti tokią, kad plastikas jau būtų minkštas, bet dar netekėtų iš purkštuko. Bet kokie plastiko likučiai iškraipys matavimo rezultatus.
[endstop_phase] # Aktyvuoja papildomas Z funkcijas
[gcode_button piezo_sensor]
pin: PC0
press_gcode:
# { action_respond_info("Piezo suveikė!") }
release_gcode:
# M117 Piezo atleistas
[gcode_macro CALIBRATE_Z_OFFSET]
variable_nozzle_z: 0
gcode:
{% set piezo_x = 230 %}
{% set piezo_y = -21 %}
SET_GCODE_OFFSET Z=0
SET_GCODE_VARIABLE MACRO=CALIBRATE_Z_OFFSET VARIABLE=nozzle_z VALUE=0
G28
NOZZLE_CLEAN
G90
G1 X{piezo_x} Y{piezo_y} Z10 F6000
M117 Matuojame purkštuką...
UPDATE_DELAYED_GCODE ID=_PIEZO_WAIT_LOOP DURATION=0.1
[delayed_gcode _PIEZO_WAIT_LOOP]
gcode:
M400
{% if printer["gcode_button piezo_sensor"].state == "RELEASED" %}
{% if printer.toolhead.position.z > -2 %}
G91
G1 Z-0.05 F300
G90
UPDATE_DELAYED_GCODE ID=_PIEZO_WAIT_LOOP DURATION=0.05
{% else %}
{ action_raise_error("Kontaktas nerastas!") }
{% endif %}
{% else %}
{% set current_z = printer.toolhead.position.z %}
SET_GCODE_VARIABLE MACRO=CALIBRATE_Z_OFFSET VARIABLE=nozzle_z VALUE={current_z}
G90
G1 Z5 F600
M400
G1 X276 Y-21 F6000
M117 Matuojame MicroProbe...
PROBE
_CALCULATE_AND_SAVE_Z_OFFSET
{% endif %}
[gcode_macro _CALCULATE_AND_SAVE_Z_OFFSET]
gcode:
{% set nozzle_z = printer["gcode_macro CALIBRATE_Z_OFFSET"].nozzle_z %}
{% set probe_z = printer.probe.last_z_result %}
{% set measured_diff = probe_z - nozzle_z %}
{% set current_probe_offset = printer.configfile.config["probe"]["z_offset"] | float %}
{% set final_gcode_adjustment = current_probe_offset - measured_diff %}
{ action_respond_info("Išmatuotas skirtumas: %.3f" % measured_diff) }
{ action_respond_info("Esamas cfg offset: %.3f" % current_probe_offset) }
{ action_respond_info("Koreguojantis poslinkis: %.3f" % final_gcode_adjustment) }
SET_GCODE_OFFSET Z={final_gcode_adjustment}
Z_OFFSET_APPLY_PROBE
G0 X100 Y100
SAVE_CONFIG