UBL: G29 na steroidima

Nemojte propustiti

E Ink avanture s Inky pHAT-om

E Ink (AKA E Paper, electronic paper) već je neko vrijeme s nama, a mogli ste se sresti s tom tehnologijom ako (još...

Raspberry Pi Story

Raspberry Pi maleni je SBC (single board computer) razvijen od Raspberry Pi Foundation kako bi pomogao u edukaciji osnova računarstva. Međutim, vrlo brzo pokazalo...

Spajanje više tipkala na jedan pin

Mnogi su nas nakon članka o izborniku s LCD shieldom pitali kako spojiti tipkala da rade na takav način. Jedan od načina...

I2C LCD

Sada je vrijeme da se pozabavimo jednim od osnovnih koraka u našim projektima a to je prikazivanje poruka na LCD ekranu. Danas...

Izrada izbornika na LCD štitu

Nakon što smo se upoznali sa shield koji ima LCD ekran i tipkovnicu. Ako još niste možete to učiniti ovdje. Vrijeme je...

UBL (Unified Bed Leveling) jedna je od novijih mogućnosti Marlin firmwarea koji se u zadnje vrijeme razvija ubrzanim tempom (reklo bi se da je Josef Prusa opet malo pogurao napredak u uspavanom RepRap pokretu). U zadnjih par iteracija, UBL je dobio nove mogućnosti, kao i neke nove bugove, ali to ne znači da ga ne treba isprobati. Pa sam ga isprobao 🙂

Odmah u startu treba reći da je UBL definitivno budućnost, sve ostale verzije bed levelinga trebale bi postati suvišne iz jednostavnog razloga – UBL je tu da ih zamjeni. U (iscrpnom) komentaru na početku ubl_G29.cpp datoteke izvornog koda Marlina navodi se kako je cijeli UBL utemeljen na prethodnim verzijama bed levelinga, od 3-point, preko grid do mesh bed levelinga. Iako su sve ove verzije bed levelinga i dalje prisutne u Marlinu, uskoro bi trebale postati suvišne.

Kako početi?

- oglas-

Kao i obično, od početka. U Marlinu, to znači da treba nešto napraviti u čuvenoj Configuration.h datoteci. Pod broj jedan treba omogućiti korištenje odgovarajuće z-probe u sekciji Z Probe Options. Iako, za UBL čak niti z-proba nije nužna, postupak se može odraditi i s običnim komadićem papira! Pa u ovoj sekciji postoji čak i ta opcija, zove se #define PROBE_MANUALLY.

Korak drugi, u sekciji Bed Leveling treba omogućiti korištenje UBL-a tako da se odkomentira linija #define AUTO_BED_LEVELING_UBL. Također, da bi se kod s omogućenim UBL-om uopće kompajlirao potrebno je omogućiti korištenje EEPROM-a s#define EEPROM_SETTINGS. I za početak, to je to. Naravno, sve druge opcije moraju odgovarati korištenom 3D printeru, a kako se Marlin dosta brzo mijenja, prenošenje konfiguracije iz verzije u verziju zna biti poprilično naporno. Osim ako ne koristite neki super-ultra-cool alat koji će taj posao pretvoriti u jedno kratko, ali slatko iskustvo – moja topla preporuka je Meld, mali radi k’o urica 🙂

Na kraju, treba uploadati novi firmware u 3D printer i krenuti se igrati s UBL-om. Osim, što treba napraviti još nešto. Ako niste koristili novije verzije Marlina ili neke napredne opcije, velika je vjerojatnost da na vašem 3D printeru niste koristili EEPROM. E, pa to će se sad promjeniti, a kako bi omogućili korištenje EEPROM-a, nakon uploada firmwarea potrebno je printeru poslati dva g-codea:

M502
M500

Tek nakon ovoga EEPROM će biti inicijaliziran i spreman za korištenje.

Kako dalje?

Lako, ukucate `G28` (home) pa `G29` (bed leveling) i… ne dogodi se ništa? WTF? Bez brige, ovo nije bug, ovo je feature 🙂 Naime, G29 sada ima mali milijun parametara koje mu možete proslijediti, za kompletni popis skoknite na G29 dokumentaciju.

Bed leveling je po novome podjeljen u faze koje se pokreću uz pomoć parametra P (od engl. Phase) i odgovarajućeg broja, od 1 do 6 (ima i 0, ali zbog kompatibilnosti s prijašnjim verzijama). Ukratko, P1 će pokrenuti postupak bed levelinga, P2 omogućuje unošenje dodatnih točaka korištenjem LCD kontrolera (može se preskočiti), P3 popunjava prazne vrijednosti računskim (ili konstantom ako se proslijedi parametar C), P4 omogućuje fino podešavanje pomoću LCD kontrolera (opet, moguće je preskočiti), P5 računa srednju vrijednost i standardno odstupanje mreže, a P6 spušta ili diže cijelu mrežu za neku (istu) vrijednost. Jednostavno, jel’ da?

Šalu na stranu, općenito se postupak bed levelinga svodi na `G29 P1`, a sve ostale opcije dolaze u obzir samo ako se na ovaj način ne može dobiti potpuna ili dovoljno točna mreža. Mreža se sprema u prije spomenuti EEPROM naredbom `G29 S1` (broj iza S određuje slot u koji se spremaju rezultati, a kreće od 0). Pregled mreže dobiva se naredbom `G29 T` (topologija). Detaljniji opis korištenja s najčešćim scenarijima moguće je pronaći ovdje.

Korištenje

Jednom kada je mreža spremljena, potrebno ju je samo pozvati i aktivirati prije samog printa. Poželjno je napraviti i jednostavni bed leveling u tri točke, koji zapravo samo prilagodi spremljenu mrežu trenutnom položaju (nagibu i visini) beda. U start g-code dovoljno je dodati slijedeće:

G29 L1 ; load bed autoleveling mesh from slot 1
G29 A ; make it active
G29 J ; do the three point probing to tilt the loaded mesh

I to bi trebalo biti to. Kad ne bi bilo problema i bugova 🙂 Jer, da bi izazov bio čim teži, UBL sam krenuo isprobavati na delta 3D printeru – Deltatronu. A podrška za delta 3D printere u Marlinu je već i prije bila na lošem glasu.

Problemi s Deltom

Osnovni problem kod korištenja UBL-a na delta printeru je u tome što developeri u kodu samog firmwarea miješaju X_MIN_POS s X_HOME, a specifično za deltu, još i DELTA_PRINTABLE_RADIUS sa DELTA_PROBEABLE_RADIUS. Kad se još k tome doda i offset z-probe u odnosu na hotend, nastane totalni cirkus.

Prva stvar koja nije funkcionirala je ta da je s jedne strane bio zanemarivan DELTA_PROBEABLE_RADIUS pa bi z-proba izletila izvan beda, a s druge strane se područje ograničavalo DELTA_PRINTABLE_RADIUS pa je dio točaka do kojih je z-proba mogla doći ostao bez podataka. Nakon (podužeg) čitanja koda i pretraživanja po datotekama, ispalo je da se sve ovo da spriječiti intervencijom u jednoj funkciji koja se nalazi u Marlin.h

inline bool position_is_reachable_by_probe(const float &rx, const float &ry) {

    // Both the nozzle and the probe must be able to reach the point.
    // This won't work on SCARA since the probe offset rotates with the arm.

    // This is a better solution, we should use DELTA_PROBEABLE_RADIUS for 'reachable by probe' function!!!
    // by prexy
    #if ENABLED(DELTA)
      return HYPOT2(rx, ry) <= sq(DELTA_PROBEABLE_RADIUS);
    #else
      return position_is_reachable(rx, ry)
        && position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER));
    #endif
  }

Kao što napomena kaže, ovaj kod i dalje neće funkcionirati na SCARA printerima, ali sada radi na delti. Originalno, ova funkcija je sadržavala samo dio koji se sada nalazi pod #else.

Idući problem nastaje zbog toga što je mreža za bed leveling pravokutna i izlazi daleko izvan područja koje delta printeri mogu obuhvatiti, pa dobar dio točaka mreže ostaje bez podatka. Kako bi se tim točkama dodijelile vrijednosti potrebno je pokrenuti `G29 P3` onoliko puta koliko treba da se sve prazne vrijednosti popune računskim (`G29 P3 T` će prikazati mrežu nakon P3, ako u mreži umjesto brojeva ima ‘.’ postupak treba ponoviti). Tek sada je moguće spremiti mrežu u EEPROM.

Marlin omogućuje da se slanjem koda `G26` isprinta uzorak kojim bi trebalo potvrditi koliko je bed leveling uspješan, ali poučen lošim iskustvom, odlučio sam se radije na izradu jednog jednostavnog modela u OpenSCAD-u:

// UBL (Unified Bed Leveling) test pattern

// This model should be used to verify Deltatron UBL settings

// Some parameters
ex = 0.001;
height = 0.3; // should be the same as the first layer height
width = 4; // pattern width
print_radius = 90; // same as Marlin setting
probable_radius = print_radius - 20; // same as Marlin setting
grid_max_points = 8; // same as Marlin setting
step = 2*print_radius/(grid_max_points - 1);

// Entry point
UBL_test();

module UBL_test(){
    difference(){
        grid();
        translate([0, 0, -ex]) cutoff();
    }
}

module grid(){
    for (i = [-print_radius : step : print_radius]){
        translate([i - width/2, -print_radius - width/2, 0])
            cube([width, 2*print_radius, height]);
    }
    for (i = [-print_radius : step : print_radius]){
        translate([-print_radius - width/2, i + width/2, 0])
            rotate(-90) cube([width, 2*print_radius, height]);
    }
}

module cutoff(){
    difference(){
        cylinder(r = 2*print_radius, h = height + 2*ex);
        translate([0, 0, -ex])
            cylinder(r = probable_radius, h = height + 4*ex);
    }
}

Pošto ovaj test nije dao baš savršeni rezultat, odlučio sam malo ‘popraviti’ mrežu i tu sam naišao na još jedan bug – iako je teoretski tako nešto trebalo biti moguće korištenjem `G29 P3 Cx.xx` (zadavanjem nove vrijednosti nakon C, u formatu x.xx), ovo jednostavno nije funkcioniralo. Pa sam pribjegao alternativnoj metodi:

`M421 Ix Jy Qx.xx`

gdje su I i J indeksi (kreću od nule iz donjeg lijevog kuta), a Q je korekcija vrijednosti (tj. ako je vrijednost 0.10, `Q0.25` će ga pretvoriti u 0.35!). Nakon ovih korekcija mrežu ponovno treba spremiti s `G29 S1`. Pokazalo se dobrim što ima više slotova za spremanje, jer korekcije nisu uvijek dale željene rezultate, pa se spremanje prethodnog uspješnog pokušaja u slot 0 pokazalo kao dobro backup rješenje.

Zaključak

Na kraju priče, UBL se pokazao kao jako dobro i prilagodljivo rješenje za bed leveling, iako je još uvijek u razvoju. Pretpostavljam da je količina problema daleko manja na kartezijanskim 3D printerima, a svakako bi bilo zanimljivo isprobati UBL bez z-probe na jednom takvom printeru opremljenom LCD kontrolerom.

Trenutno je najveći minus to što je cijela ta funkcionalnost i dalje nedovoljno istestirana, ali s obzirom na tempo kojim izlaze nove verzije Marlina uskoro bi velika većina problema trebala biti riješena. Samo za ilustraciju, ovo testiranje započelo je na verziji 1.1.6 i bilo je sasvim neuspješno, da bi dva mjeseca kasnije na verziji 1.1.8 bilo izvedivo, uz navedene (ali riješive) probleme.

Konačni je zaključak da je ova opcija dovoljno dobra u sadašnjem obliku za iskusne korisnike 3D printera, ostali bi svakako trebali pričekati s upgradeom, barem dok se ne riješe trenutni problemi kojih UBL još uvijek ima. Za one koji se žele upustiti u avanturu, ovdje je moguće preuzeti zadnju verziju Marlina (kao i prethodne, naravno).

Možda vas zanima i ovo:

Komentiraj

Unesite svoj komentar!
Ovdje unesite svoje ime

Popularno

Uvjeti korištenja

Uvjeti korištenja seekretors.org stranice (u daljnjem tekstu: ove stranice) u vlasništvu su njenih osnivača Marka Miroslava Bače i Tomislava Preksavca (u daljnjem...

Enderova nova pamet

Enderu 3 teško je naći manu (naročito za cijenu po kojoj se prodaje), i ako bi nešto trebalo izdvojiti, to je sigurno njegov...

PYW – Vijak

Evo nas na prvoj stranici našeg putovanja, a s čime je bolje početi nego s dobrom vezom. Zato krenimo od vijčanog spoja.

Print Your world- uvod

Dobrodošli u novi serijal Print Your world ili kako bi mi rekli ekstrudiraj, ekstrudiraj. U ovom serijalu bavit ćemo...

Korekcija putanje glave 3D printera

Konkretno, u mom slučaju radi se o 3D printeru tipa delta, premda vjerujem da sličnih problema ima i kod modela s klasičnim...