Mechatronics Exercises

Workspace Navigation

3D-tulostin

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 35 Next »

Akseli Kjellberg

Jaakko Majuri


Valitsimme projektiksemme yksinkertaisen 3D-tulostimen valmistamisen. Tavoitteena on rakentaa hyvä ja toimiva 3D-tulostin mahdollisimman halvalla. Päätimme rakentaa karteesisen tulostimen, eli tulostuspää liikkuu karteesista koordinaatistoa käyttäen, sillä kyseinen tulostintyyppi on selkein ja helpoin toteuttaa ja kalibroida. Tulostusalueen tavoitekoko on 300 mm x 300 mm x 400mm. Motivaationa projektille toimii tarve saada toimiva 3D-tulostin halvalla.

Projektin suunnittelu aloitettiin pohtimalla ohjelmistoalustaa, jolle tulostin rakennetaan. Päädyimme valitsemaan Marlin 3D-ohjelman, sillä se on monikäyttöinen, helppo asentaa ja hyvin dokumentoitu. Sähköisenä alustana päätettiin käyttää Arduino Megaa RAMPS 1.4 -shieldillä, sillä se soveltuu erinomaisesti Marlin-ohjelmiston käyttöön. Runko rakennetaan 2020-alumiiniprofiilista, askelmoottoreina käytetään NEMA 17-moottoreita, joita ohjataan A4988-askelmoottoriohjaimilla. Tulostuspääksi valitaan E3D V6, jota syöttää Titan-ekstruuderi. Tulostuspää liikkuu X-akselilla hihnavedolla, samoin tulostusalusta Y-akselilla. Z-akselia ajetaan kahdella ruuvitangolla, joilla kummallakin on oma stepperi. Osa rakenteen tukipaloista tehdään itse, 3D-mallit näistä löytyy sivun tiedostoista.

Osat

Osan nimiHinta, €Muuta
Arduino, RAMPS, A4988 ja LCD21,33
5 x NEMA 17 stepperit31,42Max 1,5A
Tulostuspää E3D V68,3012V, 1,75mm tulostuslangalle
Titan ekstruuderi5,45Ilman moottoria
Lämmitetty tulostusalusta15,44300mm x 300mm, 12V
Virtalähde18,5312V 30A
Rajakytkimet 5kpl1,74
Hammastettu vetohihna2,345m pitkä, 6mm leveä
Hihnan väkipyörät 5kpl1,5920 hammasta, 5mm akselille, 6mm hihnalle
Lineaarilaakerit6,59Tulostuspedin liikuttamiseen, 8mm akselille
Liukutangot 2kpl8,40Tulostuspedin liikuttamiseen, Ø8mm, 550mm
Kytkentäpala 3kpl3,54Ø5mm → Ø8mm, yksi varalla
Moottorikiinnike 2kpl3,3390 astetta
Moottorikiinnike 3kpl3,87Suora
Kierretanko 2kpl11,902mm nousu, L=450mm, Ø8mm, lyijy
Kierretangon ohjainkiinnike3,51Ø8mm
2020 V-alumiiniprofiili41,293 x 450mm, 3 x 400mm, 2 x 550mm
Kulmakiinnike profiilille, 20kpl7,08
Tulostusspään kelkka6,96

V-ura profiilille

Muttereita, lajitelma8,76V-ura profiilille
Tukipyöriä 10kpl5,93V-ura profiilille
Tulostusalustan korkeudensäätöruuvit ja jouset1,07M3 uppokanta
Tulostuslanka20,841,75mm PLA 1kg
Yhteensä239,21


Yllä mainittujen lisäksi tulostimeen pitää itse valmistaa välilevy, johon lineaarilaakerit ja tulostuspedin kiinnikkeet kiinnittyvät, tulostuspään välipuomin Z-suuntaisen liikkeen mahdollistavat liitoskappaleet, rungon liitoslevyt tilattujen kulmakiinnikkeiden lisäksi, sekä kiinnikkeet liukutangoille. Alkuperäinen tarkoitus oli valmistaa itse tehtävät osat koululla 3D-tulostimella ja laserleikkurilla. Lisäksi tarvitaan kasa pultteja, prikkoja ja muita kiinnitystarvikkeita.


Osat tilattiin hyvissä ajoin Aliexpressistä Kiinasta, jotta printterin kasaus ja testaus voidaan aloittaa ajoissa. Kuitenkin koronatilanteen eskaloituminen johti siihen, että monen osan toimitus viivästyi, eivätkä kaikki ole vieläkään saapuneet. Näin ollen printteriä kasatessa jouduimme käyttämään runsaasti luovuutta ja tekemään osia itse, sekä soveltamaan. Virtalähteenä lopullisessa kokoonpanossa toimii tietokoneen ATX-virtalähde, josta 12V linjat on otettu käyttöön ja ohjaus toteutettiin PSU_ON -pinnin avulla RAMPS:lla. Ohjauselektroniikka jouduttiin tilamaan Saksan Amazonista, sillä Kiinasta tullut lähetys hukkui matkalle. Lyijyruuvitangot korvattiin rautakaupasta ostetulla DIN 975 M8 ruuvitangolla, mikä ei ole aivan ideaali tanko, sillä sen pyörimiskitka lyijyiseen tankoon verrattuna on suurempi. Runsaalla öljyllä haitta kuitenkin saatiin minimoitua. Sileät terästangot ja lineaarilaakerit jouduttiin korvaamaan niin ikään rautakaupasta saatavilla alumiinitangoilla (8mm terästankoa ei ollut varastossa) ja vanerinpaloilla, joista varsinkaan jälkimmäinen ei ole optimaalinen ratkaisu, mutta toimiva. Alumiiniprofiileista emme myöskään saaneet kaikkia, 550mm profiilit korvattiin kotona mittaan höylätyllä koivupaloilla. Moottorien ja ruuvitankojen kytkentäpalat tehtiin itse terästangosta pylväsporalla. Välilevy tehtiin myös itse, olosuhteiden pakosta käsin kulmahiomakoneella ja poralla, samoin kuin suorat stepperikiinnikkeet. 3D-tulostettavat osat tulostutettiin Jaakon isoveljellä.

Tärkeimmät osat. Humiona koivusta höylätyt kapulat, jotka korvaavat ei-saatuja alumiiniprofiileita.

Rakenne

Tulostimen runkorakenne on hyvin yksinkertainen. Runko koostuu alumiiniprofiileista, jotka liitetään toisiinsa kulmatuilla ja 3D-tulostetuilla tukipaloilla. Tulostuspää liitetään Z-suunnassa liikkuvaan profiiliin, joka liikkuu tulostettujen kiinnikkeiden ja niihin kiinnitettyjen rullien avulla profiilia pitkin.


2020 alumiiniprofiilin poikkileikkaus  

Alumiiniprofiilin poikkileikkaus                  Printterin rungon malli 

 

  Tukipala rungon pystysuoran osan kiinnittämiseen


Lämmityselementti ja pursotuspää kulkee kelkkaa pitkin alumiiniprofiililla, joka kiinnitetään rungon pystyputkien väliin 3D-tulostetuilla tuilla, joissa on rullat. Tämä mahdollistaa koko tulostuspään liikuttamisen pystysuunnassa (Z-akseli). X-akselina toimivaan profiiliin kiinnitetään myös stepperi, jolla liikutetaan tulostuskelkkaa, X_MIN -rajakytkin, sekä kulmatuet, jotka toimivat tukipisteinä Z-akselin kierretankojen muttereille. Mutterit sopivat mainiosti kulmatukien sisään, joten niitä ei tarvinnut erikseen kiinnittää pyörimisen estämiseksi (kuvat alla).

 

X-akselin kiinnityksen ja liikuttamisen detaljeja.


Kun rungon pystysuora osa saatiin kasattua, oli aika rakentaa vaakasuora osa. Koivusta valmistettuihin maalattuihin tukipalkkeihin porattiin reiät tarvittaviin kohtiin, ja kiinnitykseen käytettiin ruuveja ja M5:n pultteja. Vaakasuoran rungon väliin asetettiin alumiinitangot, joilla tulostuspeti osineen liikkuu. Tangot sahattiin oikean mittaisiksi, jolloin ne eivät liiku edestakaisin runkoprofiilien välissä. Näin ollen kiinnitykseksi riitti ratkaisu, joka pitää tangot paikallaan sivu- ja pystysuunnassa. Samalla rakennettiin kiinnikkeet ja kiristin hihnavedolle, joka liikuttaa tulostusalustaa. Kiinnikkeet tehtiin leikkaamalla ja poraamalla itse teräksestä (pl. moottorin kiinnike), koska muita valmistusvaihtoehtoja ei vallitsevan tilanteen vuoksi ollut saatavilla. Lopputulos kuitenkin osoittautui toimivaksi ja hyväksi.


Y-akselin liikkumisen mahdollistavien komponenttien puutteessa mekaaninen ratkaisu piti soveltaa nopeasti saatavilla olleista materiaaleista. Tulostusalustan ja liukutankojen välilevy rälläköitiin teräksestä ja 'liukulaakerit' vanerista. Hyvän luiston takaamiseksi tangot voideltiin vaseliinilla. Vanerien rei'istä jouduimme tietysti tekemään hieman liian isot, jottei puu hirtä kiinni liukutankoon. Tekemämme ratkaisu osoittautui toimivaksi, mutta testausvaiheessa havaitsimme myös siihen liittyvän ongelman. Välilevy kiinnitettiin pulteilla vaneripaloihin ja tulostusalusta puolestaan korkeudensäätöruuveilla välilevyyn.

Välilevyn muoto ja kiinnitys                                                 Tulostusalustan korkeudensäätö


Z-akselina toimivien ruuvitankojen moottorit kiinnitettiin pääpalkkeihin ruuveilla ja itsetehdyillä kiinnikkeillä. Myös moottorin ja ruuvitangon kytkentäpala jouduttiin tekemään itse. Ratkaisu toimii, mutta ei ole optimaalinen, sillä itse tehty kytkin ei jousta.

Elektroniikka

Alustana projektille toimii Arduino Mega 2560, sekä siihen liitetty shield, RAMPS 1.4. RAMPS tarjoaa erinomaisen alustan tulostimen rakentamiselle, sillä se on suunniteltu ohjaamaan useampaa askelmoottoria, sekä lämmityselementtiä. RAMPS:n liitetään suoraan askelmoottorien ohjaimet, jotka rajoittavat moottoreille syötettyä virtaa ja toisaalta huolehtivat moottorin mikroaskelluksesta. Lisäksi RAMPS:n saa yhdistettyä useamman lämpötila-anturin ja rajakytkimen. Käytimme projektissa A4988 -askelmoottoriohjaimia, jotka kalibroimme rajoittamaan virran 1,5A, pois lukien Z-akselin moottorit, joita ohjaa vain yksi ohjain. Näin ollen tämän ohjaimen virtarajaa nostettiin. Kalibrointi suoritetaan kytkemällä ohjain jännitteeseen (Arduinon 5V) ja mittaamalla säätöruuvin, sekä maan välinen referenssjännite. Haluttu jännite, kun moottorien maksimivirta tiedetään, saadaan kaavalla Vref = Im * 8 * Rsense, missä Vref on haluttu mittaustulos, Imoottorin maksimivirta ja Rsense = 0,068Ω. 1,5A moottoreille sopiva referenssiarvo on 0,810V.

Referenssijännitteen mittaus

Moottoreiksi valitsimme NEMA 17 17HS4401 -moottorit, joissa askeleen koko on 1,8 astetta (200 askelta per kierros), jotka kytketään suoraan RAMPS:n. Samoin tehdään muillekin osille rajakytkimistä lämmitysvastuksiin. RAMPS, kuten muutkin shieldit, asetetaan Arduinon päälle suoraan sen pinneihin.


  

        

         Kytkennät RAMPS:n


Kytkentäprosessi oli hyvin simppeli, käytännössä johdot kiinni ja testaamaan. Printterin host-ohjelmana käytimme Pronterfacea. Host tarvitaan, jotta PC ja Arduino voivat kommunikoida keskenään. Printterin ohjaus voitaisiin toteuttaa myös LCD-näytöllä, mutta sekin jäi saapumatta koronatilanteen takia. Koska käytimme ATX-virtalähdettä, oli oleellista selvittää, miten ATX 24-pin liittimestä saadaan 12V. Käytännössä tarkistimme liittimen pinlayoutin netistä ja irrotimme tarvittavat johdot liittimestä. Kolvasimme ne yhteen ja liitimme RAMPS:n. On hyvä huomioida, että vaikka ATX-virtalähde kykenee usein yli 30A virtaan 12V kiskosta, ei yksi virtalähteen johto kykene sellaista virtaa kuljettamaan. Siksi liitimme useamman johdon yhteen, lämmitetty tulostusalusta kun voi helposti syödä 20A, jos sitä lämmitetään täydellä teholla. ATX-liittimestä piti irrottaa myös PSU_ON pinni, joka ohjaa virtalähteen toimintaa. Toisin sanoen, kun pinnin arvoksi asettaa LOW, virtalähde käynnistyy.  Alla kuva ATX-liittimen layoutista.

Kun kaikki kytkennät on saatu tehtyä ja virta syötettyä Arduinoon, on aika siirtyä ohjelman asentamiseen. Marlin 3D-ohjelman saa ladattua täältä. Käytämme viimeisintä versiota 2.0.5.3. Ennen Marlinin lataamista Arduinoon täytyy ohjelman konfiguraatio muokata omalle tulostimelle sopivaksi. Käytännössä tämä tarkoittaa Marlin.ino tiedoston avaamista Arduino IDE:llä ja config.h ja config_adv.h -tiedostojen parametrien asettamista. Koska Marlin on monitiedostoinen avoimen lähdekoodin ohjelma, emme jaa sitä tähän, mutta esitämme tekemämme muuttujamääritykset yllä mainittuihin tiedostoihin. Parametrien asettaminen on rakennettu siten, että lähes jokaiseen asetukseen liittyy if -oletus, eli jos muuttujan määrittelyä ei ole, asetusta ei käytetä. Hyvä nyrkkisääntö on, että jos ei tiedä mitä asetus tarkoittaa, sitä ei todennäköisesti tarvita. Näyttämämme koodi ei ole siis toimiva config.h -tiedosto, vaan esitys muuttujien määrityksistä. Kattava konfiguroimisopas löytyy Marlinin sivuilta. Jotta kaikki asetukset voi asettaa, täytyy tietää eri akseleille vaadittu steppien määrä millimetrin liikkeeseen. Tämän laskemiseen löytyy oivallisia työkaluja netistä.

Configuration options
/**
 * Marlin 3D Printer Firmware
 * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 *
 * Based on Sprinter and grbl.
 * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
#pragma once

/**
 * Configuration.h
 *
 * Basic settings such as:
 *
 * - Type of electronics
 * - Type of temperature sensor
 * - Printer geometry
 * - Endstop configuration
 * - LCD controller
 * - Extra features
 *
 * Advanced settings can be found in Configuration_adv.h
 *
 */
#define CONFIGURATION_H_VERSION 020005

//===========================================================================
//============================= Getting Started =============================
//===========================================================================

/**
 * Here are some standard links for getting your machine calibrated:
 *
 * http://reprap.org/wiki/Calibration
 * http://youtu.be/wAL9d7FgInk
 * http://calculator.josefprusa.cz
 * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
 * http://www.thingiverse.com/thing:5573
 * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
 * http://www.thingiverse.com/thing:298812
 */


// @section machine

/**
 * Select the serial port on the board to use for communication with the host.
 * This allows the connection of wireless adapters (for instance) to non-default port pins.
 * Serial port -1 is the USB emulated serial port, if available.
 * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader.
 *
 * :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
 */
#define SERIAL_PORT 0

/**
 * This setting determines the communication speed of the printer.
 *
 * 250000 works in most cases, but you might try a lower speed if
 * you commonly experience drop-outs during host printing.
 * You may try up to 1000000 to speed up SD file transfer.
 *
 * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000]
 */
#define BAUDRATE 115200

// Choose the name from boards.h that matches your setup
#ifndef MOTHERBOARD
  #define MOTHERBOARD BOARD_RAMPS_14_EFB
#endif

// Name displayed in the LCD "Ready" message and Info menu
#define CUSTOM_MACHINE_NAME "Printteri"

// @section extruder

// This defines the number of extruders
// :[1, 2, 3, 4, 5, 6, 7, 8]
#define EXTRUDERS 1

// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc.
#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75

// @section machine

/**
 * Power Supply Control
 *
 * Enable and connect the power supply to the PS_ON_PIN.
 * Specify whether the power supply is active HIGH or active LOW.
 */
#define PSU_CONTROL
#define PSU_NAME "Power Supply"

#if ENABLED(PSU_CONTROL)
  #define PSU_ACTIVE_HIGH false     // Set 'false' for ATX, 'true' for X-Box

  //#define PSU_DEFAULT_OFF         // Keep power off until enabled directly with M80
  //#define PSU_POWERUP_DELAY 100   // (ms) Delay for the PSU to warm up to full power

  #define AUTO_POWER_CONTROL      // Enable automatic control of the PS_ON pin
  #if ENABLED(AUTO_POWER_CONTROL)
    #define AUTO_POWER_FANS         // Turn on PSU if fans need power
    #define AUTO_POWER_E_FANS
    #define AUTO_POWER_CONTROLLERFAN
    #define AUTO_POWER_CHAMBER_FAN
    //#define AUTO_POWER_E_TEMP        50 // (°C) Turn on PSU over this temperature
    //#define AUTO_POWER_CHAMBER_TEMP  30 // (°C) Turn on PSU over this temperature
    #define POWER_TIMEOUT 30
  #endif
#endif

// @section temperature

//===========================================================================
//============================= Thermal Settings ============================
//===========================================================================

/**
 * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table
 *
 * Temperature sensors available:
 *
 *    -5 : PT100 / PT1000 with MAX31865 (only for sensors 0-1)
 *    -3 : thermocouple with MAX31855 (only for sensors 0-1)
 *    -2 : thermocouple with MAX6675 (only for sensors 0-1)
 *    -4 : thermocouple with AD8495
 *    -1 : thermocouple with AD595
 *     0 : not used
 *     1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup)
 *   331 : (3.3V scaled thermistor 1 table for MEGA)
 *   332 : (3.3V scaled thermistor 1 table for DUE)
 *     2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup)
 *   202 : 200k thermistor - Copymaster 3D
 *     3 : Mendel-parts thermistor (4.7k pullup)
 *     4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !!
 *     5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup)
 *   501 : 100K Zonestar (Tronxy X3A) Thermistor
 *   512 : 100k RPW-Ultra hotend thermistor (4.7k pullup)
 *     6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup)
 *     7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup)
 *    71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup)
 *     8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup)
 *     9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup)
 *    10 : 100k RS thermistor 198-961 (4.7k pullup)
 *    11 : 100k beta 3950 1% thermistor (4.7k pullup)
 *    12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed)
 *    13 : 100k Hisens 3950  1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE"
 *    15 : 100k thermistor calibration for JGAurora A5 hotend
 *    18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327
 *    20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR)
 *    21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....)
 *   201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
 *    60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
 *    61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup
 *    66 : 4.7M High Temperature thermistor from Dyze Design
 *    67 : 450C thermistor from SliceEngineering
 *    70 : the 100K thermistor found in the bq Hephestos 2
 *    75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor
 *    99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines)
 *
 *       1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k.
 *                              (but gives greater accuracy and more stable PID)
 *    51 : 100k thermistor - EPCOS (1k pullup)
 *    52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup)
 *    55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup)
 *
 *  1047 : Pt1000 with 4k7 pullup
 *  1010 : Pt1000 with 1k pullup (non standard)
 *   147 : Pt100 with 4k7 pullup
 *   110 : Pt100 with 1k pullup (non standard)
 *
 *  1000 : Custom - Specify parameters in Configuration_adv.h
 *
 *         Use these for Testing or Development purposes. NEVER for production machine.
 *   998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below.
 *   999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below.
 */
#define TEMP_SENSOR_0 1000
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0
#define TEMP_SENSOR_4 0
#define TEMP_SENSOR_5 0
#define TEMP_SENSOR_6 0
#define TEMP_SENSOR_7 0
#define TEMP_SENSOR_BED 60
#define TEMP_SENSOR_PROBE 0
#define TEMP_SENSOR_CHAMBER 0

// Dummy thermistor constant temperature readings, for use with 998 and 999
#define DUMMY_THERMISTOR_998_VALUE 40
#define DUMMY_THERMISTOR_999_VALUE 100

// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings
// from the two sensors differ too much the print will be aborted.
//#define TEMP_SENSOR_1_AS_REDUNDANT
#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10

#define TEMP_RESIDENCY_TIME     10  // (seconds) Time to wait for hotend to "settle" in M109
#define TEMP_WINDOW              1  // (°C) Temperature proximity for the "temperature reached" timer
#define TEMP_HYSTERESIS          3  // (°C) Temperature proximity considered "close enough" to the target

#define TEMP_BED_RESIDENCY_TIME  5  // (seconds) Time to wait for bed to "settle" in M190
#define TEMP_BED_WINDOW          2  // (°C) Temperature proximity for the "temperature reached" timer
#define TEMP_BED_HYSTERESIS      5  // (°C) Temperature proximity considered "close enough" to the target

// Below this temperature the heater will be switched off
// because it probably indicates a broken thermistor wire.
#define HEATER_0_MINTEMP   5
#define HEATER_1_MINTEMP   5
#define HEATER_2_MINTEMP   5
#define HEATER_3_MINTEMP   5
#define HEATER_4_MINTEMP   5
#define HEATER_5_MINTEMP   5
#define HEATER_6_MINTEMP   5
#define HEATER_7_MINTEMP   5
#define BED_MINTEMP        5

// Above this temperature the heater will be switched off.
// This can protect components from overheating, but NOT from shorts and failures.
// (Use MINTEMP for thermistor short/failure protection.)
#define HEATER_0_MAXTEMP 275
#define HEATER_1_MAXTEMP 275
#define HEATER_2_MAXTEMP 275
#define HEATER_3_MAXTEMP 275
#define HEATER_4_MAXTEMP 275
#define HEATER_5_MAXTEMP 275
#define HEATER_6_MAXTEMP 275
#define HEATER_7_MAXTEMP 275
#define BED_MAXTEMP      70

//===========================================================================
//============================= PID Settings ================================
//===========================================================================
// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning

// Comment the following line to disable PID and enable bang-bang.
#define PIDTEMP
#define BANG_MAX 255     // Limits current to nozzle while in bang-bang mode; 255=full current
#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current
#define PID_K1 0.95      // Smoothing factor within any PID loop
#if ENABLED(PIDTEMP)
  //#define PID_EDIT_MENU         // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM)
  #define PID_AUTOTUNE_MENU     // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM)
  //#define PID_DEBUG             // Sends debug data to the serial port.
  //#define PID_OPENLOOP 1        // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
  //#define SLOW_PWM_HEATERS      // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
  //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders)
                                  // Set/get with gcode: M301 E[extruder number, 0-2]
  #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
                                  // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.

  // oma rintteri P31.72 I2.69 K93.54
  #define DEFAULT_Kp 31.72
  #define DEFAULT_Ki 2.69
  #define DEFAULT_Kd 93.54
#endif // PIDTEMP

//===========================================================================
//====================== PID > Bed Temperature Control ======================
//===========================================================================

/**
 * PID Bed Heating
 *
 * If this option is enabled set PID constants below.
 * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis.
 *
 * The PID frequency will be the same as the extruder PWM.
 * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz,
 * which is fine for driving a square wave into a resistive load and does not significantly
 * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W
 * heater. If your configuration is significantly different than this and you don't understand
 * the issues involved, don't use bed PID until someone else verifies that your hardware works.
 */
#define PIDTEMPBED

//#define BED_LIMIT_SWITCHING

/**
 * Max Bed Power
 * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis).
 * When set to any value below 255, enables a form of PWM to the bed that acts like a divider
 * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED)
 */
#define MAX_BED_POWER 150 // limits duty cycle to bed; 255=full current

#if ENABLED(PIDTEMPBED)
  #define MIN_BED_POWER 0
  //#define PID_BED_DEBUG // Sends debug data to the serial port.
  
  // oma rintteri
  #define DEFAULT_bedKp 14.00
  #define DEFAULT_bedKi 0.9
  #define DEFAULT_bedKd 120.4

  // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
#endif // PIDTEMPBED

// @section extruder

/**
 * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP.
 * Add M302 to set the minimum extrusion temperature and/or turn
 * cold extrusion prevention on and off.
 *
 * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! ***
 */
#define PREVENT_COLD_EXTRUSION
#define EXTRUDE_MINTEMP 180

/**
 * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH.
 * Note: For Bowden Extruders make this large enough to allow load/unload.
 */
#define PREVENT_LENGTHY_EXTRUDE
#define EXTRUDE_MAXLENGTH 500

//===========================================================================
//======================== Thermal Runaway Protection =======================
//===========================================================================

/**
 * Thermal Protection provides additional protection to your printer from damage
 * and fire. Marlin always includes safe min and max temperature ranges which
 * protect against a broken or disconnected thermistor wire.
 *
 * The issue: If a thermistor falls out, it will report the much lower
 * temperature of the air in the room, and the the firmware will keep
 * the heater on.
 *
 * If you get "Thermal Runaway" or "Heating failed" errors the
 * details can be tuned in Configuration_adv.h
 */

#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders
#define THERMAL_PROTECTION_BED     // Enable thermal protection for the heated bed
#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber

//===========================================================================
//============================== Endstop Settings ===========================
//===========================================================================

// @section homing

// Specify here all the endstop connectors that are connected to any endstop or probe.
// Almost all printers will be using one per axis. Probes will use one or more of the
// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
#define USE_XMIN_PLUG
#define USE_YMIN_PLUG
#define USE_ZMIN_PLUG
//#define USE_XMAX_PLUG
//#define USE_YMAX_PLUG
//#define USE_ZMAX_PLUG

// Enable pullup for all endstops to prevent a floating state
#define ENDSTOPPULLUPS
#if DISABLED(ENDSTOPPULLUPS)
  // Disable ENDSTOPPULLUPS to set pullups individually
  //#define ENDSTOPPULLUP_XMAX
  //#define ENDSTOPPULLUP_YMAX
  //#define ENDSTOPPULLUP_ZMAX
  //#define ENDSTOPPULLUP_XMIN
  //#define ENDSTOPPULLUP_YMIN
  //#define ENDSTOPPULLUP_ZMIN
  //#define ENDSTOPPULLUP_ZMIN_PROBE
#endif

// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
#define X_MIN_ENDSTOP_INVERTING true  // Set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING true  // Set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING true  // Set to true to invert the logic of the endstop.


//=============================================================================
//============================== Movement Settings ============================
//=============================================================================
// @section motion

/**
 * Default Settings
 *
 * These settings can be reset by M502
 *
 * Note that if EEPROM is enabled, saved values will override these.
 */

/**
 * With this option each E stepper can have its own factors for the
 * following movement settings. If fewer factors are given than the
 * total number of extruders, the last value applies to the rest.
 */
//#define DISTINCT_E_FACTORS

/**
 * Default Axis Steps Per Unit (steps/mm)
 * Override with M92
 *                                      X, Y, Z, E0 [, E1[, E2...]]
 */
#define DEFAULT_AXIS_STEPS_PER_UNIT    { 80, 80, 2560.00, 419 }

/**
 * Default Max Feed Rate (mm/s)
 * Override with M203
 *                                      X, Y, Z, E0 [, E1[, E2...]]
 */
#define DEFAULT_MAX_FEEDRATE          { 300, 300, 6, 30 }

//#define LIMITED_MAX_FR_EDITING        // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2
#if ENABLED(LIMITED_MAX_FR_EDITING)
  #define MAX_FEEDRATE_EDIT_VALUES    { 600, 600, 6, 50 } // ...or, set your own edit limits
#endif

/**
 * Default Max Acceleration (change/s) change = mm/s
 * (Maximum start speed for accelerated moves)
 * Override with M201
 *                                      X, Y, Z, E0 [, E1[, E2...]]
 */
#define DEFAULT_MAX_ACCELERATION      { 3000, 3000, 100, 10000 }

//#define LIMITED_MAX_ACCEL_EDITING     // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
  #define MAX_ACCEL_EDIT_VALUES       { 6000, 6000, 200, 20000 } // ...or, set your own edit limits
#endif

/**
 * Default Acceleration (change/s) change = mm/s
 * Override with M204
 *
 *   M204 P    Acceleration
 *   M204 R    Retract Acceleration
 *   M204 T    Travel Acceleration
 */
#define DEFAULT_ACCELERATION          2000    // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION   3000    // X, Y, Z acceleration for travel (non printing) moves

/**
 * Default Jerk limits (mm/s)
 * Override with M205 X Y Z E
 *
 * "Jerk" specifies the minimum speed change that requires acceleration.
 * When changing speed and direction, if the difference is less than the
 * value set here, it may happen instantaneously.
 */
//#define CLASSIC_JERK
#if ENABLED(CLASSIC_JERK)
  #define DEFAULT_XJERK 10.0
  #define DEFAULT_YJERK 10.0
  #define DEFAULT_ZJERK  0.2

  //#define TRAVEL_EXTRA_XYJERK 0.0     // Additional jerk allowance for all travel moves

  //#define LIMITED_JERK_EDITING        // Limit edit via M205 or LCD to DEFAULT_aJERK * 2
  #if ENABLED(LIMITED_JERK_EDITING)
    #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits
  #endif
#endif

#define DEFAULT_EJERK    8.0  // May be used by Linear Advance

/**
 * Junction Deviation Factor
 *
 * See:
 *   https://reprap.org/forum/read.php?1,739819
 *   http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html
 *   
 *   Calculated with d=.4*(jerk^2/print_acc)
 */
#if DISABLED(CLASSIC_JERK)
  #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge
#endif

/**
 * S-Curve Acceleration
 *
 * This option eliminates vibration during printing by fitting a Bézier
 * curve to move acceleration, producing much smoother direction changes.
 *
 * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
 */
#define S_CURVE_ACCELERATION

// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
// :{ 0:'Low', 1:'High' }
#define X_ENABLE_ON 0
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define E_ENABLE_ON 0 // For all extruders

// Disables axis stepper immediately when it's not being used.
// WARNING: When motors turn off there is a chance of losing position accuracy!
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false

// Warn on display about possibly reduced accuracy
//#define DISABLE_REDUCED_ACCURACY_WARNING

// @section extruder

#define DISABLE_E false             // For all extruders
#define DISABLE_INACTIVE_EXTRUDER   // Keep only the active extruder enabled

// @section machine

// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
#define INVERT_X_DIR false
#define INVERT_Y_DIR false
#define INVERT_Z_DIR false

// @section extruder

// For direct drive extruder v9 set to true, for geared extruder set to false.
#define INVERT_E0_DIR false
#define INVERT_E1_DIR false
#define INVERT_E2_DIR false
#define INVERT_E3_DIR false
#define INVERT_E4_DIR false
#define INVERT_E5_DIR false
#define INVERT_E6_DIR false
#define INVERT_E7_DIR false

// @section homing

//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed

//#define UNKNOWN_Z_NO_RAISE      // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off.

//#define Z_HOMING_HEIGHT  4      // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ...
                                  // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding.

//#define Z_AFTER_HOMING  10      // (mm) Height to move to after homing Z

// Direction of endstops when homing; 1=MAX, -1=MIN
// :[-1,1]
#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR -1

// @section machine

// The size of the print bed
#define X_BED_SIZE 260
#define Y_BED_SIZE 240

// Travel limits (mm) after homing, corresponding to endstop positions.
#define X_MIN_POS -0.5
#define Y_MIN_POS 0
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
#define Z_MAX_POS 400

/**
 * Software Endstops
 *
 * - Prevent moves outside the set machine bounds.
 * - Individual axes can be disabled, if desired.
 * - X and Y only apply to Cartesian robots.
 * - Use 'M211' to set software endstops on/off or report current state
 */

// Min software endstops constrain movement within minimum coordinate bounds
#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
  #define MIN_SOFTWARE_ENDSTOP_X
  #define MIN_SOFTWARE_ENDSTOP_Y
  #define MIN_SOFTWARE_ENDSTOP_Z
#endif

// Max software endstops constrain movement within maximum coordinate bounds
#define MAX_SOFTWARE_ENDSTOPS
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
  #define MAX_SOFTWARE_ENDSTOP_X
  #define MAX_SOFTWARE_ENDSTOP_Y
  #define MAX_SOFTWARE_ENDSTOP_Z
#endif

#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS)
  //#define SOFT_ENDSTOPS_MENU_ITEM  // Enable/Disable software endstops from the LCD
#endif


/**
 * Marlin 3D Printer Firmware
 * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
 *
 * Based on Sprinter and grbl.
 * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
#pragma once

/**
 * Configuration_adv.h
 *
 * Advanced settings.
 * Only change these if you know exactly what you're doing.
 * Some of these settings can damage your printer if improperly set!
 *
 * Basic settings can be found in Configuration.h
 *
 */
#define CONFIGURATION_ADV_H_VERSION 020005

// @section temperature

//===========================================================================
//=============================Thermal Settings  ============================
//===========================================================================

//
// Custom Thermistor 1000 parameters
//
#if TEMP_SENSOR_0 == 1000
  #define HOTEND0_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
  #define HOTEND0_RESISTANCE_25C_OHMS  106000  // Resistance at 25C
  #define HOTEND0_BETA                 3500    // Beta value
#endif

Ohessa vielä tiedostot Configuration.h ja Configuration_adv.h


Testaus

Kun saimme ohjelman konfiguroinnin hoidettua, aloitimme tulostimen testaamisen. Käytimme hostina printterille Pronterface -ohjelmaa, jolla printteriä voi ohjata manuaalisesti ja antaa sille komentoja. Ensimmäinen asia, jonka testauksessa huomaa, on jos moottorit liikkuvat väärään suuntaan kotiuttaessa. Kotipiste on koordinaatiston piste (0,0,0), luonnollisesti tulostuspedin alavasemmassa kulmassa. Moottorit pyörivät väärään suuntaan, jos kotiuttaessa akselia MIN -positioon, akseli liikkuukin MAX -suuntaan. Helppo korjaus on kääntää moottorin johtoliitin 180 astetta ympäri, jolloin kelat toimivat ns. eri suuntaan.

Tärkeä testausvaihe on tarkistaa lämpötila-antureiden tarkka toiminta ja samalla lämmityselementtien toimivuus. Yli 200-asteisen tulostuspään kanssa saa kuitenkin olla varovainen, ettei polta itseään. Samalla pitää olla varovainen lämmitetyn tulostusalustan imaiseman virran kanssa. Tulostuspään lämpötila-anturille emme saaneet riittävän tarkkaa mittausta Configuration.h tiedostossa valmiiksi olleiden lämpötila-anturiparametrien avulla, joten jouduimme kalibroimaan ja asettamaan anturin arvot itse konfiguraatioon. Kalibrointi tehtiin mittaamalla anturin resistanssi 3 eri tiedetyssä lämpötilassa, ja niiden avulla laskimme anturin β-arvon. Saatu tulos lisättiin Configuration_adv.h -tiedoston custom thermistor parameters -osioon ja varsinaisesta konfiguraatiotiedostosta anturin tyypiksi merkittiin 1000 (=custom). β-arvo laskettiin tällä laskurilla.

Kun tulostimen peruskomponentit toimii, voi määrittää tulostusalueen rajat tarkemmin. Rajat kirjataan myös konfiguraatiotiedostoon. Rakenteellisten syiden vuoksi emme saaneet aivan tavoiteltua 300 x 300mm tulostusalustaa käyttöön, mutta muutamalla muutoksella tulostuspään kiinnitykseen ja rungon tukipaloihin koko alusta saadaan käyttöön. Liikerajoja määritettäessä on hyvä tarkistaa ja asettaa rajakytkimien paikat tarkasti oikein, jotta myöhemmiltä ongelmilta kalibroinnissa vältytään. Aluksi kiinnitimme rajakytkimet väliaikaisratkaisuilla, eli teipillä ja nippusiteillä, kunnes saimme tulostimen toimimaan ja tulostettua kunnolliset kiinnikkeet kytkimille.

 

  Itsetulostettuja rajakytkinkiinnikkeitä

Testausvaiheessa huomasimme myös, että askelmoottorien ohjaimet ja MOSFET:t lämpenevät melko paljon. Ratkaisuksi ongelmaan tulostimme tuuletinkiinnikkeen, jonka avulla ilmavirtaa voidaan ohjata suoraan emolevyn komponenteille.

Tuulettimen asennus

Kun tulostimen liikeradat ja suunnat, sekä muut mekaaniset ominaisuudet saatiin toimimaan, aloimme peruskalibroinnin tekemisen. Peruskalibrointiin kuuluu tulostuspöydän korkeuden säätäminen, lämmityselementtien PID-säätö ja tulostuslangan syötön kalibrointi. Tulostuspöydän korkeus säädetään paperilla siten, että suutin ajetaan erikseen joka kulmaan samalle korkeudelle, jonka jälkeen suuttimen ja tulostuspöydän välissä liikutetaan paperia. Paperin tulisi liikkua tahmeasti, mutta kuitenkin liikkua.

PID-säätimen arvojen optimoimiseen on Marlinissa erikseen käsky (M303 E0 S200 C8), joka nostaa halutun komponentin (E0, ekstruuderi 0) lämpötilan halittuun arvoon (S), ja pyörii sen arvon ympärillä määritetyn määrän syklejä (C). Tällä komennolla saa riittävän tarkat PID-säätimen kertoimet, joten emme vaivautuneet manuaalituunaukseen.

Tulostuslangan annostelun kalibrointi on hyvin simppeliä. Merkataan lankaan jonkin pituinen väli, ja sen jälkeen asetetaan syöttölaite syöttämään ko. pituus lankaa. Jos haluttu syöttöpituus ei vastaa todellisuutta, muutetaan Marlinista syötön parametreja, kunnes syöttömäärä saadaan kohdalleen.

Pohdintoja


Viimeistelyä vaille valmis tulostin

Tulostimen rakentaminen oli yllättävän hauska, vaikkakin hankalahko ja monivaiheinen projekti. Oman lisähaasteensa toi tilattujen osien jääminen matkalle. Koska halusimme toimivan tulostimen, emme alkaneet tinkiä tavoitteista, mikä tarkoitti vaihtoehtoisten ratkaisujen keksimistä moneen asiaan. Erilaisia iteraatioita mm. liukulaakerien korvaajaksi syntyi, mutta toteutimme niistä yksinkertaisimman, joka suinkin toimii. Kuitenkin ratkaisumme mahdollistaa tulostusalustan pienen värinän, mikä tulosteen kerroksissa näkyy pienenä epätarkkuutena (kerrosten sivuttaissiirto). Näin ollen tekemämme ratkaisu jää väliaikaiseksi, samoin kuin DIN-kierretangot, joiden pyörittämiseen ei voi suuren kitkan vuoksi soveltaa kovinkaan suurta kiihtyvyyttä tai nopeutta, ettei askelmoottori menetä askelia. Näiden väliaikaisratkaisuiden korvaaminen tarkoitukseen soveltuvilla komponenteilla nostaa tulostusnopeutta ja lisää tarkkuutta.

Tulostimen käytön helpottamiseksi pohdimme useampaakin parannusta, mutta niistä päällimmäiseksi nousivat LCD:n lisääminen (sekin oli alun perin tilattu, mutta jäi matkalle) ja tulostuspään kiinnityksen uudelleen suunnittelu. LCD:n, johon on samalle piirilevylle kiinnitetty SD-kortin lukija, avulla tulostinta pystyisi hallitsemaan ilman tietokonetta ja tulostuksen aloittamaan SD-kortilta. Näin ollen tulostimen voisi sijoittaa eri tilaan kuin tietokoneen, jolloin tulostimen äänet ja hajut eivät häiritse muuta elämää. Tulostuspään taas totesimme menevän helposti tukkoon, jos tulostamisen aikana tapahtuu jokin virhe, tai tulostus muusta syystä keskeytyy äkillisesti. Tukoksen avaamiseksi tulostuspää tarvitsee irrottaa kelkastaan, jotta siihen pääsee käsiksi. Suunnittelemalla kiinnitys uudestaan, säästetään irrottamiseen kuluvaa aikaa ja vaivaa. Samalla myös suuttimen vaihto helpottuu. 

Tulostimen ohjausyksikölle ja virtalähteelle on tarkoitus lisätä kiinnitys ja kotelointi, jotta ne kulkevat mukavammin tulostimen mukana. Tiukan kasausaikataulun vuoksi tästä jouduttiin kuitenkin tinkimään, eikä johtoja yms. laitettu ihan niin siististi kuin olisi ollut suotavaa.

Tulostuslaadun ja -nopeuden optimointi vaatii vielä runsasta testaamista, esimerkiksi värinän ja Jerk-asetuksen suhteen. Tulostimen akselien liikkuessa edestakaisin aiheutuu värinää ja epätoivottua liikehdintää, varsinkin jos tulostimella ei ole kunnon jalustaa. Värinää pystyy vähentämään ottamalla käyttöön erilaisia kiihdytys-/jarrutus käyriä Marlin-konfiguraatiosta. Toinen merkittävä värinää ja muuta epätoivottua nykimistä vähentävä asetuskokonaisuus on Jerk-asetuksiin liittyvät arvot ja niiden säätäminen. Jerk määrittää, kuinka suuri tai pieni liikkeen muutos ilman hidastuvuuskäyrien käyttöä on sallittu, eli millaisesta vauhdista voi liikkeen suunnan vaihtaa välittömästi. Jerk-asetuksilla on suuri vaikutus tulostusnopeuteen ja -laatuun, mutta asetuksen saaminen kuntoon vaatii pitkän testausprosessin, emmekä sitä ehtineet tehdä. Joka tapauksessa huomasimme, että tulostuslaadun ja -nopeuden optimointi, sekä tulostimen parantaminen on loputon, jatkuvasti iteroituva prosessi, jossa koskaan ei tyydy siihen, että tämä on riittävän hyvä.


Päivitys 2021

Jaakko Majuri


Osana Mekatroniikan eriköistyötä toteutin printteriin useita päivityksiä ja parannuksia, joilla koronakeväästä 2020 johtuvia tee-se-itse ratkaisuja korvattiin paremmilla ja parempaa tulostusjälkeä tuottavilla ratkaisuilla. Tässä Osiossa käydään läpi tehtyä työtä ja parannusten vaikutusta.


Suunnitteluvaihe

Keväällä koronarajoutusten vallitessa yliopiston valmistusmenetelmät eivät olleet saatavilla, joten moni printterin osa tehtiin käsipelillä, jolloin myös jälki ja toleranssit vastasivat valmistustapaa. Päivitysten tekeminen printteriin alkoi kokonaisvaltaisella rungon osien suunnittelulla, jonka toteutin kesällä 2020 töiden lomassa vapaa-ajalla. Käytännössä kaikki kiinnikkeet, tukirakenteet, ohjurit ja muut rungon lisäosat suunnittelin tulostettavaksi yliopistolla, jossa kesätyö mahdollisti 3D-printterien käytön. Alumiiniprofiilista tehty perusrunko jäi ennalleen yhdessä tulostusalustan kanssa. Uudelleenrakennuksen päätavoitteena oli saada toteutettua jäykkä runkorakenne, minkä avulla tulosteeseen ei jäisi artifakteja esimerkiksi tärinästä. Toisena tavoitteena oli saada y- ja z-akseleille portaattomasti säädettävät rajakytkimet, jotta esimerkiksi suuttimen etäisyys tulostusalustasta on tarkasti ja helposti säädettävissä. x- ja y-akseleille tuli saada myös helposti käytettävät hihnakiristimet. Lisäksi x-akselin kelkka tuli suunnitella kokonaan uudelleen, koska alkuperäinen 'koronaratkaisu' oli kelvoton. Kelkan suunnitelussa huomioin erityisesti tukevan ja vakaan rakenteen ja printin jäähdytystuulettimen asennusmahdollisuuden. Muutoinkin suunnittelun ja uudelleenrakennuksen tarkoituksena oli maksimoida tulostuslaatu, etenkin verrattuna koronasulun aikaan soveltamalla toteutettuun printteriin. Alla renderöintejä printterin 3D-mallista. Muoviosat on kuvattu eri väreillä niiden version ja materiaalin mukaan.




Runkopalojen suunnittelu vei oikeastaan yhdestä kolmeen iterointikierrosta, sillä rakentaessa vastaan tuli asioita, joita suunnittelussa en osannut ottaa huomioon. Esimerkiksi x-akselin kelkkaa suunniteltaessa päästiin kolmaanteen versioon asti. Ensimmäisesessä versiossa pulttien suuntaa ei ollu mietitty, minkä vuoksi tulostuspään irroittamiseen tarvitsi purkaa koko kelkka. Toinen versio oli toimiva myös huollettavuudeltaan, mutta kelkkan liikkuessa rullien varassa siinä oli edelleen väljyyttä, eli se ei olut tarpeeksi vakaa. Tämä johtuu rullien valmistustarkkuudesta, eli niiden halkaisijat eivät aivan täsmää. Ongelma korjautui suunnittelemalla rullille kiristys. Tulosteen jäähdyttämiseen tarkoitettu suutinratkaisu sai myös kolmannen version, sillä ensimmäinen oli liian pieni ja toisessa pienoisessa kulmassa olevat ilmareiät osoittivat liikaa tulostuuspäätä kohti, ja siten jäähdyttivät sitä. Kolmas ratkaisu on hyvä muuten, mutta se on toispuoleinen, eikä kelkkaa olisi varaa enää leventää, ellei halua lyhentää X-akselin pituutta.


Yllä X-akselin kelkan versiot 2 ja 3 (tässä vasemmalla)

Jäähdytyssuuttimen versiot (v2 ja v3). Uudemmalla versiolla oli tilan käytön suhteen kannattava siirtää tulostuspää kelkan toiselle laidalle.

Myös esimerkiksi X-akselin kiinnityspalat, jotka samalla mahdollistavat akselin nostamisen, piti suunnitella toisen kerran. Tämä ei niinkään ollut rakenteellinen tai huoltamiseen liittyvä ongelma, vaan ongelma kumpusi tulostuslaadusta. Alkuperäisessä mallissa X-akselia nostavat kierretangot oli tuettu itse X-akseliin ainoastaan muttereilla. Koska kierretankoja pyörittävien moottoreiden linjausta on hyvin vaikea saada täysin kohdilleen, kierretangot pääsivät hieman heilumaan, mikä puolestaan teki koko X-akselista hieman epävakaamman ja aiheutti tulosteiden kylkeen toistuvan, siksakkimaisen kuvion. Tähän ongelmaan löytyi ratkaisu lisäämällä nostokelkkoihin linjaavat liukulaakerit ja laakeroimalla kierretangon yläpää paikalleen. Samalla kun uudet nostokelkat piti tulostaa, oli hyvä vaihtaa tulostusmateriaalia. Alun perin kelkat oli tulostettu PETG:stä, jolla on muunmuassa hyvä lämmönkesto, UV-valon sieto ja sitä oli mahdollista tulostaa koululla. Viimeiset versiot tulostin jo omalla printerillä ABS:stä, joka on jäykempää kuin PETG ja omaa vielä paremman lämpötilan keston. PETG:n pieni jousto vaikuttaa rungon jäykkyyteen, joten siitä tulostetut tukipalat piti tulostaa uudelleen.


(kuvia nostokelkan eroista)

Mekaniikasta

Koko tulostinprojektin ongelmallisin yksittäinen komponentti on alusta asti ollut itse tulostusalusta. Sen lisäksi, ettei se osteasssakaan ollut täysin tasomainen, se myös lämmetessään laajenee ja vääntyilee. Kuitenkin ensimmäinen vaihe Y-akselin parannuksessa oli päivittää tulostusalustan vaneriset liukupalat ja käsin pellistä tehty kiinnityslevy kunnollisiin ratkaisuihin. Näin ollen päädyin koneistamaan alumiinista kiinnityslevyn, johon hankin lineaarilaakerit. Myöhemmin päädyin vielä vaihtamaan lineaarilaakerit teflonisiin liukulaakereihin, sillä niistä ei aiheudu tärinää tulostusalustaan, toisin kuin kuulilla liikkuvista lineaarilaakereista. Liukulaakerit ovat myös hiljaisemmat.


 

Vasemmalta oikealle: Kiinnityslevyn koneistusta ja kierteistämistä; valmis kiinnityslevy; kulmatukia vaille valmis alakehikko; Y-akselin hihnakiristyksen periaate

Kuten ylempänä jo mainittiinkin, X-akselin kelkka vaati useamman iteraation. Suurin tulosuslaadun kannalta olennainen päivitys oli silti aidon E3D tulostuspään tilaaminen. Tulostuspäät ainakin lähetetään Britanniasta, missä ne luultavasti valmistetaankin. E3D:n aidot tulostuspäät ovat huomattavasti Kiinan kopioita laadukkaampia, sillä niiden koneistustarkkuus on parempi ja filamentin vastinpintojen pinnankarheus pienempi, minkä ansioista filamentti käyttäytyy paremmin suuttimessa. Monista Kiinasta tilatuista suuttimista olen myös löytänyt mikroskoopilla katsoessa riistetä ja koneistuslastuja, mitkä osin tai kokonaan tukkivat suuttimen ja tekevät siten niistä käyttökelvottomia.


Alkuperäisessä tulostinratkaisussa oli Z-akselin nostoruuveina käytetty tavallisia M8 kierretankoja, joiden liittämine moottoriin tehtiin itseporatulla kytkimellä. Ensinnäkin kierretanko oli huono vaihtoehto sen korkean kitkan ja mutterin väljyyden takia. Toisaalta kytkin ei ollut myöskään suora, eikä kehumista ollut senpuoleen moottorien kiinnitystavassa runkoon. Edellä mainitut ominaisuudet aiheuttivat tulosteiden kylkeen merkittävää sik-sak kuviota (Z-wobble), juuri kierretankojen nousun taajuudella, ja sen poistaminen osoittautui työläämmäksi kuin pelkästään kierretankojen vaihtaminen printterille tarkoitettuihin tankoihin messinkisine muttereineen. Kuten suunnitteluosiossa jo mainitsin, X-akselin nostekelkka tulostettiin uudelleen ja jo sillä laatu parani kohtalaisesti. Moottereihin kokeilin useampia eri kytkimiä eri tilanteissa, mutta lopulta päädyin takaisin kiinteisiin kytkimiin siinä vaiheessa kun Z-akselin uudet kierretangot muttereineen oli niin hyvin linjassa, ettei joustavia kytkimiä tarvittu. Z-akseli olikin hankala rakentaa, sillä huonolaatuiset messinkiset mutterit kierretangoille aiheuttivat tankojen heilumista. Toisaalta jos tangot pakotti linjaan, vino mutteri hirtti niihin kiinni. Vinolla mutterilla siis moottorin ja kierretangon väliin piti saada joustava kytkin, joka taas omalta osaltaan vaikutti Z-wobblen syntymiseen. Ongelma poistui vasta, kun lisäsin nostokelkkoihin linjaavat teflonlaakerit, laakeroin kierretangon yläpään, vaihdoin moottorin kytkimet kiinteisiin ja kierratangon mutterit POM-muovista valmistettuihin tarkkoihin muttereihin.

  

Vasemmalla valmiit Z-akselit. Oikealla voi nostokelkasta huomata vanhalla printteriversiolla tulostusjälkeen tulleen Z-wobblen

  • Z-wobble; linjauslaakerit, paremmat mutterit, pienempi toleranssi, yläpään laakerointi
  • X-akseli; damping, jäähdytys, tulostuspään vaihto, extruuderin putken vaihto
  • tulostusalusta


Elektroniikasta

  • virtalähdeongelma
  • RAMPsin liitinsula
  • korkeusanturi
  • jäähdytyksestä
  • lcd

Kalibroinnista

alustaongelmat

jerk-asetus

linear advance




















  • No labels
No files shared here yet.