Korekcija putanje glave 3D printera

Kada za dobivanje ispravnog prvog layera ne pomaže niti bed leveling, možda je spas u g-code post processingu...

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...

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 XYZ mostom, tj. kretnjom ispisne glave. Naime, kod delta printera ako dođe do nepravilnosti u geometriji, ona se manifestira kao oscilacija ispisne glave po Z osi. Geometrijska nepravilnost najčešće nije posljedica konstrukcije printera, već njegove montaže. Za razliku od XYZ mostova, gdje se nepravilnost uglavnom svodi na paralelnost između glave i podloge, kod delte ima više toga. Npr. međusobna udaljenost između tornjeva, paralelnost tornjeva, duljina poluga koje povezuju vertikalna kolica i ispisnu glavu itd. Kako se algoritam pretvorbe XYZ koordinate uglavnom svodi na trigonometriju, onda te nepravilnosti utječu na Z os. Točnije, za horizontalni pomak ispisne glave gdje bi Z os trebala biti konstantna, u naravi glava putuje gore/dolje, kao da je podloga valovita. Ako su ti pomaci mali, onda problem rješava bed autoleveling procedura. Međutim, ako su ti pomaci veliki, (u mom slučaju i do 0,8 mm između min i max vrijednosti, što je 4x više od debljine layera), onda bi trebalo ili korigirati geometriju printera (što je obično nemoguće) ili napisati program koji će proći kroz G-kod i izvršiti matematičku korekciju Z osi. Naravno, ja sam se odlučio za matematičku korekciju. Ako vam se događa da bed autoleveling daje različite visine na različitim XY koordinatama i to tako da ne ispada da je podloga nagnuta, odnosno vrijednosti ne rastu ili padaju u određenom smjeru, nego da je valovita jer su vrijednosti čas gore, čas dolje, vrlo vjerojatno ste kandidat da ovaj članak pročitate do kraja. Konačni rezultat takve nepravilnosti se svodi na to da se ne može cijela podloga koristiti za printanje jer postoje koordinate gdje je glava u zraku, a isto tako gdje grebe po podlozi. Kada je razlika 0,8mm a debljina layera 0,2mm, onda nema mehanizma koji bi sam od sebe riješio taj problem.

Detekcija problema

Da bi sam sebi dokazao da mi je pretpostavka ispravna, jer razlika između najmanje i najveće Z koordinate je 0,8mm, izveo sam jednostavan test. Koristim Repetier-Host kao program za upravljanje 3D printerom i u njemu sam ručno spustio glavu tik do podloge, ali na koordinati za koju mi je bed autoleveling rekao da je najmanja visina jer na toj koordinati je podloga najbliža glavi kada je u „home“ položaju. Nakon toga sam zadao G1 naredbu da glava ode do koordinate za koju mi je javio da je najviša, ali da se kreće vrlo sporo. Tu su bitne dvije pretpostavke. Prvo, daje Marlin firmware korektno napisan, a druga da je podloga ravna. Marlin je takav kakav je i samo mogu prihvatiti da je ispravan jer bi netko već primijetio da nešto ne štima. Podloga je staklena i sigurno nije idealno ravna ali isto tako nije ni deformirana da bi razlika bila 0,8mm. Pokrenuo sam G1 naredbu i pogledom pratio glavu kako putuje na ciljanu koordinatu. Vidio sam da se glava lagano udaljava od podloge, što ako uzmemo one dvije pretpostavke u obzir, jedino objašnjenje bi bila geometrijska nepravilnost. Jer ako Marlin firmware šalje naredbe koračnim motorima da glave ide ravno, odnosno uopće ne šalje naredbu za pomak po Z osi, i ako je podloga ravna, onda se glava ne bi smjela ni udaljavati od podloge, ni približavati, a test pokazuje suprotno.

Rješenje problema

- oglas-

Nakon što se model provuče kroz slicer dobivamo gomilu G-kod naredbi a one koje nas zanimaju se odnose na horizontalni pomak glave. Slicer u pravilu radi tako da ispisnu glavu podesi po visini i dok traje ispisivanje trenutnog layera Z os ne dira, dakle u G1 naredbi nema Z parametra, samo X i Y. Kako je prethodni test pokazao da pri horizontalnom pomaku glava putuje gore/dolje, a to predstavlja problem, G-kod treba modificirati tako da se glava pomakne po Z osi za onoliko kolika je greška. Kako greška nije na svim kombinacijama XY koordinata ista, trebalo je napraviti tablicu koja će opisati stvarno stanje. Prva testiranja sam napravio s koordinatama koje daje bed autoleveling, a kasnije sam još malo povećao broj točaka kako bi dobio gušću mrežu, a time i precizniju. Zbog toga više nisam mogao koristiti blagodati bed autolevelinga ali kako se radi o geometrijskoj nepravilnosti, to mjerenje je dovoljno napraviti jednom. Nakon što slicer napravi G-kod, treba ga snimiti kao običnu datoteku i provući je kroz Python skriptu iz komandne linije kao npr. python Z-calibration.py < slicer_gcode > modificirani_gcode. Sadržaj datoteke modificriani_gcode treba jednostavno otvoriti u nekom editoru i napraviti copy/paste u program za 3D printanje. Što je napravio Z-calibration.py? Zapravo ništa spektakularno. Sve Z koordinate je korigirao metodom bi-linearne interpolacije prema stvarnim visinama koje je dao bed autoleveling ili koje smo sami izmjerili. Na taj način se ispisna glava pozicionirala na stvarnu visinu od podloge za dotičnu XY koordinatu i na taj način zaobišla geometrijsku nepravilnost. Ali tu se javio još jedan problem, barem u mom slučaju. Ako imate neki veći objekt, npr. ploču 6×6 cm, G-kod izgleda tako da se zapisuju samo koordinate točaka u uglovima ploče, a sve između odrađuje sam firmware printera. To u praksi znači da je Z-calibration.py ispravno korigirao točke u uglovima, ali ne i točke koje su između. Kako je potez između početne i konačne točke relativno velik ispisna glava će i dalje ići gore/dolje jer se te točke ne interpoliraju. Kada bi model bio kružnog oblika, onda bi stvar štimala jer slicer krivulje pretvara u gomilu kratkih linija od kojih svaka ima svoju početnu i konačnu koordinatu koju bi Z-calibration.py korigirao. Kako dugačke linije slicer ne pretvara u puno manjih, to se neće dogoditi i greška će i dalje biti prisutna. Zato je tu još jedan Python program, G-splitline.py koji radi upravo to. U njemu se može definirati koja je najveća dopuštena duljina pojedinačne linije i sve koju se dulje od tog parametra, skratit će ih. Išao sam forsirati program da vidim kako radi i namjestio sam da ne smije biti dulje od 2,5 mm i stvar radi savršeno. G-kod bude nešto veći, ali koga briga. G-splitline.py osim što je skratio liniju iz originalnog G-koda, morao je korigirati i parametar ekstrudera jer je sada kraća linija koja se printa. Sada bi naredba iz komandne linije otprilike izgledala ovako: python G-splitline.py < slicer_gcode | python Z-calibration.py > modificirani_gcode. S ova dva Python programa su obuhvaćeni svi događaji koji mogu utjecati na visinu ispisne glave a da imaju veze s geometrijskom nepravilnošću.

Zaključak

Zbog geometrijske nepravilnosti pri konstantnoj Z osi ispisna glava putuje gore/dolje i to različito na različitim XY koordinatama. Ručno ili pomoću bed autolevelinga se izmjeri stvarna udaljenost glave od podloge i te vrijednosti se upišu u Z-calibration.py. Pošto se radi o geometrijskoj nepravilnosti, to mjerenje je u pravilu dovoljno napraviti jednom. Svaki put kada originalni G-kod koji je napravio slicer provučemo kroz Z-calibration.py korigirat će se Z os za svaku XY koordinatu prema vrijednostima koje smo dobili mjerenjem. Kako slicer sve ravne linije ne pretvara u više manjih linija, problem i dalje može biti prisutan ako su te linije dugačke. Iz tog razloga je napisan G-splitline.py koji će sve dugačke linije pretvoriti u više manjih, a sami određujemo koliko smije biti duga najdulja linija. Budući da se sada Z os korigira u svakoj G-kod naredbi, moguće je da program za printanje neće ispravno prikazivati ukupni broj layera i broj layera koji se trenutno printa, ali će ih ispravno printati. Još jednu stvar treba napomenuti. Obje Python skripte rade s pretpostavkom da su kod slicera podešene apsolutne koordinate. To znači da negdje na početku originalnog G-koda trebaju biti naredbe G90 i M82.

Podešavanje parametara za ispravan rad Python skripti

Krenut ću od G-splitline.py jer je jednostavniji. Ima samo jedan parametar, Lmax, vidi sliku.

Što je broj manji, to će G-splitline.py napraviti više linija. Ne treba pretjerivati, a meni se 2,5 mm pokazao kao dobar izbor.
Program Z-calibration.py je nešto kompliciraniji, ali ništa strašno. Evo prvo slike, a onda slijedi objašnjenje.

Uokvireni dio je koji se eventualno mijenja. Parametre ću objasniti po redu kako se pojavljuju. Z_OFFSET=-0.05
Ovo je generalni offset po Z osi u mm. Vrijednost koja ovdje piše će se dodati na svaku izračunatu vrijednost Z koordinate. Ako je manja od 0, glava će se za toliko spustiti, a ako je veća, podignuti, na svim točkama jednako. Z_PROBE_OFFSET_FROM_EXTRUDER=0
Ako ručnom metodom određujete na kojoj je visini podloga, onda ova vrijednost mora biti 0. Ako koristite bed autoleveling, onda morate upisti vrijednost koja se nalazi u Marlin firmware-u (Configuration.h datoteka). Tamo to otprilike izgleda ovako:

Varijabla je istog naziva i u Marlinu i u Z-calibration.py radi lakšeg snalaženja. U mojoj verziji Marlina nalazi se u 462 redu, što ne mora biti slučaj za sve, ali je tu negdje oko tog broja.
ABL=[] je definicija polja, to ne dirate.
Sad slijedi niz ABL.append([h1,h2,h3,…,h]). Umjesto h upisujete visinu koju je ispisao bed autoleveling, ili koju ste sami izmjerili. Ako idete uspoređivati te dvije vrijednosti dobivene bed autleveling i ručnom metodom, one će razlikovati upravo za parametar Z_PROBE_OFFSET_FROM_EXTRUDER iz Marlin configuration.h datoteke. Bed autoleveling uzima u obzir taj parametar, a ručna metoda ne. Zato je bitno da u Z-calibration.py upišete ili 0 ili vrijednost iz Marlina. Ako ste upisali 0, onda visine morate sami izmjeriti, a ako iz Marlina, samo ih prepišete iz programa kojim ste napravili bed autoleveling.
Međutim, ovo su samo visine. Još treba odrediti za koje kombinacije XY koordinata se odnose. To piše u slijedeća dva polja koja su najčešće ista, mada ne moraju biti.
X_os=[x1,x2,x3,…,x]
Y_os=[y1,y2,y3,…,y]
Kod ručnog mjerenja sami odredite kako gustu mrežu želite, a kod bed autolevelinga Marlin određuje sam. U oba slučaja ih samo prepišete. Bitno je da ABL.append, X_os i Y_os ima isti broj točaka, inače će program prijaviti grešku. U mom slučaju ih ima 11. Dakle, ABL.append se ponavlja 11 puta kao i broj točaka unutar njega i X_os i Y_os.
Primjećujete da je za neke rubne vrijednosti upisano -100. Kako delta ima kružnu podlogu za printanje, a mreža je kvadratnog oblika, onda neke kombinacije XY koordinata nisu dohvatljive, odnosno izlaze izvan područja za printanje. Takve koordinate označite s -100 jer se taj broj ne može pojaviti kao izmjerena visina, pa u programu predstavlja nedefiniranu vrijednost, odnosno područje izvan dosega glave za printanje.
I to je to. Ako se ne želite mučiti ostavite vrijednosti koje su u programu, jedino morate ručno izmjeriti visinu podloge za baš te koordinate.

Ručno mjerenje možete obaviti na slijedeći način:

  • prvo ustanovite koja je sigurna visina glave od podloge, a da nije previsoko (kod mene je 3 mm)
  • naredbom G1 Z3 brzo dovedete glavu na taj položaj
  • zatim naredbom npr. G1 X0 Y0 dovedete glavu na željenu koordinatu i onda je ručno spuštate po 0,1 mm
  • ispod glave stavite papirić i nakon svakog spuštanja za 0,1 mm provjerite možete li ga pomaknuti
  • onog trenutka kada papirić ide teško, ili uopće ne ide, tu vrijednost upišite kao visinu za taj par XY koordinata
  • opet s G1 Z3 podignite glavu, odaberite novu kombinaciju XY koordinata i ponovite ručni postupak spuštanja glave
    Na 11 točaka po X i Y koordinati ima puno mjerenja, točnije 105 jer su neke točke označene s -100, ali srećom to trebate napraviti samo jednom.
    A sad programi.

Preuzimanje:


Prethodni članakUBL: G29 na steroidima
Sljedeći članakPrint Your world- uvod

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...