KINEMATIC ?
-
"Hi, I would like to ask how I should define the kinematics of the 3D printer shown in this image in the Duet configuration files. This appears to be a Dual Markforged IDEX style setup — which kinematic type should I choose for this?"
-
@rkutun See https://docs.duet3d.com/en/User_manual/Reference/Gcodes#m669-set-kinematics-type-and-kinematics-parameters
As @dc42 writes in https://forum.duet3d.com/post/296209 you will need to specify Cartesian or Mark Forged kinematics using the K parameter, then modify the matrix using the X Y Z and U parameters. You can also reference the MULDEX config at https://github.com/3dprintingworld/MULDEX/blob/master/Firmware/sys/config.g
-
@rkutun Hi, thanks a lot for your response!
I'm working on configuring a similar IDEX setup and I'm not completely sure how to define the correct kinematics and M669 parameters.
Would you be able to help if I share my config.g file? -
@dc42 help me please !!!
-
-
@droftarts config.g
I have checked and corrected my M584 and M569 settings as suggested, but the issue still persists. Currently, when I send movement commands to Tool 0 or Tool 1 individually, both move along with the Y axis. How can I resolve this? I would appreciate any help. -
@droftarts When I send the command G1 Y20 F3000, the Y axis moves in the positive direction, but at the same time Tool 1 (U axis) moves in the negative direction. I can't figure out what's causing this behavior. I'm ready to perform any tests you suggest — please help me.
-
@rkutun post your full config.g, and the response to M122. Post both as text, ideally within the code tags
</>
.Ian
-
m122 === Diagnostics === RepRapFirmware for Duet 3 MB6HC version 3.5.4 (2024-11-24 10:47:10) running on Duet 3 MB6HC v1.01 (SBC mode) Board ID: 08DJM-956L2-G43S8-6JTD0-3SS6K-9A1AH Used output buffers: 1 of 40 (17 max) === RTOS === Static ram: 155464 Dynamic ram: 90572 of which 5200 recycled Never used RAM 94684, free system stack 174 words Tasks: SBC(2,ready,0.9%,821) HEAT(3,nWait 6,0.0%,341) Move(4,nWait 6,0.0%,262) CanReceiv(6,nWait 1,0.0%,796) CanSender(5,nWait 7,0.0%,334) CanClock(7,delaying,0.0%,348) TMC(4,nWait 6,9.1%,53) MAIN(2,running,89.9%,101) IDLE(0,ready,0.0%,29), total 100.0% Owned mutexes: HTTP(MAIN) === Platform === Last reset 00:21:11 ago, cause: software Last software reset at 2025-04-15 13:53, reason: User, Gcodes spinning, available RAM 94828, slot 2 Software reset code 0x6003 HFSR 0x00000000 CFSR 0x00000000 ICSR 0x0044a000 BFAR 0x00000000 SP 0x00000000 Task SBC Freestk 0 n/a Error status: 0x00 MCU temperature: min 32.8, current 34.9, max 35.0 Supply voltage: min 24.1, current 24.1, max 24.1, under voltage events: 0, over voltage events: 0, power good: yes 12V rail voltage: min 12.2, current 12.2, max 12.3, under voltage events: 0 Heap OK, handles allocated/used 0/0, heap memory allocated/used/recyclable 0/0/0, gc cycles 0 Events: 1 queued, 1 completed Driver 0: standstill, SG min 0, mspos 8, reads 32473, writes 32 timeouts 0 Driver 1: standstill, SG min 0, mspos 8, reads 32473, writes 32 timeouts 0 Driver 2: standstill, SG min 0, mspos 8, reads 32473, writes 32 timeouts 0 Driver 3: standstill, SG min n/a, mspos 8, reads 32484, writes 21 timeouts 0 Driver 4: standstill, SG min 0, mspos 8, reads 32473, writes 32 timeouts 0 Driver 5: standstill, SG min n/a, mspos 8, reads 32495, writes 11 timeouts 0 Date/time: 2025-04-15 14:22:06 Slowest loop: 52.26ms; fastest: 0.06ms === Storage === Free file entries: 20 SD card 0 not detected, interface speed: 37.5MBytes/sec SD card longest read time 0.0ms, write time 0.0ms, max retries 0 === Move === DMs created 125, segments created 3, maxWait 407473ms, bed compensation in use: none, height map offset 0.000, max steps late 0, min interval 0, bad calcs 0, ebfmin 0.00, ebfmax 0.00 no step interrupt scheduled Moves shaped first try 0, on retry 0, too short 0, wrong shape 0, maybepossible 0 === DDARing 0 === Scheduled moves 4, completed 4, hiccups 0, stepErrors 0, LaErrors 0, Underruns [0, 0, 4], CDDA state -1 === DDARing 1 === Scheduled moves 0, completed 0, hiccups 0, stepErrors 0, LaErrors 0, Underruns [0, 0, 0], CDDA state -1 === Heat === Bed heaters 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1, chamber heaters -1 -1 -1 -1, ordering errs 0 === GCodes === Movement locks held by null, null HTTP* is doing "M122" in state(s) 0 Telnet is idle in state(s) 0 File is idle in state(s) 0 USB is idle in state(s) 0 Aux is idle in state(s) 0 Trigger* is idle in state(s) 0 Queue is idle in state(s) 0 LCD is idle in state(s) 0 SBC is idle in state(s) 0 Daemon is idle in state(s) 0 Aux2 is idle in state(s) 0 Autopause is idle in state(s) 0 File2 is idle in state(s) 0 Queue2 is idle in state(s) 0 Q0 segments left 0, axes/extruders owned 0x0000002 Code queue 0 is empty Q1 segments left 0, axes/extruders owned 0x0000000 Code queue 1 is empty === CAN === Messages queued 11467, received 25398, lost 0, errs 1, boc 0 Longest wait 1ms for reply type 6018, peak Tx sync delay 374, free buffers 50 (min 49), ts 6360/6359/0 Tx timeouts 0,0,0,0,0,0 === SBC interface === Transfer state: 5, failed transfers: 0, checksum errors: 0 RX/TX seq numbers: 49765/49765 SPI underruns 0, overruns 0 State: 5, disconnects: 0, timeouts: 0 total, 0 by SBC, IAP RAM available 0x24cfc Buffer RX/TX: 0/0-0, open files: 0 === Duet Control Server === Duet Control Server version 3.5.4 (2024-11-25 17:32:26, 64-bit) HTTP+Executed: > Executing M122 Code buffer space: 4096 Configured SPI speed: 8000000Hz, TfrRdy pin glitches: 0 Full transfers per second: 28.88, max time between full transfers: 43.9ms, max pin wait times: 29.7ms/4.4ms Codes per second: 0.23 Maximum length of RX/TX data transfers: 4376/896```
-
@droftarts config.g
; Configuration file for RepRapFirmware on Duet 3 Main Board 6HC ; executed by the firmware on start-up ; ; generated by RepRapFirmware Configuration Tool v3.5.8 on Fri Jan 03 2025 16:22:41 GMT+0300 (GMT+03:00) ; General G90 ; absolute coordinates M83 ; relative extruder moves M550 P"deneme" ; set hostname ; Wait a moment for the CAN expansion boards to become available G4 S2 ; LED Strips M950 E0 C"io6.out" T2 ; configure LED strip #0 ; Smart Drivers M569 P0.0 S1 D2 ; driver 0.0 goes forwards (X axis) M569 P0.1 S0 D2 ; driver 0.1 goes forwards (Y axis) M569 P0.2 S1 D2 ; driver 0.2 goes forwards (Y axis) M569 P0.4 S0 D2 ; driver 0.4 goes **backwards** (U axis) M569 P0.3 S1 D2 ; driver 0.3 goes forwards (Z axis) ;M569 P0.4 S1 D2 ; driver 0.4 goes forwards (U axis) M569 P1.0 S1 D2 ; driver 1.0 goes forwards (extruder 0) M569 P1.1 S1 D2 ; driver 1.1 goes forwards (extruder 1) ; Motor Idle Current Reduction M906 I30 ; set motor current idle factor M84 S30 ; set motor current idle timeout ; Axes M584 X0.0 Y0.1:0.2 Z0.3 U0.4; set axis mapping M350 U16 I0 ; configure microstepping without interpolation M350 X16 Y16 Z16 I1 ; configure microstepping with interpolation M906 X800 Y800 Z1000 U800 ; set axis driver currents M92 X80 Y80 Z400 U80 ; configure steps per mm M208 X0:200 Y0:200 Z0:200 U0:200 ; set minimum and maximum axis limits M566 X900 Y900 Z12 U900 ; set maximum instantaneous speed changes (mm/min) M203 X6000 Y6000 Z180 U6000 ; set maximum speeds (mm/min) M201 X500 Y500 Z20 U500 ; set accelerations (mm/s^2) ; Extruders M584 E1.0:1.1 ; set extruder mapping M350 E16:16 I1 ; configure microstepping with interpolation M906 E1000:1000 ; set extruder driver currents M92 E420:420 ; configure steps per mm M566 E120:120 ; set maximum instantaneous speed changes (mm/min) M203 E3600:3600 ; set maximum speeds (mm/min) M201 E250:250 ; set accelerations (mm/s^2) M563 P1 D1 H1 F4 ; Tool 1: E1 extruder, Hotend1, Fan4 (katman fanı) G10 P1 X35 Y0 Z0 ; Tool 1 nozzle offset (örnek: X ekseninde 35mm fark var) M568 P1 R0 S0 ; Tool 1 başlangıç sıcaklıkları (standby/active) ; Kinematics M669 K1 X1:0:0:0 Y1:-1:0:-1 Z0:0:1:0 U0:0:0:1; Matrix mapping for Axis - X:Y:Z:U ; Probes M558 K0 P9 C"io4.in" H5 F120 T6000 ; configure BLTouch probe via slot #0 G31 P500 X0 Y0 Z0.7 ; set Z probe trigger value, offset and trigger height M950 S0 C"io4.out" ; create servo #0 for BLtouch M950 S0 C"io7.out" Q500 ; Ekran parlaklığı analog çıkışı ; Endstops M574 X1 P"io0.in" S1 ; configure X axis endstop M574 Y1 P"io1.in" S1 ; configure Y axis endstop M574 Z2 P"io3.in" S1 ; configure Z axis endstop M574 U1 P"io2.in" S1 ; configure U axis endstop ; Mesh Bed Compensation M557 X25:175 Y25:175 S40:40 ; define grid for mesh bed compensation ; Sensors M308 S0 P"1.temp0" Y"thermistor" A"X Nozzle" T100000 B4725 C7.06e-8 ; configure sensor #0 M308 S1 P"1.temp1" Y"thermistor" A"Y Nozzle" T100000 B4725 C7.06e-8 ; configure sensor #1 M308 S2 P"temp0" Y"thermistor" A"Chamber" T100000 B4725 C7.06e-8 ; configure sensor #2 M308 S3 P"temp1" Y"thermistor" A"Bed" T100000 B4725 C7.06e-8 ; configure sensor #3 ; Heaters M950 H0 C"1.out0" T0 ; create heater #0 M143 H0 P0 T0 C0 S140 A0 ; configure heater monitor #0 for heater #0 M307 H0 R2.43 D5.5 E1.35 K0.56 B0 ; configure model of heater #0 M950 H1 C"1.out1" T1 ; create heater #1 M143 H1 P0 T1 C0 S285 A0 ; configure heater monitor #0 for heater #1 M307 H1 R2.43 D5.5 E1.35 K0.56 B0 ; configure model of heater #1 ; Heated beds M140 P0 H0 ; configure heated bed #0 ; Fans M950 F0 C"out1" ; create fan #0 M106 P0 C"Chamber 1" S0 B0.1 H2 T45 ; configure fan #0 M950 F1 C"out2" ; create fan #1 M106 P1 C"Chamber 2" S0 B0.1 H2 T45 ; configure fan #1 M950 F2 C"out3" ; create fan #2 M106 P2 C"E0 Hotend" S0 L0 X1 B0.1 ; configure fan #2 M950 F3 C"out4" ; create fan #3 M106 P3 C"E0 Layer" S0 L0 X1 B0.1 ; configure fan #3 M950 F4 C"1.out2" ; create fan #4 M106 P4 C"E1 Hotend" S0 L0 X1 B0.1 ; configure fan #4 M950 F5 C"1.out4" ; create fan #5 M106 P5 C"E1 Layer" S0 L0 X1 B0.1 ; configure fan #5 ; Tools M563 P0 D0 H1 F0 ; create tool #0 M568 P0 R0 S0 ; set initial tool #0 active and standby temperatures to 0C M950 J0 C"io5.in" ; io5.in pinini J0 tetikleyici olarak tanımla (inverted = NC buton için) M581 T0 P0 S1 R0 ; Trigger 0 → J0'dan gelen HIGH tetiklemesiyle her zaman çalışsın M582 T0 ; Açılışta tetikleyicinin mevcut durumunu kontrol et M551 P"reprap"
-
@rkutun I wonder if having the K1 in your M669 is doing something like overriding the axis parameters.
I wonder whether something like this might work.
M669 K0 ; - this would set X and Z to their defaults which is what you want M669 Y1:-1:0:-1 ; Then just override the Y
You might need the U parameter too in the 2nd line - but that might not be needed.
I've just set up a dual Markforged on one of the gantries on my printer - it's currently UV but I could change it to XY and see what your M669 does - I did mine in two lines.
-
@rkutun With the power off, if you move the Y axis in the positive direction, which direction do the X and U axis/tool move? If your machine is like the Muldex diagram in your first post, a positive move of the Y axis should move Tool 0/X axis in the negative direction, and Tool 1/U axis in the negative direction as well. So in M669, positive Y moves should be counteracted on X and U with positive moves, ie
M669 Y1:1:0:1
However, if your machine layout isn't exactly as the Muldex, the X and U axes may move in different directions. Either try the test with the machine off, or revert the axis mapping to cartesian (M669 K0), move Y+1, and see which way X and U move. Which ever way they move, they want to be set the opposite direction in M669 Y parameter, to counteract the Y movement. If you can't work it out, post a picture of the XYU axes, and label which axis/tool is which.
Also, in the notes for M669 https://docs.duet3d.com/User_manual/Reference/Gcodes#m669-set-kinematics-type-and-kinematics-parameters, it says:
... if you are using a modified matrix, it is best to fully specify the matrix to avoid confusion. If you fully override the matrix, the "K" parameter can be any of the linear K parameters.
So I would recommend setting the full M669, using K0 to start with (not K1 which is CoreXY):
M669 K0 X1:0:0:0 Y1:1:0:1 Z0:0:1:0 U0:0:0:1
Ian
-
@droftarts Thank you so much for your detailed and insightful explanation.
Your suggestion to move the Y axis manually with the power off helped me fully understand the kinematics of my machine. I hadn’t realized how important it was to observe the mechanical movement in this way.
Thanks to your clear explanation, I was able to confirm that both X and U tools move in the negative direction when Y moves positive, just as you described. That instantly made everything click, and I was able to correct the M669 matrix accordingly.
Brilliant advice — truly appreciated!
-
@rkutun Don't forget that you can just put M669 in by itself to see the results of any individual or combinations of M669's.
I just tried a few tests and my previous suggestion doesn't seem to apply.
Also worth doing some G1 H2's - to make sure each individual (pre Kinematic altered) motor moves in the correct direction. - If it doesn't then you can use the S parameter on M569 to correct any direction issues - which could just be due to wiring.
My Dual Markforged seems to be working more or less ok - although I did get some strange behaviour yesterday where some of the axis would occasionally jump back when I moved previous axis - I haven't been able to recreate the issue today.
-
@dwuk3d Thanks a lot for your helpful suggestions and follow-up!
Running M669 on its own was a great tip — it helped me clearly see how the kinematics matrix was being interpreted by the firmware.
Also, your advice to test each motor individually with G1 H2 was spot on. It made it much easier to confirm motor directions before diving into matrix adjustments. I also used M569 S to correct a direction mismatch I found during testing.
Appreciate you sharing your own experience with the Dual Markforged setup — it gave me confidence that I was on the right path.
Thanks again for taking the time to explain everything so clearly!
-
@rkutun Great, glad you got it sorted out.
I notice from your config.g you have only defined one tool so far. You will need to define the second tool too, with the U axis mapped to the X axis, using M563 X parameter. See https://docs.duet3d.com/en/User_manual/Machine_configuration/Configuration_IDEX#configuring-tools
Ian