From 9d4329114b0d90f73a2ff8c3223e2baf59043aed Mon Sep 17 00:00:00 2001 From: charlespick <17918019+charlespick@users.noreply.github.com> Date: Wed, 21 Jul 2021 14:17:45 -0700 Subject: [PATCH] docs: dual_carriage Added an STL for calibration, some gcode macros to the sample idex config, and an entire document on configuring an idex printer. Signed-off-by: Charles Pickering --- config/sample-idex.cfg | 56 +++++++++++++++++++ docs/Dual_Carriage.md | 98 +++++++++++++++++++++++++++++++++ docs/Overview.md | 2 + docs/img/separation-block.png | Bin 0 -> 17360 bytes docs/img/separation-lines.png | Bin 0 -> 21911 bytes docs/prints/calibrate_idex.stl | Bin 0 -> 2284 bytes 6 files changed, 156 insertions(+) create mode 100644 docs/Dual_Carriage.md create mode 100644 docs/img/separation-block.png create mode 100644 docs/img/separation-lines.png create mode 100644 docs/prints/calibrate_idex.stl diff --git a/config/sample-idex.cfg b/config/sample-idex.cfg index d6c70a2ffbe0..007bfd3c45d5 100644 --- a/config/sample-idex.cfg +++ b/config/sample-idex.cfg @@ -1,7 +1,13 @@ # This file contains a configuration snippet for a dual extruder # printer using dual carriages (an "IDEX" printer). +# The most common IDEX setup is to have 2 X carraiges, but 2 Y +# carraiges is also possible. You will need to update the macros +# and stepper definitions accordingly to do this. + # See docs/Config_Reference.md for a description of parameters. +# See docs/Dual_Carriage.md for further details on certain modules in +# this document. # Definition for the primary carriage (holding the primary extruder) [stepper_x] @@ -94,3 +100,53 @@ gcode: ACTIVATE_EXTRUDER EXTRUDER=extruder1 SET_DUAL_CARRIAGE CARRIAGE=1 SET_GCODE_OFFSET Y=15 + +[gcode_macro calibrate_separation] +# YOU MUST CALIBRATE YOUR ROTATION_DISTANCE BEFORE THIS IS USEFUL!!! +# Configure this to draw 2 line segments perpendicular to the dual_carraige axis +# that meet in the middle of the bed. Both lines should have the same coordinate +# on the axis of the dual_carraige. If they don't print inline, adjust your endstop +# settings. +gcode: + G28 + G90 + M83 + T0 ; test T0 + G1 X120 Y150 Z.2 F4800 + G1 Y75 E10 + T1 ; test T1 + G1 X120 Y0 Z.2 + G1 Y75 E10 + +# The following is for if your carraiges have their own part cooling fans. +# Since this macro overrides M106, you cannot also have a [fan] section defined. +# If your printer only has one part cooling fan, don't copy this section +[fan_generic part_fan_0] +pin: PE5 + +[fan_generic part_fan_1] +pin: PD13 + +[gcode_macro M106] +gcode: + {% if params.S is defined %} + {% set fanspeed = params.S|int %} + {% endif %} + {% if fanspeed < 0 %} + {% set fanspeed = 0 %} + {% endif %} + {% if fanspeed > 255 %} + {% set fanspeed = 255 %} + {% endif %} + {% if params.P is defined %} + {% if params.P|int == 0 %} + {% set target = "part_fan_0" %} + {% endif %} + {% if params.P|int == 1 %} + {% set target = "part_fan_1" %} + {% endif %} + {% else %} + {% set target = "part_fan_0" %} + {% endif %} + {% set internalSpeed = fanspeed / 255 %} + SET_FAN_SPEED FAN={target} SPEED={internalSpeed} diff --git a/docs/Dual_Carriage.md b/docs/Dual_Carriage.md new file mode 100644 index 000000000000..98c9af2c8017 --- /dev/null +++ b/docs/Dual_Carriage.md @@ -0,0 +1,98 @@ +This document provides **general** information on configuring and +calibrating a standard IDEX printer. Klipper has support for very +complex IDEX configurations, with multiple hotends and extruders on a +single carriage, independent or grouped cooling fans, and much more, +which are not covered in this document. + +# General configuration +Start with studying, and possibly using parts of the [example config](../config/sample-idex.cfg) +for IDEX printers. It has some distinct items that you may or may not +wish to use. +* Definition for `dual_carriage` on the X-axis, which you can change to +be on the Y axis if that is how your printer is configured. +* Sample macros for parking and switching toolheads. You should check +these to make sure they make sense for your setup and update the +position values with those that match your printer +* Configuration for multiple part cooling fans. The `[fan]` module in +Klipper only supports a single controllable fan. If you would like to +have independently controlled part cooling fans, do not configure a +`[fan]` section and use the template provided in the file. +* A macro for calibrating carriage separation described later in this +document. + +# Tuning +If you want to use both extruders to print different features of a +single object, Klipper will need to know the positions of the extruders +relative to each other. + +Because Klipper configures this by the endstop position, you will +need to calibrate your [rotation distance](Rotation_Distance.md) first. + +## Step 1 (~5mm) +Start by literally eyeballing it. Put a piece of tape on your bed or +use a line or other graphic already on your bed as a reference point. + +Move the first carriage to this point and note it's position on the +axis with both carriages. Then, park carriage 1, and move carriage 2 to +the same physical position. Note it's position (where Klipper "thinks" +it is) and calculate the difference. + +In a standard setup where the carriages home to the sides with the +primary on the left, you move the logical coordinate system for the +secondary extruder to the right by lowering it's `position_endstop` +value. + +Once you are within a few mm of accuracy, proceed to step 2 + +## Step 2 (~1mm) +Configure the `calibrate_separation` macro in [the sample config](../config/sample-idex.cfg) +for your bed size and dual_carriage axis, and add heating commands to +it for the filament you'll be using. + +Load filament in both extruders, and run the macro. + +The test with the standard axis configuration should look as follows: + +![measuring print](img/separation-lines.png) + +Note the lines should be colinear. If they are not, adjust your +`position_endstop` setting as noted in step 1. Once they are visually +aligned, proceed to step 3. + +## Step 3 (~0.05mm) +While the measuring process of this step accounts for symmetric +horizontal expansion, you will likely achieve better results by +calibrating the flow, temperature, and pressure advance for the +filament you'll be using first. You'll also do better with a filament +that is known to have better dimensional stability. Look for filaments +that can be printed without a heated bed. + +Use a slicer to generate g-code for the multi-part print found in +[docs/prints/calibrate_idex.stl](prints/calibrate_idex.stl). +Align the slot down the middle with the axis of your `dual_carriage`. +Configure your slicer to print the 2 parts using extruders on opposite +carriages. I highly recommend using identical filaments printed with +the same temperature, etc. Nothing else matters as long as the wall +quality is smooth. Print the object. + +Use calipers to measure the inner and outer distances as follows. +Average your inner and outer measurements, calculate the difference +from the nominal value (which is 40mm), and adjust your `position_endstop` +setting as noted in step 1. + +![measuring print](img/separation-block.png) + +# Next steps +At this point you should re-tune your mins and maxes for each axis when +the other is parked by issuing slow, small movements until they +collide. + +Configure a homing override to make sure that the inactive carriage is +fully parked in all scenarios. + +If you want to use [input shaping](Resonance_compensation.md), +calibrate the input shaper for each carriage separately and add g-code +to your `T0` and `T1` etc commands to configure the input shaper when +the active carriage changes. + +Print a few objects to ensure everything is working as expected! diff --git a/docs/Overview.md b/docs/Overview.md index 7d712433e971..832b39b1d0bd 100644 --- a/docs/Overview.md +++ b/docs/Overview.md @@ -52,6 +52,8 @@ communication with the Klipper developers. perfectly square. - [PWM tools](Using_PWM_Tools.md): Guide on how to use PWM controlled tools such as lasers or spindles. +- [IDEX printers](Dual_Carriage.md): Guide on setting up and calibrating + an IDEX printer. - [G-Codes](G-Codes.md): Information on commands supported by Klipper. ## Developer Documentation diff --git a/docs/img/separation-block.png b/docs/img/separation-block.png new file mode 100644 index 0000000000000000000000000000000000000000..31a94ddffceff90d149af9417f48ad9e0c059820 GIT binary patch literal 17360 zcmeIac{G)M_&%yMDrBrk!_GWLLS#r=GLw0Z2pLo6DV3sLWDX%DQ)U@56%A}jrcj2= z6(PwyoNM=8=bW|9TIaXUUuT^^&a>A0R^GjPp6Bzq@9Vy<>%Kp4h^D$CH5CgL1qB7Q z(gos03W}}$6ck&w@7ju=6n^^PjXwn1oja#_{i34$Q6+_QV#24z!~{eHg()bwBitfd z`G{JK?`2Qgz6oX_)mzdlQ@`Ub(z?>F*)Dp1`9-|fAC(r?g2gNCR=EyL9Af?gOM7~F z?K6U-r=m|4oo)3x-@<;~X(G9GeZWV3F?r9zh4WgWSB0{AA0MV!=`Xqd$LT!-jgd>6 zqKA%fX`7~PG7ROv-MW@H1Txh$TY0x=zIP&{n`+N zMY!O8#@eEJgNPIXb*AMGOKEzVn>9*3NxUNl2l?zwnPTHQQm@RBX8fMVNig)r+lBlZ zc06!r_wf6cZI`zlc$#7nzw^gy#e(Nq4`((7rpGDJr(|J`OEGwwWTj7TEZzi)+F!b?38GYor_zv_^vh|8u__s zXQ;i4w^qC5SC=xHyhS6O@Qn+)!wXjQW?`uoG$#6*<(gByGct-E`wU|WUfxME{T}%z z^ub_qn$0FRUyLmFWVg!&!|N0jg2&1KZ1K#Hb*G>>N})tNtK<3jSHFjxcK4>ttj8`3 zrH2CCyR!HXPHQPzS19CVWlRU&_xW7o(QkZ~aZ*r1%a}{&T35)f;Y-{{&k=h?qSiJf z)(6aGw!}y_GNp8zi*s>_a|Kt@+L#8aa^hYT6o)mn+$qVw*$6Tr2ZwLq|69ML=1lF- z$q6p4|FAWr*jOtjUVndAm%g?;pIqCE>ZhZ_Cf4O?yt$dFgT!WHZyrS!Rc(QZ>rn#V znHQS9d0C_t$?u(A-TLH@=X5686km?%zn|k!sx`vNoD|bfbu))zL;~;gYJVfg|N56F zz8oAJNAiwGHSu1guC*h7{E4sq=jY3|Nri=lQXbPf@|Wd89;z(mj!%AQ;c{6~im;IS*84FWI-5 z*J~SXSKyD{r*2TH>N3cj9EE2%i^(4WoRJj#^#0}foktwRdscL^CY*)&vbMv zD$&E=+tTYcH&)F9)^#IDr%#_&Qc{xkS(y5i+Q3!4e?`SpSkjncH%D8^StX z{BhB-u})vh9N*q&vgUjG>{)SsbYtU%cva4QyLhWY2FrhRWY&59PSefRGp%x8x3y+t zOFFI?wol8_a+qu0`FCj@kr46U5!rzc9~?#-BPuH^1`km93Pnam1+4twQc-Ch^j}r$ zb<94)AGa?eC1tS6V}_*HQ|)#A+BIQ1>nm5DJ$xZbZ_&8Nr>|eZgETcYRk{EA z*`Bc{Z8wE4ty!(_kKtkZLx&zee0TzH!ljYSU8NAie&)<$wrams_rY2}s@C!G@s*Vo zS6bm{?H9jq98x4ixV-N!FrR79Xznesd23ljpSX=;R=37?xxK6Fl-R=N;BsYYsZPkR zY|#SqI(22`;loaS71uhmw0LpTC=)etG0w=-_0nn<-}B0R<5-My6KHgOeiWSWasAMS>yZ)gn}|FpW3u0 z|N8Qx%5{v&C)jo?g|2b0=J2myzrKIZdc l3()X%NI#b&T&N0L~9E6VhCV-m&+< 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 literal 0 HcmV?d00001 diff --git a/docs/img/separation-lines.png b/docs/img/separation-lines.png new file mode 100644 index 0000000000000000000000000000000000000000..73064043a312103ddd00adb56c6127b36b30b349 GIT binary patch literal 21911 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 literal 0 HcmV?d00001 diff --git a/docs/prints/calibrate_idex.stl b/docs/prints/calibrate_idex.stl new file mode 100644 index 0000000000000000000000000000000000000000..b5baa3f9842bd7695ce72f0ed2ff2725768d2f86 GIT binary patch literal 2284 zcmb`HD^dhO5JX#W1OmN+kHMmeMR5bJfkyQy5U4c}I0B6zKyd`_fkRQRYjQfLcO(@I zThX0apRAfG<$vvb3ioqx@gC1*DYsXp>^@#!4!8KtmXq_M6EMG%68jj zx138W{LC>kYG#*;OSX637=fm`B`VIsvX4CmR~1IT@ow?yi3(FAev{F>Ss(AbGZGVo z_uLY0FzJRL)2wgLc+G13j|YaMey7=h85kVZ_zRVN`-Dn$yXwHhsu-C)QSD}$#~uSx zF$?ubei$0!E2Y#Ik_>ajhUV#l-8;`5&Ty1`P>Pg{R#6CysS=MXzwfSkU@nR!REsj@5aSPm3ywhm literal 0 HcmV?d00001