Duet3D Logo Duet3D
    • Tags
    • Documentation
    • Order
    • Register
    • Login

    Sovol SV08 Multiple Motion System Upgrade.

    Scheduled Pinned Locked Moved
    My Duet controlled machine
    8
    272
    39.2k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • dwuk3dundefined
      dwuk3d
      last edited by

      Better demo of parallel colour/material changes - some changes as quick as 2 seconds.

      Still more work to do - but synchronisation getting closer.

      Using preheat G10's to kicking off the Pre Heat, delay, final heat, priming, tool change.

      Demo here.

      https://youtu.be/uk7KTCqrujg
      2F9F385E-12C0-4647-9F90-BBB57768B5B6_1_201_a.jpeg

      Tool change macro getting pretty complicated....

      ;changeFilament.g
      ;M98 P"0:/macros/changeFilament.g" A{previous_extruder} B{new_filament_temp} L{layer_num} F{first_layer_temperature} N{next_extruder} H{first_layer_height}
      echo {state.thisInput},"changeFilament"
      
      
      
      if exists(global.primeLayer) == false
          global primeLayer = {-2,-2}
      
      ;if exists(param.A) && param.A == 0
      ;    M98.1 A"parkXY.g"
      
      ;if exists(param.A) && param.A == 1
         ; M98.1 A"parkUV.g"
      
      if exists(param.H)
          G1 Z{param.H} F500
      
      if exists(param.N) && param.N == 0
          
          M596.1 P1
          T0
          echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
          while heat.heaters[1].active < 200
              G4 P500
              ;echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
      
          ;echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 200"
          ;var start = state.upTime
          ;M116 P{param.N}
          ;echo {state.thisInput},"step 1 heat up time",{floor(state.upTime-var.start)},"s"
      
          ;**** Calculate delay
          var delayT = global.preHeatT  
          echo {state.thisInput},"delayT initial",var.delayT
          if exists(param.L) && param.L <= 0
              if global.primeLayer[param.N] < param.L 
                  set var.delayT = var.delayT - global.primeTime0*2
              
          if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
               set var.delayT = var.delayT - global.primeTime0
      
          echo {state.thisInput},"delayT with prime",var.delayT
      
          ; post delay heatup
          var lastR = sensors.analog[param.N+1].lastReading
          if var.lastR < 200
              set var.delayT = var.delayT - ((220-200)/global.degSec)
              if (200-var.lastR)/global.degSec > var.delayT
                  set var.delayT = var.delayT - ((200-var.lastR)/global.degSec - var.delayT)
      
          echo {state.thisInput},"delayT with heatup",var.delayT
          ;set var.delayT = var.delayT - 1
      
      
          if var.delayT <= 0 
              echo {state.thisInput},"SYNC not enough time to parallel tool change",floor(-var.delayT*10+0.5)/10,"secs short"
          else
              if  heat.heaters[2].active < 200
                  echo {state.thisInput},"SYNC - other motion system not active - so no need to wait"
              else
                  echo {state.thisInput},"SYNC - wait for",floor(var.delayT*10+0.5)/10,"secs"
                  G4 P{floor(var.delayT*1000)}
              
      
          M568 P0 S220 R220
          ;echo {state.thisInput},"heat up step2"
          var start = state.upTime+state.msUpTime/1000
          var startReading = sensors.analog[param.N+1].lastReading
          echo {state.thisInput},"M116 P0 from ",{sensors.analog[param.N+1].lastReading}," to 220"
          M116 P0
      
          var delayFurther = false
          if heat.heaters[2].active > 199
              set var.delayFurther = true
         
          while sensors.analog[param.N+1].lastReading < 219
              M568 P0 S220 R220
              G4 P500
          echo {state.thisInput},"step2 heat up time",{(state.upTime+state.msUpTime/1000-var.start)},"s",{sensors.analog[param.N+1].lastReading},"temp",{(sensors.analog[param.N+1].lastReading-var.startReading)/(state.upTime+state.msUpTime/1000-var.start)},"deg/sec"
          if exists(param.L) && param.L <= 0
              if global.primeLayer[param.N] < param.L
                  M98.1 A"clean T0"
                  M801 X40 Y5 T0 S10  ; Prime
                  M801 X40 Y5 T0 S10 ; Prime
                  set global.primeLayer[param.N] =  param.L
          if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
              M801 X40 Y5 T0 S10 ; Prime
              set global.primeLayer[param.N] =  param.L
      
      
          set global.T0Clean = false
          var timeC = state.upTime+state.msUpTime/1000
          while global.uvParked = false ; move.axes[4].machinePosition <290
              G4 P500
              M400
          echo {state.thisInput},"Waited for uv to be parked ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
      
      
          set global.xyParked = false
          echo {state.thisInput},"finished changeFilament"
      
      if exists(param.N) && param.N == 1
          
          M596.1 P0
          T1
          
          echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
          while heat.heaters[2].active < 200
              G4 P500
              ;echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
      
          ;echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 200"
          ;var start = state.upTime
          ;M116 P{param.N}
          ;echo {state.thisInput},"step 1 heat up time",{floor(state.upTime-var.start)},"s"
           ;**** Calculate delay
          var delayT = global.preHeatT 
          echo {state.thisInput},"delayT initial",var.delayT
          if exists(param.L) && param.L <= 0
              if global.primeLayer[param.N] < param.L 
                  set var.delayT = var.delayT - global.primeTime1*2
              
          if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
               set var.delayT = var.delayT - global.primeTime1
          echo {state.thisInput},"delayT with prime",var.delayT
          ; post delay heatup
          var lastR = sensors.analog[param.N+1].lastReading
          if var.lastR < 200
              set var.delayT = var.delayT - ((220-200)/global.degSec)
              if (200-var.lastR)/global.degSec > var.delayT
                  set var.delayT = var.delayT - ((200-var.lastR)/global.degSec - var.delayT)
          echo {state.thisInput},"delayT with heatup",var.delayT
      
          ;set var.delayT = var.delayT - 1
      
      
          if var.delayT <= 0 
              echo {state.thisInput},"SYNC not enough time to parallel tool change",-var.delayT,"secs short"
          else
              if  heat.heaters[2].active < 200
                  echo {state.thisInput},"SYNC - other motion system not active - so no need to wait"
              else
                  echo {state.thisInput},"SYNC - wait for",var.delayT,"secs"
                  G4 P{floor(var.delayT*1000)}
      
      
          M568 P1 S220 R220
          ;echo {state.thisInput},"heat up step2"
          var start = state.upTime+state.msUpTime/1000
          var startReading = sensors.analog[param.N+1].lastReading
          echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 220"
          M116 P1
          
          while sensors.analog[param.N+1].lastReading < 220
              M568 P1 S220 R220
              G4 P500
          echo {state.thisInput},"step2 heat up time",{(state.upTime+state.msUpTime/1000-var.start)},"s",{sensors.analog[param.N+1].lastReading},"temp",{(sensors.analog[param.N+1].lastReading-var.startReading)/(state.upTime+state.msUpTime/1000-var.start)},"deg/sec"
      
          var delayFurther = false
          if heat.heaters[1].active > 199
              set var.delayFurther = true
      
      
          if exists(param.L) && param.L <= 0
      
              
              if global.primeLayer[param.N] < param.L
                  M98.1 A"clean T1"
                  T1
                  M801 U50 V315 T1 S10 ; Prime
                  M801 U50 V315 T1 S10 ; Prime
                  set global.primeLayer[param.N] =  param.L
      
          if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
              M801 U50 V315 T1 S10 ; Prime
              set global.primeLayer[param.N] =  param.L
      
      
      
      
          set global.T1Clean = false
          var timeC = state.upTime+state.msUpTime/1000
      
          ;echo {state.thisInput},"M598 started"
          ;M598
          ;M400
          ;echo {state.thisInput},"M598 waited for ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
          set var.timeC = state.upTime+state.msUpTime/1000
          while global.xyParked = false ; move.axes[1].machinePosition > 25
              G4 P500
              M400
          echo {state.thisInput},"waited for xy to be parked ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
      
          set global.uvParked = false
      
      
          echo {state.thisInput},"finished changeFilament"
      
      
      
      1 Reply Last reply Reply Quote 1
      • dwuk3dundefined
        dwuk3d
        last edited by dwuk3d

        Test post

        <table>
        <thead>
        <tr>
        <th>Header</th>
        <th>Another Header</th>
        </tr>
        </thead>
        <tbody>
        <tr>
        <td>field 1</td>
        <td>value one</td>
        </tr>
        </tbody>
        </table>

        # * bolded text

        droftartsundefined 1 Reply Last reply Reply Quote 0
        • droftartsundefined
          droftarts administrators @dwuk3d
          last edited by

          @dwuk3d You can't do html tables in the forum, but you can do markdown tables, eg the following text:

          | Column 1      | Column 2      |
          | ------------- | ------------- |
          | Cell 1, Row 1 | Cell 2, Row 1 |
          | Cell 1, Row 2 | Cell 1, Row 2 |
          

          creates this:

          Column 1 Column 2
          Cell 1, Row 1 Cell 2, Row 1
          Cell 1, Row 2 Cell 1, Row 2

          Ian

          Bed-slinger - Mini5+ WiFi/1LC | RRP Fisher v1 - D2 WiFi | Polargraph - D2 WiFi | TronXY X5S - 6HC/Roto | CNC router - 6HC | Tractus3D T1250 - D2 Eth

          dwuk3dundefined 1 Reply Last reply Reply Quote 0
          • dwuk3dundefined
            dwuk3d @droftarts
            last edited by dwuk3d

            @droftarts Great thanks - couldn't find that in the documentation.

            That makes things really easy - as I can just copy a table over from the TeachingTech discourse where I have started to build it up- might put this in a separate thread - but I am trying to build up a list of different colour changer options - mainly to compare them with my solution.

            Re my Dual Gantry timings - I think if I change the polling frequency down from about 0.05 seconds, and kick off my tool move within about 0.06 seconds of the parking move of the other tool then I can get my tool changes down to about 0.1 secs.

            Multi Colour/Filament Solution Comparison

            Tool Timing Link Waste Reliability (DW view) Colours Multi Material Base printer speed (DW view) Parent
            Mosaic Palette 2/3 ~ 90 s 2020 H L 4-8 1 None
            X1C AMS + Flush into object ~ 120 s 2023 L H 4-16 7 MMU2
            X1C AMS - off bed flushing ~ 90 s 2023 H H 4-16 8 MMU2
            X1C AMS no prime tower ~90 s 2023 H M 4-16 8 MMU2
            A1 AMS Lite- off bed flushing ~90 s 2023 H H 4 7 MMU1
            Creality K2plus CFS ~90 s 2025 H M 4-16 9 AMS
            Other X1C AMS clones ~90 s 2025 H M 4-16 AMS
            Box Turtle ~ 75 s 2024 H M 4 AMS
            Klipper OpenAMS - BL AMS electronics upgrade ~90 s 2024 H M 4 AMS
            ERCF ~ 80 s 2023 H L 4-16 8 MMU2
            TriColourMendel 10s - 60s 2013 L M 3 3 1 None
            Prusa MMU1 ~70 s 2016 H L 4 4 None
            Prusa MMU2 ~70 s 2018 H L 5 4 MMU1
            Ryper MMU2 Clone ~70s 2022 H L 10 6 MMU2
            Prusa MMU3 ~70 s 2023 H M 5 6 MMU2
            PICO MMU ~70 s 2024 H M 4 6 MMU2
            CoPrint Chroma AMS Lite Type Addon ~60 s 2024 H M 4-16 AMS Lite
            3d Chameleon AMS Lite type add-on ~ 60s 2023 H M 4+ MMU2
            Other 3rd party AMS/3rd party offerings ~90s H L AMS
            Filament Star rotating toolchanger ~60 s 2023 H L 4+ Y
            TeachingTech SV08 Stealth changer ~ 60 s 2025 L M 6-8 Y 8 E3D
            Misschanger Stealthchanger ~ 40 s 2025 L M 6-8 Y E3D
            H2D AMS2 pro ~ 90 s 2025 H H 4-28 2 8 AMS
            H2D between nozzles ~ 26 s 2025 L H 4-28 2 8 AMS + DualX
            E3D toolchanger ~ 30 s 2021 L M 2-5 Y None
            Prusa XL ~ 14 s 2024 L H 2-5 Y 6 E3D
            Nozzle changer (engineers grow) ~ 20 s 2024 L M 2-10 Y XL + Swapper3d
            Nozzle changer (Matti / @mvaar) ~ 20 s 2024 L M 2-10 Y XL + Swapper3d
            Virtual Colours Hueforge etc Any 2020 2022 2023 L H 20+ N/A Any Lithopane
            PolyDye - That inkjet colouring thing you featured on an ender printer. ~? s 2024 L M infinite 3
            Flashforge CJ270 Full Colour Resin Printer ~?s 2024 2026 L H Infinite N/A 7 - 2.5mm/hour
            EufyMake E1 UV printer ~?s 2025 L H Infinite N/A 5mm Max Height
            Bigbrains3d Swapper3d nozzle changer ~ 90 s 2023 H M 2-20 Y 3 MMU2
            Bondtech INDX 12-17 s 2025 L H 2-10+ Y XL + Swapper3d
            Conventional IDEX (with and without preheat) ~ 10 s - 60s 2018 L H 2 2 5
            Conventional IDEX with box turtle on each toolhead (or ratrig IDEX/RMMU) ~10s - 90s 2021 H M 5-8 2
            Ratrig Toolshift IDEX - without priming <1 s - 10s 2024 L M 2 2 8 IDEX
            Nathan Builds Robots 4 headed rotary printer < 10s 2024 L M 4 Y 15+
            ukdw3d SV08 - Dual Gantry RRF parallel Bondtech INDX e < 0.5s - 17s 2026 L M 11+ Y 15+ INDX
            ukdw3d SV08 - Dual gantry/dual IDEX RRF <0.5 s - 10s 2025 L M 4 Y 15+ IDEX + Dueling Zero
            1 Reply Last reply Reply Quote 0
            • dwuk3dundefined
              dwuk3d
              last edited by dwuk3d

              Been dusting off some maths knowledge today to try and more accurately position my print head over the top of the camera after auto aligning with the ball probe.

              A7039D04-80CD-4B60-B53E-3EC8EFAFB59B_1_105_c.jpeg

              Firstly used a few captured nozzle probe and manually aligned readings, plus some measurements of the distance of the probe and camera from the servo pivot point to try and work out the XY coordinates of the servo pivot point.

              With a bit of trial and error I found some numbers that worked

              4C00C0AC-A9BE-48BA-9EE6-26393C501621.png

              Then wrote this macro to calculate the camera position from ball probed UV coordinates - really please to see SIN/COS/ASIN/ACOS functions available...

              ;cameraFromUV.g
              
              M98 P"0:/macros/ParkXY.g"
              
              
              
              
              ;probe U 251.3187 offset U -13.6500092 probe V 202.1375 offset V 41.20003
              ;probe U 251.0562 offset U -14.2998352 probe V 199.4344 offset V 41.00005
              ;probe U 250.8687 offset U -14.7497253 probe V 197.4219 offset V 40.84999
              ;probe U 250.8938 offset U -14.6997528 probe V 197.5125 offset V 40.85002
              ;probe U 250.8000 offset U -15.0500336 probe V 196.2250 offset V 40.80002
              ;probe U 250.9875 offset U -14.4999847 probe V 198.0063 offset V 40.89999
              ;
              
              
              
              ;G1 U251.4 V202.8 F10000
              var uPos = global.ballProbeU+14.5
              var vPos = global.ballProbeV-40.9
              
              var servoX = 427.9
              var servoY = 188.3
              var probePosRadius = 177
              var cameraPosRadius = 165
              var cameraOffsetAngle = 14
              
              var probeAngle = degrees(asin((global.ballProbeV-var.servoY)/var.probePosRadius))
              
              if var.probeAngle < 90
                  set var.probeAngle = 180 - var.probeAngle
              
              var cameraX = var.servoX + var.cameraPosRadius * cos(radians(var.probeAngle+var.cameraOffsetAngle))
              var cameraY = var.servoY + var.cameraPosRadius * sin(radians(var.probeAngle+var.cameraOffsetAngle))
              
              
              echo "U",global.ballProbeU,"V",global.ballProbeV,"angle",var.probeAngle,"cX",var.cameraX,"cY",var.cameraY
              
              if var.cameraX > 200 && var.cameraX < 300 && var.cameraY > 140 && var.cameraY < 200
                  set var.uPos = var.cameraX
                  set var.vPos = var.cameraY
              else
                  abort "cameraFromUV.g - suspect camera calculations"
                  
              
              if exists(global.savedU) == false
                  global savedU = -1
                  global savedV = -1
              
              set global.savedU = var.uPos
              set global.savedV = var.vPos
              
              
              
              
              
              
              G1 U{var.uPos} V{var.vPos}  F10000
              
              if exists(global.servo5Off) && global.servo5Off > 0
                  set global.servo5Off = state.upTime + 120
              if exists(global.magnetOff) && global.magnetOff > 0
                  set global.magnetOff = state.upTime + 120
              
                  
              

              results pretty good - all photos are auto alignment and direct move to the camera

              Notice the benefits of a camera over a ball probe in first photo - where the ball probe misaligned due to dirty nozzle.

              CD349ED4-4B6A-4E43-B6DE-409E440201D6.png D53B73F8-6BB3-467D-904D-2E66897DA56B.jpeg

              UV
              E80FAC17-028F-4E14-B55C-F5DFA7F070F6.png
              XY after cleaning
              DBF28CF1-BFE1-4B81-9F4D-D7622581E1C7.png

              1 Reply Last reply Reply Quote 0
              • dwuk3dundefined
                dwuk3d
                last edited by dwuk3d

                Sub second tool change demo.
                9B2A37E2-08C3-420C-AA5B-EA6AF182917D.png

                o_lampeundefined 1 Reply Last reply Reply Quote 0
                • o_lampeundefined
                  o_lampe @dwuk3d
                  last edited by

                  @dwuk3d As long as the belts along the crossbeam aren't aligned properly you won't see accurate positions anywhere else on the bed.
                  But it's good to have the theory behind alignement solved.

                  dwuk3dundefined 1 Reply Last reply Reply Quote 0
                  • dwuk3dundefined
                    dwuk3d @o_lampe
                    last edited by

                    @o_lampe yes - probably need to properly align belts in next stage.

                    I'm also thinking of trying the probe at some different angles to see whether the alignments of the two gantries are the same with the probe at different places on the bed.

                    I quite like the look of the new BambuLab H2D special alignment print bed - using camera's on the print head to read tiny qr codes at pre determined places.

                    1 Reply Last reply Reply Quote 0
                    • dwuk3dundefined
                      dwuk3d
                      last edited by dwuk3d

                      Made a start on IDEX motor and pulley mount (above side gantry supports) - will hold the idler at the back from the top took and introduce a tensioning system.

                      Zip Ties just temporary until I have the new top of gantry belt coupling.

                      Will have a mirror of the motor mount and idler on the other side.

                      The new motors at the front on each side will take over the Y axis movement - with the existing X & Y used for one print head each on the rear gantry.

                      Also tidied up extruders a bit and created top cover for 1LC boards.

                      IMG_7175.jpeg IMG_7176.jpeg

                      1 Reply Last reply Reply Quote 0
                      • dwuk3dundefined
                        dwuk3d
                        last edited by

                        starting to think about my occasionally moving bed phase.

                        My original idea for an occasionally moving bed was to allow for the printing of longer thin objects.

                        But my experience of even printing fairly small object is that the area where both print heads can access without hitting each other is quite restricted - so I think even the current size 350x350 bed moving maybe only 150mm would give some quite big benefits with very little overhang outside of the main printer body.

                        I think though that I want to go to 350 x 500 or even 350 x 550 - so that when parked the bed still fits nicely within the main printer size - but also allows for ships like the one shown (at 1:500 scale model) to be printed in one go.

                        Another interesting concept when thinking about ships - is the bow - which overhangs - that doesn't need a build plate under it - so would be an interesting concept having a print going completely beyond the build surface.
                        IMG_7181.jpeg

                        o_lampeundefined 1 Reply Last reply Reply Quote 1
                        • o_lampeundefined
                          o_lampe @dwuk3d
                          last edited by o_lampe

                          @dwuk3d In the end we'll see a conveyor belt bed with dozends of tools heads zipping around simultaneously... 😳
                          But seriously: you could do the same split_the object_trick in a big scale manner.

                          • Build two independent printers with 4 heads each
                          • place them above the looong conveyor belt with a certain gap
                          • print parts 1 + 3
                          • move the belt and print part 2 + 4
                          • move back and repeat
                          dwuk3dundefined 1 Reply Last reply Reply Quote 0
                          • dwuk3dundefined
                            dwuk3d
                            last edited by

                            My response to Advantages and disadvantages of Dual Gantry over IDEX and Tool changers as asked by @MostlyMessingAbout

                            Advantages of Dual Gantry over IDEX

                            1. Additional degree of freedom in Y Axis - allows for parallel printing of different shaped parts or whole objects (if independent Z hopping also available). - up to doubling print speeds.
                            2. Allows Parallel priming and wiping during tool changes - which can push tool change times from >10 seconds down to <1 second
                            3. Only having one head on each gantry means faster speeds possible in the Y direction in particular - which can be an issue with IDEX
                            4. When used in combination with IDEX can allow up to 4 toolheads which can all print in parallel for some parts of large prints. - which could increase print speeds by over 50% more.
                            5. Print head can access the whole X axis

                            Disadvantages of Dual Gantry over IDEX

                            1. Increased complexity of belt routing
                            2. Slicers don’t currently support parallel printing - so post processing of GCODE required
                            3. Print heads cannot individually access the whole Y axis
                            4. The front gantry and print head can block the view of the rear gantry.

                            Advantages of Dual Gantry over Tool changing

                            1. Parallel printing - up to doubling print speeds.
                            2. Allows Parallel priming and wiping during gantry or tool changes - which can push tool change times from >17 seconds down to <1 second
                            3. When used in combination with IDEX can allow up to 4 toolheads which can all print in parallel for some parts of large prints. - which could increase print speeds by over 50% more.
                            4. When used in combination with tool changing would allow extremely fast tool changes if the tool changes occur between the two gantries
                            5. Less equipment sitting around not being used 90% of the time.

                            Disadvantages of Dual Gantry over Tool changing

                            1. Increased complexity of belt routing
                            2. More motors if using a Nozzle changer tool changer
                            3. Slicers don’t currently support parallel printing - so post processing of GCODE required
                            4. Print heads cannot individually access the whole Y axis
                            5. The front gantry and print head can block the view of the rear gantry.

                            In response to question from @JavierHernandez-bj5hz asking where the Quad head design will be CoreXYUVAB

                            The current 2 head dual gantry implementation is already CoreXYUV, with AB added on for independent Z lifting.

                            When I move to 4 head IDEX I will be changing the kinematics of each Gantry over from CoreXY to Dual Markforged - So I guess it will be something like Double , Dual Markforged, Might be Better to call it Quad Markforged I suppose/

                            In terms of AXIS it will have Z0, X1,Z1,Y,X2,Z2, U1,Z3,V,U2,Z4.
                            Which in RRF will be XYZUVABCDEF.

                            Then just to add to the complication - the next phase after IDEX is 'occasionally moving bed' - which will add a additional larger Y axis movement capability - so will then be
                            Z0, X1,Z1,Y,X2,Z2, U1,Z3,V,U2,Z4, Y2

, Which in RRF will be XYZUVABCDEFG

                            o_lampeundefined bricobotundefined 2 Replies Last reply Reply Quote 1
                            • dwuk3dundefined
                              dwuk3d @o_lampe
                              last edited by

                              @o_lampe If you look at some of my earlier video's you might see something like that.

                              Interestingly if I do end up with a fairly long bed - maybe 600 or 700 mm - then I might have to consider getting a 2nd SV08 and bolting it on the front - which as you said could have 4 heads of its own.

                              Might get out of hand though.

                              I think I will probably stop at 3 heads for a while - so that I can see how beneficial adding the 3rd IDEX head really is in real life situations.

                              I would though really think something like an Orangestorm Giga (with the 1m x 1m x 1m). Could really benefit from 3 gantries with 2 or 3 heads on each, or maybe even 4 gantries with 2-4 heads on each.

                              There was a good example in this video of printing a coffee table - where the 4 legs could be printed in parallel quite easily.
                              Screenshot 2025-04-12 at 16.50.14.png

                              1 Reply Last reply Reply Quote 0
                              • o_lampeundefined
                                o_lampe @dwuk3d
                                last edited by o_lampe

                                @dwuk3d said in Sovol SV08 Multiple Motion System Upgrade.:

                                Z0, X1,Z1,Y,X2,Z2, U1,Z3,V,U2,Z4, Y2

, Which in RRF will be XYZUVABCDEFG

                                Just call it Alphabet kinematics , because there aren't many unused letters left 😉

                                1 Reply Last reply Reply Quote 1
                                • bricobotundefined
                                  bricobot @dwuk3d
                                  last edited by bricobot

                                  @dwuk3d said in Sovol SV08 Multiple Motion System Upgrade.:

                                  In response to question from @JavierHernandez-bj5hz asking where the Quad head design will be CoreXYUVAB

                                  The current 2 head dual gantry implementation is already CoreXYUV, with AB added on for independent Z lifting.

                                  When I move to 4 head IDEX I will be changing the kinematics of each Gantry over from CoreXY to Dual Markforged - So I guess it will be something like Double , Dual Markforged, Might be Better to call it Quad Markforged I suppose/

                                  In terms of AXIS it will have Z0, X1,Z1,Y,X2,Z2, U1,Z3,V,U2,Z4.
                                  Which in RRF will be XYZUVABCDEF.

                                  Then just to add to the complication - the next phase after IDEX is 'occasionally moving bed' - which will add a additional larger Y axis movement capability - so will then be
                                  Z0, X1,Z1,Y,X2,Z2, U1,Z3,V,U2,Z4, Y2

, Which in RRF will be XYZUVABCDEFG

                                  Thanks David, I called it TotalPnP QuadMarkForged. I not design a 3D printer,actually I design desktop SMT (PCBA) machines. And I have some interesting ideas with this.

                                  So, would duplicating the Dual Markforged IDEX kinematics be enough?

                                  What do you think about using GT2 50T timing pulley instance 20T timing pulley in motors? I have been using it like this in both Y and X for years with Nema17 60mm in cartesian machine and it has worked well for me. You lose a little torque but you gain some speed, and since they are 60mm there is still enough torque to work well.

                                  Best regards

                                  Javier Hernandez

                                  dwuk3dundefined 1 Reply Last reply Reply Quote 0
                                  • dwuk3dundefined
                                    dwuk3d @bricobot
                                    last edited by

                                    @bricobot not sure about 50t - I guess having two motors on the dual Markforged Y axis does mean there should be plenty of torque - so I could look at increasing speed.

                                    What i would like to do is get close to SV08 standard single head speeds - which I think is fairly quick -but then double or triple this with parallel printing.

                                    Then make colour changes between 10 and 100x quicker than any non parallel printer.

                                    1 Reply Last reply Reply Quote 1
                                    • dwuk3dundefined
                                      dwuk3d
                                      last edited by

                                      Rear gantry IDEX all belted and motor'd up - just need wiring and software now - plus rebuilding of 3rd extruder

                                      IMG_7199.jpeg

                                      IMG_7200.jpeg

                                      1 Reply Last reply Reply Quote 1
                                      • dwuk3dundefined
                                        dwuk3d
                                        last edited by dwuk3d

                                        IDEX on rear gantry moving OK.

                                        I've wired up the two extra Y motors as the C Axis - by then used M669's to convert that over to be the V axis

                                        To move the V axis - you need to move the two new motors, plus also the two existing U + V motors.

                                        I thought it was going to be tricky - but seems to be working surprisingly well.

                                        Will have to do something about independently homing the two new V axis motors - to make sure that the gantry is properly at 90 degrees.

                                        But overall quite happy so far - just need to build the 3rd extruder now and add few end stops - before working on the homing macro's + alignment etc.

                                        IMG_7207.jpeg

                                        ; 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 P1.3 S1 D2 ; driver 0.5 goes backwards (Z axis) - changed to 1.3 forwards
                                        ;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)
                                        M569 P1.4 S0 D2 ; Z-hopper 2
                                        M569 P0.5 S1 D2 ; Z-hopper 1
                                        M569 P1.5 S0 D2 ; VH Axis Left
                                        M569 P1.6 S1 D2 ; VH Axis Right
                                        
                                        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:1.3 U1.0 V1.1 A1.4 B0.5 C1.5:1.6; set axis mapping
                                        M350 X16 Y16 Z16 U16 V16 A16 B16 C16 I1 ; configure microstepping with interpolation
                                        M906 X800 Y800 Z800 U800 V800 A750 B150 C800 ; set axis driver currents
                                        ; A - 1.8 degree, 0.7mm pitch - 200*16/0.7 = 4571
                                        ; A - 1.8 degree, 1mm pitch - 200*16 = 3200
                                        M92 X80 Y80 Z533.33 U80 V80 A3200 B629 C80  ; configure steps per mm
                                        if exists(global.vMin) == false
                                            global vMin = 120
                                            global vMax = 340
                                            global yMin = -5
                                            global yMax = 210
                                        M208 X-5:310 Y-5:210 Z0:300 U3:326 V120:334.7 A0:3 B0:3 C120:334.7; set minimum and maximum axis limits
                                        
                                        M566 X540 Y540 Z100 U540 V540 A500 B300 C540 ; set maximum instantaneous speed changes (mm/min)
                                        M203 X{350*60} Y{350*60} Z{25*60} U{350*60} V{350*60} A1000 B200 C{350*60} ; set maximum speeds (mm/min)
                                        
                                        M201 X2000 Y2000 Z500 U2000 V2000 A1000 B20  C2000 ; 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 E{30*60}:{30*60} ; set maximum speeds (mm/min)
                                        M201 E250:250 ; set accelerations (mm/s^2)
                                        
                                        ; Kinematics
                                        ;M669 K8 ; configure CoreXYUV kinematics
                                        M669 K1 ; configure CoreXY kinematics
                                        ;     X:Y:Z:U: V:A:B:C
                                        M669 V0:0:0:1:-1:0:0:1
                                        M669 C0:0:0:0:01:0:0:0
                                        
                                        o_lampeundefined 1 Reply Last reply Reply Quote 0
                                        • o_lampeundefined
                                          o_lampe @dwuk3d
                                          last edited by o_lampe

                                          @dwuk3d said in Sovol SV08 Multiple Motion System Upgrade.:

                                          M569 P1.3 S1 D2 ; driver 0.5 goes backwards (Z axis) - changed to 1.3 forwards

                                          When CanFD was new to RRF, it was a golden rule NOT to spread drivers from the same axis across different boards, but I guess the timing/lag issues are now under control?

                                          dwuk3dundefined 1 Reply Last reply Reply Quote 0
                                          • dwuk3dundefined
                                            dwuk3d @o_lampe
                                            last edited by dwuk3d

                                            @o_lampe Good spot - I did think that might be an issue - particularly with multiple motion systems - but I haven't noticed any problems so far.

                                            I wanted XY & B (the zHopper for X) to be on the same board - and there wasn't room on the 6HC for all 4 Z Axis.

                                            I suppose I should really swap everything around and have the rear gantry on the 6HC as U V1 V2 C(u2) A(zhU) D(zHu2)
                                            Then the front Gantry and Z on the 7 way Mini5+. X Y Z1 Z2 Z3 Z4 B(zhX)

                                            The 6HC and Mini5+ have different size connectors for the motor drivers which adds to the complication.

                                            o_lampeundefined 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Unless otherwise noted, all forum content is licensed under CC-BY-SA