Automatinis Z_OFFSET kalibratorius

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.

Bendras jutiklio vaizdas

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

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

This site uses Akismet to reduce spam. Learn how your comment data is processed.