Sovol SV08 Multiple Motion System Upgrade.
-
Having a few problems with Multiple motion system - I think I am going to need some @dc42 help.
On 3.5.4 - It works ok with some basic commands as below:
With both gantries moving in parallel in different directions ok.M595 Q1 P5 M595 Q0 P5 M596 P1 G90 G1 U100 F500 G1 U200 F500 G1 V300 F500 G1 V250 F500 M596 P0 G1 X200 F2000 G1 X100 F2000 M598 G1 Y20 F1000 G1 Y50 F1000 G1 X200 F2000 G1 X100 F2000
However Problems are:
- M598 does not seem to work - as the G1 Y20 F1000 just carries on - even though the U axis moves haven't completed.
- If I set the Queue size above 5 the motion in Queue 1 (M596 P1) - G1 moves goes haywire - just doing a G1 U1 for example moves the gantry to the back and beyond with a grating sound.
I noted that on the 3.6.0 beta4 notes that there is mention of some sort of M598 fix - so tried a firmware upgrade to that version.
Firstly this resulted in me somehow tanking my 6HC firmware completely so I had to erase and reset it back to 3.5.4, then I also messed up the Mini5+ firmware too somehow - so again had to erase and reset it.
Eventually got it working again, and managed to do the 3.6.0 Beta Change on all boards.
Problem then with 3.6.0 beta 4 - was:
-
My homeall.g sequence no longer worked - it seemed to just to X and Y then stop - so I had to individually home each axis.
Also The U & V axis homing didn't seem to move the same - I am using switches - but I wonder if there is some sort of hangover from when I tried to get it to work on sensorless (which I would still quite like to do) - as the ball probe alignment would probably now be good enough. -
I then kept getting messages about the U axis already being in use when I ran the test script that worked ok on 3.5.4 (apart from M598 and M595 issues).
So decided to revert back to 3.5.4 and ask for help.
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.10 on Wed Jan 29 2025 10:20:21 GMT+0000 (Greenwich Mean Time) ; General G90 ; absolute coordinates M83 ; relative extruder moves M550 P"Duet 3" ; set hostname ; Network M552 P0.0.0.0 S1 ; configure Ethernet adapter M586 P0 S1 ; configure HTTP M586 P1 S1 ; configure FTP ; Wait a moment for the CAN expansion boards to become available G4 S2 ; Smart Drivers M569 P0.0 S1 D2 ; driver 0.0 goes forwards (Z axis) M569 P0.1 S1 D2 ; driver 0.1 goes forwards (Z axis) M569 P0.2 S0 D2 ; driver 0.2 goes backwards (Z axis) M569 P0.3 S1 D2 ; driver 0.3 goes forwards (X axis) M569 P0.4 S0 D2 ; driver 0.4 goes backwards (Y axis) M569 P0.5 S0 D2 ; driver 0.5 goes backwards (Z axis) M569 P1.0 S0 D3 V2000 ; driver 1.0 goes backwards (U axis) M569 P1.1 S0 D3 V2000 ; driver 1.1 goes backwards (V axis) M569 P1.2 S1 D2 ; driver 1.2 goes forwards (A axis) M569 P1.3 S1 D3 ; Z-hopper 1 M569 P1.4 S1 D3 ; Z-hopper 2 M569 P121.0 S0 D2 ; driver 121.0 goes backwards (extruder 0) M569 P122.0 S0 D2 ; driver 122.0 goes backwards (extruder 1) ; Motor Idle Current Reduction M906 I30 ; set motor current idle factor M84 S30 ; set motor current idle timeout ; Axes M584 X0.3 Y0.4 Z0.1:0.2:0.0:0.5 U1.0 V1.1 A1.2 B1.3 C1.4; set axis mapping M350 X16 Y16 Z16 U16 V16 A16 B16 C16 I1 ; configure microstepping with interpolation M906 X800 Y800 Z800 U800 V800 A800 B150 C50 ; set axis driver currents M92 X80 Y80 Z533.33 U80 V80 A533 B629 C629 ; configure steps per mm if exists(global.vMin) == false global vMin = 120 global vMax = 330 global yMin = -5 global yMax = 210 M208 X0:315 Y-5:210 Z0:300 U35:350 V120:330 A0:300 B0:3 C0:3 ; set minimum and maximum axis limits M566 X12000 Y12000 Z3000 U6000 V6000 A3000 B1000 C1000 ; set maximum instantaneous speed changes (mm/min) M203 X42000 Y42000 Z3000 U21000 V21000 A3000 B1000 C1000 ; set maximum speeds (mm/min) M201 X500 Y500 Z20 U250 V250 A20 B20 C20 ; set accelerations (mm/s^2) ; Extruders M584 E121.0:122.0 ; set extruder mapping M350 E16:16 I1 ; configure microstepping with interpolation M906 E800:800 ; set extruder driver currents M92 E492:492 ; 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) ; Kinematics M669 K8 ; configure CoreXYUV kinematics ; Probes M558 K0 P8 C"121.io1.in" H5 F1200 T18000 ; configure unfiltered digital probe via slot #0 G31 P500 X-17 Y10 Z2.55 ; set Z probe trigger value, offset and trigger height M558 K1 P8 C"122.io1.in" H5 F1200 T18000 ; configure unfiltered digital probe via slot #1 G31 P500 X-17 Y10 Z2.55 ; set Z probe trigger value, offset and trigger height M558 K2 P8 C"!121.io2.in" H1 F300 T300 ; configure unfiltered digital probe via slot #2 M558 K3 P8 C"io3.in" H1 F300 F300; Ball Probe ; Endstops M574 X1 S3 ; configure X axis endstop M574 Y1 S3 ; configure Y axis endstop M574 Z1 S2 K0; configure Z axis endstop M574 U2 P"!122.io0.in" S1 ; configure U axis endstop M574 V2 P"!122.io2.in" S1 ; configure V axis endstop M574 A1 P"1.io0.in" S1 ; configure A axis endstop M574 B1 S2 K2 ; Sensors M308 S0 P"temp0" Y"thermistor" A"Heated Bed" T100000 B4725 C7.06e-8 ; configure sensor #0 M308 S1 P"121.temp0" Y"thermistor" A"Nozzle" T110000 B4487 C6.95777e-8 ; configure sensor #1 M308 S2 P"122.temp0" Y"thermistor" A"Nozzle2" T110000 B4487 C6.95777e-8 ; configure sensor #2 ; Heaters M950 H0 C"out0" T0 ; create heater #0 M143 H0 P0 T0 C0 S105 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"121.out0" T1 ; create heater #1 M143 H1 P0 T1 C0 S305 A0 ; configure heater monitor #0 for heater #1 M307 H1 R2.43 D5.5 E1.35 K0.56 B0 ; configure model of heater #1 M950 H2 C"122.out0" T2 ; create heater #2 M143 H2 P0 T1 C0 S305 A0 ; configure heater monitor #0 for heater #2 M307 H2 R2.43 D5.5 E1.35 K0.56 B0 ; configure model of heater #2 ; Heated beds M140 P0 H0 ; configure heated bed #0 ; Fans M950 F0 C"121.out2+out2.tach" ; create fan #0 M106 P0 S0 L0 X1 B0.1 ; configure fan #0 M950 F1 C"121.out1+out1.tach" ; create fan #1 M106 P1 C"Hotend" S0 B0.1 H1 T45 ; configure fan #1 M950 F2 C"122.out2+out2.tach" ; create fan #2 M106 P2 C"E2Cool" S0 L0 X1 B0.1 ; configure fan #2 M950 F3 C"122.out1+out1.tach" ; create fan #3 M106 P3 C"Hotend2" S0 B0.1 H2 T45 ; configure fan #3 ; Tools M563 P0 D0 H1 F0 ; create tool #0 M568 P0 R0 S0 ; set initial tool #0 active and standby temperatures to 0C M563 P1 D1 H2 F2 ; create tool #1 M568 P1 R0 S0 ; set initial tool #1 active and standby temperatures to 0C ; Miscellaneous ; Custom settings M915 X Y U V R0 F0 M671 X410:-60:-60:410 Y420:-10:420:-10 S7 M307 H1 R7.427 K0.701:0.030 D1.50 E1.35 S1.00 B0 V24.5 M307 H2 R7.020 K0.857:0.148 D1.65 E1.35 S1.00 B0 V24.0 M307 H0 R0.527 K0.163:0.000 D5.70 E1.35 S1.00 B0 M557 X0:200 Y0:220 S20 M950 S1 C"122.io0.out" M280 P1 S60 ;M42 P1 S0 ; Allow movement without homing ;M564 S0 H0 ; Tools ;Tool T1 - 2nd Gantry as X and Y M563 P1 D1 H2 X3 Y4 F1 G10 P1 X0 Y0 U0 V0 S0 R0 ; T2 - duplicate mode M563 P2 D0:1 H1:2 X0:3 Y1:4 F0:1 G10 P2 X0 Y0 U0 V-150 S0 R0 M567 P2 E1:1 M568 P2 S1 ; Backlash compensation M425 U0.1 V0.1 S1
-
@dwuk It would be good to work out why homing was not working as expected in 3.6beta4. Where have been a lot of changes between 3.5.4 and 3.6 so the release notes may explain why. If not then please share your U and V homing files so we can have a look at those.
-
-
Your homeu for reference (please use code blocks for these file, it makes it easier for people, especially on phones):
;echo "homeU disabled" ;M99 ; homeu.g ; called to home the U axis M569 P1.0 S0 D3 V500 ; driver 1.0 goes backwards (U axis) M569 P1.1 S0 D3 V500 ; driver 1.1 goes backwards (V axis) ; ; generated by RepRapFirmware Configuration Tool v3.5.10 on Thu Jan 23 2025 15:02:10 GMT+0000 (Greenwich Mean Time) ;M913 U40 V40 ;M400 ; increase Z G91 ; relative positioning if exists(param.Z) ;G1 H2 Z{param.Z} F6000 else G1 H2 Z5 F6000; move Z relative to current position to avoid dragging nozzle over the bed G1 H2 V10 U-10 M400 G90 ; absolute positioning ; home U G91 ; relative positioning var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm G1 H1 U{var.maxTravel} F8000 ; coarse home in the +U direction G1 U-5 F6000 ; move back 5mm G1 H1 U{var.maxTravel} F3000 ; fine home in the +U direction G90 ; absolute positioning ; decrease Z again G91 ; relative positioning ;G1 H2 Z-5 F6000 ; move Z relative to current position G90 ; absolute positioning ;M400 ;M913 U100 V100 ;M400 M569 P1.0 S0 D3 V2000 ; driver 1.0 goes backwards (U axis) M569 P1.1 S0 D3 V2000 ; driver 1.1 goes backwards (V axis)
you are setting U and V configurations in home U. I would remove the references to V in home U.
This is an issue:
var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm
given U is not axis 0. It probably working if U and X are the same length though.Also you are lifting Z but not returning it (that may not be an issue)
I see you are switching the speed of switch from stealthChop to to spreadCycle mode during homing. and the U and V are in stealthchop while the other axes are in spreadCycle so i expect thats the route of the issue/different behaviour.
Try getting everything working in spreadCycle and then explore sensor less homing
-
@T3P3Tony Thanks for the comments.
Had another go on 3.6.0.beta4
With the following motor settings:
;M569 P1.0 S0 D3 V2000 ; driver 1.0 goes backwards (U axis) ;M569 P1.1 S0 D3 V2000 ; driver 1.1 goes backwards (V axis) M569 P1.0 S0 D2; driver 1.0 goes backwards (U axis) M569 P1.1 S0 D2 ; driver 1.1 goes backwards (V axis)
And the following homeU
G91 ; relative positioning if exists(param.Z) ;G1 H2 Z{param.Z} F6000 else G1 H2 Z5 F6000; move Z relative to current position to avoid dragging nozzle over the bed ; G1 H2 V10 U-10 F6000 M400 ; var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm G1 H1 U{var.maxTravel} F8000 ; coarse home in the +U direction M400 G1 U-5 F6000 ; move back 5mm M400 G1 H1 U{var.maxTravel} F3000 ; fine home in the +U direction G90 ; absolute positioning
And homeV
G91 ; relative positioning if exists(param.Z) ;G1 H2 Z{param.Z} F6000 else G1 H2 Z5 F6000; move Z relative to current position to avoid dragging nozzle over the bed var maxU = move.axes[4].max - 5 G90 ; absolute positioning G1 U345 ; home V G91 ; relative positioning var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far V can travel plus 5mm G1 H1 V{var.maxTravel} F6000 ; coarse home in the +V direction G1 V-5 F6000 ; move back 5mm G1 H1 V{var.maxTravel} F7000 ; fine home in the +V direction G90 ; absolute positioning ; decrease Z again G91 ; relative positioning ;G1 H2 Z-5 F6000 ; move Z relative to current position G1 V-10 U-10 G90 ; absolute positioning
Results were:
On 3.6.0b4 the U and V axis (which are on the toolboard mode Mini5+) are moving - but are unresponsive - they don't move instantly like they do on 3.5.4 (went back and rechecked), and the two stage homing takes quite a while to get to the 2nd stage. (unlike 3.5.4 where it is instant).Also the V Axis homing sometimes misses the end stop (which is at the back right) - probably due to slow reaction too - when I use HomeAll.
Also when you just use the button's to move the U & V - they don't react instantly - so I am wondering where there is some sort of comms issue in 3.6.0b4 - as I don't notice this in 3.5.4
X&Y (which are directly connected to the 6HC) still seem ok on 3.6.0b4
Also I am still getting the issue with not being able to access the U axes within M596 P1 - which doesn't occur in 3.5.4
Tried doing the homing within M596 P1 for U&V. and M596 P0 for X&Y - and that failed because Z was then stuck in P1 - and couldn't be accessed in P0.
In response to your points:
"you are setting U and V configurations in home U. I would remove the references to V in home U."- Would be good if I could - the main reason it is there is that in my current microswitch based design the V axis switch gets knocked sideways if the U axis tries to home when V is too far to the back.
"This is an issue:
var maxTravel = move.axes[0].max - move.axes[0].min + 5 ; calculate how far X can travel plus 5mm
given U is not axis 0. It probably working if U and X are the same length though."- Agreed that is an issue which I will correct - however as I have set the minimum for U at 30 - then it is slightly shorter than X - so the end stop will still hit.
"Also you are lifting Z but not returning it (that may not be an issue)"
- Agreed need to tidy up Z lifting
"I see you are switching the speed of switch from stealthChop to to spreadCycle mode during homing. and the U and V are in stealthchop while the other axes are in spreadCycle so i expect thats the route of the issue/different behaviour."
- Removed the settings in config.g - tried both modes - but still got the slow reaction problem in 3.6.0b4 - and still works fine with the new settings in 3.5.4
"Try getting everything working in spreadCycle and then explore sensor less homing"
I've switched back to 3.5.4 again for now - as the slow response of U and V on 3.6.0b4 are I think too much of an issue. I could try a different version - to which beta version it starts to appear. -
@dwuk Further update; @T3P3Tony
Tried with 3.6.0b3 - same issue with slow response of U&V
Tried reverting just the Mini5+ to 3.5.3 - that seems to remove the issue.So for me both 3.6.0 beta versions are not working with a FD connected Mini5+
Also on 3.6.0b3 (with 3.5.3 Mini5+) I get the same issue with not being able to access the U axis within M596 P1. - where's with exactly the same macro's and homing sequences I can with 3.5.3
Will go back to 3.6.4b4 again (with both 3.5.3 on the Mini5+) to see if I can work out a sequence that allows me to access the U axis from the 2nd motion system.
-
@dwuk Further update - got access to the U axis in 3.6.0b4 by surrounding all accesses to it - including in the homing with M596 P1 before and M596 P0 after.
M598 still not working though, plus my Mini5+ is still on 3.5.4.
-
Short Video showing both heads in motion.
I can't get synchronisation working yet - so not ready to print more than one layer - but nice to at least see the print heads moving independently.
-
Jay and Andy - this is the thread with more detailed info about my issues @gloomyandy @jay_s_uk
I've got a converted SV08 with a 6HC main board (for Z,X,Y) and Mini5+ as tool board (for UV and Z Hoppers), and then 1LC boards for the extruders.
The system currently has 2 gantries and 2 extruders - but I am aiming to make both of the gantries IDEX once I have got the basic system working.
I'm aiming to parallel print with up to 4 heads at the same time - initially using a GCODE post processor to split each layer into segments that can be printed in parallel.
-
Horrible print quality I know because I didn't get the Z height quite right on the back gantry, plus it seems to have come loose a bit, plus had to comment out two lines of Gcode out due to Multiple Motion System gantry conflicts - which is why I think the front gantry print messed out.
Also had to manually set temperatures as haven't properly programmed them into the tool changing macros.
But still this is my first dual head, 4 segment print.
With the post processor created segment boundary crossing the 45 square on the back gantry.
-
@dwuk Still looking good for a first attempt. I guess you had mesh levelling off?
Maybe try to dial in each toolhead independently with unaltered single-head gcode. When both work OK on their own, let them cooperate. -
@o_lampe thanks. It was a pretty poor quality first test I agree, but it was nice to see both heads actually printing something independently.
The rear head had come quite loose which is why the lines are a bit curved- so I have upgraded the bolts that hold the two linear rails together.
Also I had specified ABS instead of PLA in the material profile in Orcaslicer which explains why the extruders kept wanting to go up to 260 and the bed was hotter than it usually is.
Will look at mesh levelling fairly soon.
Will do another attempt in the next couple of days once I have made some corrections to the parallel print gcode post processor.
Won't be able to get beyond layer2 though until I have resolved my RRF MMS M598 sync issue.
I tried working around it with conditional rrf gcode with loops and dwells - but haven't found a reliable way to get the motion systems to wait for each other yet.
-
@dwuk said in Sovol SV08 Multiple Motion System Upgrade.:
Also when you just use the button's to move the U & V - they don't react instantly - so I am wondering where there is some sort of comms issue in 3.6.0b4 - as I don't notice this in 3.5.4
There are known synchronisation issues in 3.6beta releases including beta 4 when a main board is used in expansion mode. These have now been resolved.
-
@dc42 great - look forward to getting access to the fixed version.
The biggest issue that leaves me with is that I can't seem to get M598 to work in any version I have tried.
I am sending commands in the sequence
M596 P1
G1....setA
M596 P0
G1...setB
M598
G1...setC (with or without M596 P0)When SetB is faster than SetA - I am finding setC moves start before setA moves are complete -which is not the behaviour I was hoping for.
-
undefined dwuk referenced this topic
-
@dc42 Update - solved my M598 not working issue hopefully.
So far (apart from the poor quality test print) I have been running all my tests with the gcode. M569/G1/M598 sequences in macro's - that I have been executing standalone.
I noticed that in the documentation it mentions something about macro's only using one stream.
Thought I would try downloading the macro, and then re-uploading it as a job.
Doing this completely changed the behaviour - and in my first few tests it looks like now the M598's seem to be doing what I wanted - i.e. Gantries waiting for each other, things that shouldn't be running in parallel waiting for each other.
So will change to using jobs rather than macro's for all of my future tests.
Also using this approach I have been able to get M597 to accept numbers as high as 30 without the motion all getting messed up - like it did in earlier tests when I went above 6.
However I am not sure whether this is due to the macro vs job differences, or the fact that my system is currently set as V3.6.0b4 on all boards (other than the Mini5+ - that is still on 3.5.4 due to the slow motion issue).
-
@dwuk said in Sovol SV08 Multiple Motion System Upgrade.:
I noticed that in the documentation it mentions something about macro's only using one stream.
Do you mean this setion? https://docs.duet3d.com/en/User_manual/RepRapFirmware/Multiple_motion_systems#macros-and-motion-systems
I'm not sure if this is changed behaviour between 3.5 and 3.6, or at least how it deals with multiple motion within macros may have changed, as you say it was working in 3.5. I'll check with @dc42.
Ian
-
@droftarts Yes I think it was that section.
What I think is happening is if you run a macro from DWC then it seems to ignore M598's - this happens I think on 3.5.4 and 3.6.0b4. M596's work as expected though in this mode.
The difference I have noticed between 3.5.4 and 3.6.0b4 - is relating to releasing Axis.
In 3.5.4 Axis seem to not be held after M400's (or the ignored M598's I presume).Whereas with 3.6.0b4 I can't so far find a way of releasing an Axis once is has been allocated to motion system by a M596. Neither M598's run from DWC or from Jobs seem to release the Axis - which I am managing to work around for now by doing the homing within M596's.
But this will probably be a problem when I want to do things like layers with part IDEX duplicate mode and part independent Axis printing.
I haven't investigated M400s - but I suspect I have the same issue with them.
I am wondering whether I can work around it somehow by swapping motors between Axis,
-
Having quite a lot of trouble with getting parallel moves working - on 5.6.0b4
If I only have a small number of G1's then they run in parallel ok, but as soon as I introduce more than 5 moves then only the last 5 seem to run in parallel.
For example if I send 10 moves to motion system 0, plus 5 to motion system 1, then it seems that the motion system 1 moves will not start until there are only 5 moves left on the motion system 0 queue.
I have tried lots of combinations of P,R and S values M597 values on both queues - but it doesn't seem to make any difference to when the queue 1 start to run in parallel.
It also doesn't seem to be a speed or time related - because changing the speed of the last 5 moves in queue 0 also exhibits the same behaviour.
I guess I could do some complex processing on the two streams to work out their likely move times and then try and present them in tiny little blocks - but that is not the way I was expecting things to work.
What I have like to be able to do is ideally have a whole 'segment' (probably about 1/4 the size of the print bed) sent to motion system 0, in parallel to another 'segment' sent to motion system 1 - which could be 100s of G0/G1/G2/G3s running in parallel.
Have tried to understand the code - but it is quite complicated.
My only discoveries so far is that it looks like the M597 P value defaults to 60 on both queues - not 3 on queue1 as per documentation. Also I can't see anywhere that the S value is processed.
Example very simple job attached.
if move.axes[0].homed == false || move.axes[1].homed == false || move.axes[2].homed == false || move.axes[3].homed == false || move.axes[4].homed == false G28 T0 G1 Y20 X100 G5000 M400 M596 P0 G1 Y10 F500 G1 X100 F500 G1 Y20 F500 G1 X150 F500 G1 Y30 F500 G1 X160 F500 G1 Y40 F500 G1 X170 F500 G1 Y50 F500 ;First Parallel Move G1 X180 F500 G1 Y60 F500 G1 X190 F500 G1 Y70 F500 M596 P1 G1 U100 F5000 G1 U200 F5000 M596 P0 G1 Y20 F10000 G1 Y50 F10000 G1 X200 F5000 G1 X300 F5000 M596 P1 G1 U120 F5000 G1 U200 F5000 G1 V300 F5000 M598 M400 M596 P0
I this example Gantry0 does the first 8 moves by itself, with gantry1 only starting to move in parallel to the last 5 moves. If I change the number of moves in the first block then the parallel start moves back or forward - so that only the last 5 moves are done in parallel.
The 2nd two small blocks of moves run in parallel ok.
-
Demo of slightly parallel print.
https://youtube.com/shorts/02D4zS33ymk?si=yqVuzbFA2yzvwQvO
The red and white segments should be both printing at the same time - but as per 1m50s into video - the white only comes in about 5 moves from the end of the Red.
The GCODE file consisted for M569 P1, Red Segment 1, M569 P0, White Segment1 etc.
Work needed I know on parking and restart priming - but still fairly pleased with the slightly overlapping segments.