Klipper op Ultimaker2+ Extended

MakerSpaceLeiden heeft een Ultimaker 2+ extended die hoog genoeg zou zijn om bijvoorbeeld een jongleerkegel op te kunnen printen1. Maar deze printer stond al een tijdje stil en eigenlijk op de nominatie om te verdwijnen (er zijn meer / andere printers2, en de MakerSpace verhuisde)

Tijd om eens Klipper op die Ultimaker te zetten dus. Met de input shaper daarvan kan de ultimaker behoorlijk snel printen met prima resultaat.

Een medemaker doneerde een Raspberry Pi 3B en zette daar MainsailOS op mbv Raspberry Pi Imager. Hij wil(de) graag weten hoe een printer om te zetten naar klipper. Ik heb eerder mijn leapfrog naar klipper omgezet, maar in die post leg ik niet echt uit hoe. Vandaar dit keer een soort howto, voor iedereen met die vraag.

In grote lijnen komt het neer op:

  1. Mainsail OS op Pi, volgens instructies https://docs.mainsail.xyz/mainsailos/getting-started/raspberry-pi/
  2. Klipper firmware in de Ultimaker flashen – Ga ik verderop op in
  3. configuratiebestand (printer.cfg). Er is een bestand voor een ‘gewone’ ultimaker als basis gebruikt3 om dit bestand 4te maken, ga ik verderop verder op in.
    • Exacte afmetingen van de printer instellen (Z-as hoogte, bed afmetingen)
    • PID tune voor de heater van de kop
    • Uiteraard Input Shaper ook tunen, want dat is waarom je klipper gebruikt
  4. De Raspberry Pi uit de printer voeden. (Optioneel, je kunt ook gewoon een eigen voeding gebruiken voor de Pi)
    • De Raspberry Pi zit gewoon via de USB aansluiting aangesloten. Bij inbouw in een printer is het eventueel ook mogelijk rechtstreeks de UART van de Pi aan de UART van de printer te verbinden, maar door via USB te werken hoeft er niets aan het printer-print gewijzigd te worden.
  5. Slicer-instellingen (er is een basisconfiguratie voor PrusaSlicer gemaakt, te vinden in deze git repository.)
  6. “Normaal” onderhoud als bed level etc.

Daarna kan er geprint worden, en kunnen de instellingen nog iteratief worden verbeterd.

Ik gebruik Linux, maar onder Windows zijn de stappen gelijkaardig. De “klipper stap voor stap gids” die ik hier vond, (lokaal kopietje tegen linkrot) werkt met Windows en kun je ook als hulp gebruiken. Het laden van de firmware in de printer is bij een Ultimaker wel anders, maar de gelinkte gids geeft een goed overzicht met screenshots van heel de rest van het proces.

Klipper Firmware in de Ultimaker flashen

Om dit te kunnen doen moet eerst Klipper/Mainsail lopen op de Pi en heb je SSH-toegang nodig, volg daartoe de instructies https://docs.mainsail.xyz/mainsailos/getting-started/raspberry-pi/

Plaats het printer.cfg bestand in de /home/username/printer_data/config/ map. Dat bestand verteld namelijk ook voor welke MCU de firmware gemaakt moet worden. (Het bestand moet printer.cfg heten)

Dat kun je doen door naar mainsail.local in je webbrowser te gaan, op “machine” te klikken, en het bestand5 te uploaden. (Het kan evt. ook met scp6, of door de SD kaart in je computer te stoppen en het bestand er op de juiste plek bij te zetten).

Dat configuratiebestand moet nog aangepast worden voor de individuele printer7. Om te beginnen moet er in komen te staan hoe de printer verbonden is. ssh daarom naar de pi en bekijk welke seriële interfaces er zijn:

ssh user@raspi.local
ls /dev/serial/by-id/*

Daarna kun je de naam van de seriële interface van de printer kopiëren en plakken in de [mcu] sectie van printer.cfg (Hetzij met nano ~/printer_data/printer.cfg, hetzij via mainsail als je dat makkelijker vindt).

[mcu]
serial: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0

Nu kun je de firmware maken. Doe daartoe een “make menuconfig” op de raspberry pi:

ssh user@raspi.local (Tenzij je vorige SSH-verbinding nog open is).
cd ~/klipper
export LC_ALL = C
make menuconfig

“export LC_ALL = C” voorkomt dat je een “unsuported locale” error krijgt: door de taal op C in te stellen (ipv op NL-nl of EN-us etc.). In Mainsail kan later via de tandwieltjes rechtsboven de echte taal (EN, NL, etc) gekozen worden.

Menuconfig geeft dan grafisch een menutje waar je de firmware kunt bouwen. De defaults zijn goed (er zit een Atmega2560 op het Ultimainboard).

Vervolgens zou “make flash” de gemaakte firmware moeten flashen, maar dat kent de bootloader van de Ultimaker niet. Dus probeerde ik het met AVRdude:

Dat werkte vanaf de Pi ook niet, dus besloot ik de firmware naar mijn computer te kopiëren en het vanaf daar te proberen.

De firmware staat in ~/klipper/out/klipper.elf, ik kopieerde het met scp8 en gebruikte AVRdude en mijn avr dragon om het in de printer te laden.

scp user@raspi.local:~/klipper/out/klipper.elf ~/klipper.elf

Je kunt de AVR-programmer ook op de Pi aansluiten en daar AVRdude gebruiken, zonder het bestand te kopiëren, en uiteraard kan het ook met een andere AVR programmer (“arduino as ISP”, USBASP, stk500, etc).

avrdude -p m2560 -U flash:w:klipper.elf -c YOUR_PROGRAMMER

Voor de volledigheid: de fuses stonden al goed, en zijn hfuse:d8 lfuse:ff, efuse:fd
Daar hoef je dus niks aan aan te passen.

Configuratie aanpassen

Als het gelukt is de firmware in de printer te laden kan klipper met de printer verbinden en zie je dat in Mainsail. Je krijgt dan mogelijk wat instructies de mainsail-basisconfiguratie te kopieren, volg die gewoon op.

Als de firmware wel in de printer geladen is, maar mainsail kan niet verbinden, pas dan de verbindingsinstellingen in printer.cfg aan. Het kan zijn dat de USB-interface een nieuw ID gekregen heeft.

[mcu]
serial: /dev/serial/by-id/hier-het-id-dat-jouw-printer-heeft


Er is nog wat meer printer-specifieke configuratie, te weten de Z-hoogte, een automatische PID-tune van de kop en een input shaper tune, en evt. pressure advance.

Pas de Z hoogte9 in het bestand aan op je individuele printer door de kop eerst te homen (Een ultimaker homed naar Z-max10) en daarna in stappen steeds lager te sturen tot je weet wat nul moet zijn voor (jo)uw specifieke printer. Als bij Z=12 bijvoorbeeld de kop reeds het bed raakt, moet de maximale Z lengte die in printer.cfg is ingesteld verlaagd worden met 12. Raakt bij 0 de kop het bed nog steeds niet, verhoog dan de maximale Z-lengte en probeer het nogmaals.
Let er op de kop niet “door” het bed heen te duwen, dan breekt het glas. Voel met een papiertje of voelermaatje, zoals ook bij handmatige bed leveling (tramming).

Zet de kop ergens “in de lucht”, dus niet op Z0, voordat je de automatische PID-tune van de heater start. Met PID_CALIBRATE HEATER=extruder TARGET=200 wordt de automatische PID tune gestart. Als deze klaar is geeft klipper aan hoe de gevonden instellingen op te slaan / deze worden automatisch in het printer.cfg bestand toegevoegd.

Het afstellen van de input shaper staat toegelicht op de klipper-website. Als je prusaslicer gebruikt kun je mijn slicer instellingen gebruiken, anders stel je de slicer in zoals op de klipper-website is toegelicht. Print het test-object, reken de frequenties uit11, en stel ze in in printer.cfg. De waarden in het voorbeeld zijn die van de MakerSpace printer en zullen dus bij elk ander exemplaar verschillen.

[input_shaper]
shaper_freq_x: 60.5
shaper_freq_y: 53.7
shaper_type: mzv


Na de input shaper kun je ook pressure advance tunen, op de Ultimaker van de MakerSpace gaf dat echter geen duidelijk resultaat in de Tuning Tower. Ook verschilt de mate van benodigde Pressure Advance voor elk type filament12. Dus in plaats van het in printer.cfg in te stellen, kun je het beter in je “filament gcode” van prusaslicer laten instellen13.

Raspberry Pi uit de printer voeden

De 24V voeding van de printer wordt ook gebruikt bij een Ultimaker met meerdere heaters / dual extruders. Dus daar is genoeg marge14 om bij een printer met 1 extruder de raspberry pi uit diezelfde voeding te voeden.

Op de Ultimainboard zit een fan-connector waarop de 24 V permanent beschikbaar is wanneer de printer aan staat. Op die connector kan een stepdown naar 5 V worden aangesloten om de raspberry Pi te voeden.

De stepdown die ik gebruik is een generiek MP1584 moduletje dat 3A zou moeten kunnen leveren. Ik voegde extra condensators toe aan de ingang en uitgang, typen die op de MakerSpace beschikbaar waren. De ingangscondensator heb ik later weer verwijderd omdat deze voor te grote inschakelstromen15 zorgde. Maar op de foto’s staat deze dus nog wel. De extra uitgangscondensator is 1000u/16V en deze bleef zitten.

De stepdown module is aangepast om 5 V te geven. In plaats van de potmeter te verstellen en te hopen dat deze niet verloopt, is de potmeter verwijderd en een 47k weerstand geplaatst. Dat geeft 5,3 V uit. (39k gaf 4,5 V en dat is te weinig)

Bij deze specifieke module zit de weerstand bij de gele pijl. Elke andere module die 5 V kan geven en iets van 2 A of meer is als alternatief bruikbaar16.

Op deze foto’s is te zien van welke fan connector de 24 V is afgenomen (de rood gemarkeerde draad is +). Verder ook hoe de stepdown op de raspberry Pi is aangesloten (Pin 2: 5V; pin 6: GND).

De raspberry pi is in een behuizing onder de printer gemonteerd, gebruik makend van een bestaand montagegat in de printer17.

Slicer instellen en printen

Eigenlijk waren de Slicer-instellingen al nodig om de input shaping af te stellen, dus je kunt nu gewoon gaan printen 😉

Als je mijn instellingen voor prusaslicer als startpunt wilt gebruiken voor je eigen instellingen kun je ze hier downloaden en in prusaslicer importeren via menu/import/config.

De klipper-website geeft advies over de slicer-instellingen. Voornamelijk kun je de snelheden wat verhogen (100 a 120 mm/s, behalve voor de onderste laag, kleine gaten, etc). Ook dienen alle presure-advance en input-shaper opties van de slicer uit te staan, omdat dat nu door Klipper gedaan wordt. Retract kan wel in de slicer ingesteld worden18.

Dit project heeft ook een projectpagina op de MakerSpace Wiki. En voor MakerSpace deelnemers die met de printer willen printen is er deze wikipage met een korte gebruikshandleiding.

Veel plezier met printen. Laat een reactie achter als er iets niet duidelijk is, dan kan ik deze tutorial aanvullen.

Voetnoten:

  1. De printer kan 310 mm hoog printen, een jongleerkegel is vaak ongeveer 52 cm hoog, maar het brede en smalle deel kunnen los van elkaar in verschillende materialen of kleuren geprint worden. ↩︎
  2. Een Ultimaker 3 extended die voorlopig origineel blijft, en een Bambulabs ↩︎
  3. De “gewone” Ultimaker heeft hetzelfde Ultimainboard, dus de pin definities etc. kwamen overeen en zijn op die manier overgenomen. Dingen als “Steps per mm” etc. zijn aangepast aan de mechanica van de Ultimaker 2+ Extended. ↩︎
  4. De nieuwste versie van dat bestand wordt bijgehouden in deze git repository. ↩︎
  5. Ik begon vanaf de configuratie voor een “gewone” Ultimaker en stel de resulterende configuratie hier beschikbaar. De aanpassingen die ik gemaakt heb zijn in de file aangegeven, maar als je het helemaal exact wilt zien doe je een diff. Als je het gewoon wilt gebruiken hoeft dat allemaal niet en hoef je alleen de dingen aan te passen die per individuele printer verschillen. Hernoem het bestand naar printer.cfg voor gebruik! ↩︎
  6. scp printerconfig.cfg user@raspi.local:~/printer_data/config/printer.cfg ↩︎
  7. Als het niet voor een Ultimaker 2+ extended is, moet je dus ook niet mijn bestand gebruiken, maar een bestand voor die specifieke printer. In klipper/config/ zijn voorbeeldbestanden voor veelgebruikte printers beschikbaar. ↩︎
  8. “scp msl@msl_mainsail1.local:~/klipper/out/klipper.elf ~/klipperfw.elf” ↩︎
  9. Is het geen Ultimaker 2+ extended waar je dit voor doet, dan is er meer configuratie aan te passen: Eerst rotation_distance van elke as, en daarna de maxima en minima. Is het een Ultimaker 2+ extended dan kun je mijn printer.cfg bestand als basis gebruiken en dan staan de rotation_distance van elke as al ingesteld, en is het vooral het maximum van de Z die per printer verschilt en dus ingesteld moet worden. ↩︎
  10. Wil je dit bij een andere printer tunen, en homed die naar Z-min, dan is het makkelijker de endstop zo af te stellen dat deze precies op het bed uitkomt. Dat is onafhankelijk van klipper en zou dus al gedaan moeten zijn als je een bestaande printer aanpast. Gebruik je in plaats daarvan een offset in software, dan kan dat in klipper uiteraard ook, maar mag je het lekker zelf uitzoeken 😉 ↩︎
  11. Je meet een N aantal golven (oscillaties). Je weet de printsnelheid (100mm/s) en je hebt zojuist de afstand gemeten. De frequentie laat zich dus uitrekenen als snelheid * afstand / aantal ↩︎
  12. En zelfs voor elke kleur van hetzelfde type ↩︎
  13. Of het equivalent daarvan in de Slicer die je gebruikt, als je een andere slicer gebruikt. Het is een gcode die naar de printer wordt gestuurd als je dit type filament geselecteerd hebt om mee te slicen. Het is dus niet de pressure-advance instelling in de slicer! De pressure advance van de slicer staat uit. Het is een gcode die een instelling aanpast in Klipper, per gekozen filament. Vergelijk met de tuning tower waar elke paar lagen de instelling gewijzigd wordt om de beste te vinden. ↩︎
  14. Een Raspberry Pi gebruikt minder dan de heater van de printkop. ↩︎
  15. Het was 2200 uF / 35V, de enige 35V elco die beschikbaar was, maar eigenlijk is 2200 uF absurd groot. Het laden ervan zorgt voor dusdanig veel inrush dat de 24V voeding van de printer niet lekker meer opkomt. Die condensator is dus weer verwijderd, maar staat nog op de foto’s. Negeer ‘m. ↩︎
  16. Maar indien het een instelbare module is: Zelf uitzoeken waar die weerstand zit en welke waarde in 5V uitgangsspanning resulteert. ↩︎
  17. Bij warm weer geeft de Pi overigens wel meldingen dat ‘ie thermisch begrenst is, dus misschien wil je wanneer je dit ook doet een grotere behuizing, een klein koelblokje, of zelfs een ventilatortje. ↩︎
  18. Sterker nog, dat is aan te bevelen, want het helpt tegen stringing. ↩︎


by

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *