Well, after the IDEX option designs – still as drafts – worked for Ashtar K (Prusa i3), Ashtar M (Moving Gantry) and Ashtar D (Classic XY), I thought, why not also target Ashtar C (Core XY).
Ashtar D IDEX is definitely a narrow design, so I thought to reuse two parts of it for Ashtar C as well, and hopefully the A and B belts route around – and well, it seems mechanically to work out.
On the firmware part it seems this CoreXY plus additional X motor is called CoreXYU and supported by Duet RepRap firmware – but details need to be researched in more depth. On the first glance the “traditional” CoreXYU setup routes the U belt off the X beam and not place a motor on it as I do, but routes at the end of the frames so the motor is stationary – definitely something also to look at.
Issues to Resolve
Firmware supporting CoreXY IDEX:
E1: X & Y provided through CoreXY by motors A & B
E2: X provided by X motor, Y provided by CoreXY where X=0 remains (both motors A & B have to operate to provide X=0 while Y is moved)
Duet RepRap firmware provides CoreXYU support, and it seems it would cover my use case here
Marlin firmware as of 2.x does not support CoreXYU yet
Moving the X motor – or U motor as in CoreXYU context – off the X beam and route a much longer belt and place the motor stationary like the motors A & B of CoreXY
After some delay of parts, I finally was able to finalize the belt routing and configure the firmware for Ashtar C #1:
CoreXY belt routing of Ashtar C
Early on I decided to separate belts of motors A and B in the Z axis, so they would not cross as such, and also hoped one axis of the carriage holding the X beam would allow some idlers to redirect the belts – to save space and keep frame dimension and build (or printable space) dimension close.
The Bowden tube and the wires of the hotend are preliminary arranged:
To configure the Marlin firmware turned out not that simple, as CoreXY has its own interdependencies of A & B motors: first X axis was reversed, whereas Y axis worked correctly, the INVERT_X_DIR setting on Configuration.h of Marlin did not help, it reversed the stepper motor direction, but not the actual X axis direction. After many attempts to use COREYX instead of COREXY I ended up
swap cables of A & B stepper motors
keep #define COREXY
#define INVERT_X_DIR = true and #define INVERT_Y_DIR = true
and X and Y direction worked correctly.
Preflight (no extrusion, just X & Y axis movement testing):
The stepper drivers still need some tuning, as I saw or rather heard a few missed steps at fast movement.
X & Y Endstops
The preliminary positions of the endstop are:
X endstop resides on the X beam left-hand side (USE_XMIN_PLUG)
Y endstop resides on the right-hand backside, (USE_YMAX_PLUG and HOME_DIR_Y 1)
I postponed the actual details of the Z axis, as my main concern of the design was to have a good CoreXY setup and then see how I would achieve the Z axis.
In order to use 625ZZ bearings I started to use them as idlers directly (after cleaning the grease off their surfaces) and also use them to increase contact surface when driving a closed belt which drives 3 or 4 threaded rods M6 x 500mm:
Since the surface of the threaded rods is rough, I realized I need dedicated bearings to hold the rods at the bottom, otherwise the friction would wear on the mounts and increase its diameter. So, the Z axis isn’t finalized yet, but close.
2021/01/10: Finally more detailed and complete renderings with routed belts
2019/05/04: Dual Z + Dual Extruder for MKS Gen L for Chimera/Cyclops hotend
2019/02/08: Added “Maintenance” with first few points what’s important on this Core XY setup, up-to-date OpenSCAD model renderings
2019/01/31: First prints successful, Z axis redone with 2x Z motors with 2x 760 mm closed loop GT2 belts
2019/01/01: CoreXY mechanism complete: belt routing finalized and Marlin firmware configured, brief “preflight” video (no extrusion yet)
2018/12/08: Parts delayed, so development delayed as well, A/B motors installed and Bowden extruder, “Current State” photos uploaded
2018/11/09: Main frame setup with basic belt routing with mockup stepper motor.
2018/10/03: Dedicated corner bracket cci_2020() OpenSCAD module, first scaffolding the frame with printed parts
2018/09/10: First draft, fully parametric approach, detailed routing of belts not yet done (most important)
2022/08/01: corner pieces redone, high quality belts
After Ashtar K(Prusa i3-like), I thought to still use single size 2020 T slot 6 (B-Type) alu extrusions to compose CoreXY styled 3d printer, fully parametric designed:
As first study shows, while trying to develop a single sized beam design: 16x beams make up the main geometry including bed mount, plus the X gantry which has to be shorter to lie between the top Y beams (if it sits above the belts also have to be routed above, and Y axis V modules and X axis V module not being on the same plane) and I used the same beam for the X beam where the X carriage rides the same length, using the Z offset to my advantage (instead to shorten it and fit it between the Y carriages): 17x 500mm alu extrusions (14x T slot and 3x V slot for X and 2x Y).
V modules with different kind of wheels.
So far I like to reuse the V modules to ride on the alu extrusions directly, that is X, Y and Z axis.
The Z axis details aren’t defined yet, I tend toward belt implementation, which is a bit more overhead than thread or lead screw implementation. The Z axis is done with 2 stepper motor driving each 2x threaded M6 rods (or lead screws optionally).
~385 x 400 x 380mm build volume (300×300 or 300×400 or 400×400 build plate)
500 x 520 x 520mm frame size with
14x 500mm 2020 T slot alu extrusion
3x 500mm 2020 V (or T slot as well) alu extrusion
Bowden setup for fast X/Y movement and fast printing therefore
MKS Gen L main board + Smart Full Graphic display (with dialer)
Reprap style with many parts to be printed
M3: assemble most parts
M5: idlers of A/B belts
M6: Z axis threaded rods
For Ashtar C #1 I use the MKS Gen L V1.0 board:
MKS Gen L V1.0 Controller BoardMKS Gen L V1.0 Controller Board Connectors
In order to add the RepRap Discount Full Graphics Controller I had to remove the notches and rotate EXP1 and EXP2 by 180 degrees so the display would work. I gonna use 5x A4988 as stepper motor drivers.
Update 2022/09 using MKS Monster8 V1.0 running Marlin 2.0x (requires PlatformIO to compile) with 8x TMC2209 motor drivers, MKS Mini 12864 V3 display (EUR 58):
MKS Monster8 (2022)MKS Monster8 Pinout
One has to use SDcard to put firmware on and reboot the board in order to install the firmware, there are firmware uploaders available just not for Linux.
With 8 motor drivers there are plenty extensions possible, especially the Z motor driver has two connectors (e.g. usually 2x Z motors, also in my case with CoreXY I use Z motors):
X, Y and Z(2): 3 drivers occupied
max 5 extruders
The board supports 3 independent hotends, so IDEX or even a 3x tool-changer possible with this board.
BigTreeTech ZSYong 3-in-1 with 3 materials/colors mounted on Ashtar C #1
XY Belt Routing
The XY belt routing of CoreXY is more complex than usual, I decided to separate A and B motor belts on the Z axis with two levels, and twist the belts once so the notches would not roll over the redirectional idlers (more detailed photos follow):
CoreXY belt routing of Ashtar C
V1.0 corner (simple)V1.1 corner (stronger)
V (3 wheels) shaped 2x Y carriages: v_plate(width=54), width=48 was too narrow as the belt would touch the X beam, to ride on 2x “Y” V slot extrusions
using one roller axis to extend for belt routing with 2 idlers made with 625ZZ bearings and a couple of printed washers
attaching belts on the back of the X carriage, very little space wasted
V (3 wheels) shaped X carriage: v_plate(width=48) narrow enough to achieve in X ~385mm range
stepper motors A & B at the back
Alike with Ashtar K I used a mirror as main bed structure for Ashtar C:
400 x 400mm black bed sticker (~0.7mm thick)
400 x 400 x 4mm mirror (custom order)
4x bed corner mounts (printed), with M3 x 30 and spring and 4x washers each
420 x 420 x 4mm OSB
residing on 2020 T-slot alu extrusions.
There are few millimeters in front in the left and right corner which cannot be printed on because of the bed mounts; at the back the nozzle won’t touch the bed mounts, but fan shrouds might – so one has to be aware of:
the X stop is at the left (X=0)
the Y stop is at the back (Y=390)
start of print at X = W/2 (e.g. 190), Y = -3, so the oozing of filament will be chopped when moving to the print position.
It took me some research and trial-and-error to determine Z axis in its details:
2x Nema17 (45Nm) stepper motor with 18 teeth GT2 pulley 5mm bore
2x 760mm closed belt
Using 3 or higher : 1 gear box (e.g. 3:1 gearbox could be used, but external shaft isn’t strong enough stabilized versus tilt) or alike to increase torque and still drive 4 threaded rods
Option C (not recommended)
1x Nema 17 (45Nm) stepper motor driving 4x M6 threaded rods with 1524mm long closed GT2 belt – even when well greased rods and well aligned, I still experienced occasional skipped steps, which made this option not reliable – so I switched to 2x closed loop belts Option A.
4x M6 x 490mm threaded rods
4x M6 nuts with bed mounts (printed)
4x bottom Z rod mount (printed)
8x 606ZZ bearings (each rod has 2 bearings)
4x 18 teeth GT2 pulley 6mm bore
I positioned the main controller board near the A/B stepper motors and the extruder motors at the back of the cubic framework:
advantage: most cables remain short and can be well put together
disadvantage: controller box with display cable too short to mount it in front, so remains on the back as well
I’m using Marlin 1.1.8 (for MKS Gen L1), following changes were required
stepper motors A & B reside on the back, left-front will be 0,0
X direction was reversed
Y direction was correct
It was quite complicate to reverse X, as #define INVERT_X_DIR true was not doing it, but just reverse the motor direction, which in CoreXY also affects Y. Solution was, after some back and forth trying #define COREYX as well and failing, was to swap cables of A/B motors and
#define INVERT_X_DIR true
#define INVERT_Y_DIR true
Further, Z axis is driven by 2x Z motors, as driven 3 or 4 threaded rods with a single motors lead to various missing steps, so 2x Z motors with MKS Gen L controller board:
First I had the X stopper at the left-hand side of the X beam (Photo 3), but the cable entangled with other parts, so I moved the X stopper on the X carriage (Photo 1 & 2)
X stopper on the X carriageMounting X stopper on X carriageX stopper on X beam (not recommended)
X stopper: on the X carriage
Y stopper: right-hand back side of the main frame
Z stopper: right-hand back side of the main frame
The PTFE 4mm OD / 2mm ID with the cables aren’t stiff enough to support themselves, so I added
Option A: 4mm insulated copper wire as a gantry to keep the cables from falling on the print bed.
Option B: strong plastic bundler near extruder to stiffen part of the cables/tubes.
Option A: thick wire as gantryOption B: stiffen with additional cable bundler
Belt Tension of Core XY
The Core XY mechanism takes some further care:
Parallelism: with the stepper motors off I move the carriage to the front and make sure both carriages of Y axis have the same distance to the end – if not, I tensioned the longer belt so both distances are the same = parallel to front beam.
Missing Steps: I noticed once I tensioned belts to achieve parallelism that the belts got harder to run, and eventually at larger prints with fast and longer positioning movements near 120mm/s I was missing steps in X and/or Y and caused failed prints quickly – so I loosened A/B belts equally to maintain parallelism.
So, there is some learning and experiences required to determine the best equal tension of belt A and B.
Update 2022: I’ve used GATES-LL-2GT belts which resolved all the previous problems with parallelism, as slightly stretching belts caused all kinds of geometrical inaccuracies.
Stiffness of Frame
At first the frame wasn’t as sturdy as possible as the details were not yet determined, but with maturing and defining the details the edges of the frames became more sturdy and the noise of the operational printer increased; yet, the print quality increased significantly. Further, since many parts are printed in PLA, they require re-fastening after few days as PLA gives in under tension, in particular all the edge fastening parts, which as well improved print quality.
Update 2022: I made the corner pieces stronger, to avoid any bending there:
I use M6 x 500mm threaded rods for the Z axis, because they give 1.0mm way per revolution, given 1.8 degree per motor step or 200 steps per revolution, with 16 microsteps there are 3200 microsteps per revolution which gives 0.3um per microstep or 5um per step. Using M8 or M6 for Z axis has a bad reputation in Prusa i3 setup, something I only partially agree with, gives in my setup of Ashtar C no little Z wobble, but it may have introduced some slight non-linearity within the 1mm way which isn’t observable for me. Lead screws would provide excellent linearity but less resolution due higher pitch, often 8mm per revolution, or 40um per step.
25um (0.025mm) layer height with 0.4mm nozzle50um (0.050mm) layer height with 0.4mm nozzle250um (0.25mm) layer height with 0.4mm nozzle350um (0.35mm) layer height with 0.4mm nozzle450um (0.450mm) layer height with 0.4mm nozzle500um (0.500mm) layer height with 0.4mm nozzle
In my early test, when I ran one stepper motor driving 4 well greased rods for the Z axis, I experienced eventual missing steps due the distributed friction at multiple spots (nut/threaded-rod, threaded-rod/pulley/bearing, etc), and few days in, even more. As a result I used two stepper motors each driving two threaded rods for the Z axis.
Fixing Z Wobble
Left: 1 out of 4 Z rods tilted; Right: 4 Z rods mostly aligned
While replacing the M6 x 500mm threaded zinc rods with stainless steel ones I noticed that I introduced severe Z wobble, which wasn’t there with lower quality M6 threaded rods – odd enough – and I moved the bed to Z=380 and noticed one rod swinging around due slightly titled rod, and reopen the GT2 pulley on the bottom with that rod, and turned the rod slightly and refasten the GT2 pulley again, the difference is significant: the wobble is nearly gone.
Update 2022: one of the key to resolve wobble is to keep the closed loop belts not too tight, otherwise their un-eveneness translates to the bed – keeping it a bit soft resolves it.
I may use 4x 8mm lead screws as a test as well and see how it performs regarding wobble but also resolution.
Z axis details (belt vs lead screw vs threaded rod)
1 Z motor with closed loop belt: 1, 2, 3 or 4 threaded rods/leadscrews
2 Z motors with/out closed loop belt: 2 or 4 threaded rods/leadscrews
details of belt redirection idler mounts
moving X endstop to X carriage itself (avoid cable entanglements)
stiffen or stabilize X carriage cables and Bowden tube
controller box positioning
list all parts properly
Not yet defined, reusing most of Ashtar K 2020 parts plus some Ashtar C specifics.
4x cci_2020 (bottom corner brackets)
2x cci_2020-type=idler2 (top front corner brackets)
2x cci_2020-type=motor (top back corner brackets)
1x X Module with black 3 x OpenWheels 24.4/11 on T slot 6 or V slot 6
2x Y Modules each with black 3 x OpenWheels 24.4/11 on T slot 6 or V slot 6
4x Z Modules each with white 3 x Delrin wheels 23.0/7.3 on T slot 6
Non-Printed Parts (aka Vitamins)
Two Frame Options:
A: 16x 500mm T slot 6 (B-Type) 2020 alu extrusions + 1 x 440mm T slot 6 (B-Type) 2020 alu extrusion or
B: 14x 500mm T slot 6 2020 alu extrusion + 3 x 500mm V slot 6 2020 alu extrusions
20mm Hollow Calibration Cube
Printed with 0.4mm nozzle at 0.25mm layer height, the “Z” at the bottom, first layer too thin a bit:
Castle 20mm Cube
200% scaled Castle 20mm Cube:
380mm x 10mm hollow cylinder using full height of the printer:
Dual Z & Dual Extruder with MKS Gen L
For the Chimera/Cyclops hotend with two filament but single heater and single or double nozzle, I added a stepper expander on AUX 2:
AUX2 / D64 – E1 STEP
AUX2 / D59 – E1 DIR
AUX2 / D63 – E1 ENABLE
and wired 5V, GND, 12V as well.
Additionally made following changes to Marlin 1.1.8:
#define EXTRUDERS 2
Comment out first E1_* and add Z2_* newly, and new E1_* below:
#define E1_STEP_PIN 36 // this is E1
#define E1_DIR_PIN 34
#define E1_ENABLE_PIN 30
#define E1_CS_PIN 44
#define Z2_STEP_PIN 36 // this is Z2
#define Z2_DIR_PIN 34
#define Z2_ENABLE_PIN 30
#define Z2_CS_PIN 44
#define E1_STEP_PIN 64 // E1 (2nd extruder) via stepper expander
#define E1_DIR_PIN 59
#define E1_ENABLE_PIN 63
The “Z_DUAL_STEPPER_DRIVERS” by default will use “E1_*” and interfere with 2nd extruder, hence the Z2_* definition helps to keep 2nd Z motor at “E1” motor on the MKS Gen L board, and in Marlin E1 is newly defined separately at AUX2 at D64/D59/D63.
MKS Gen L “Z” => Marlin “Z1”
MKS Gen L “E0” => Marlin “E0” (1st extruder)
MKS Gen L “E1” => Marlin “Z2”
MKS Gen L “AUX2”:D64/D59/D63 => Marlin “E1” (2nd extruder)
which then in Gcode the 2 extruders (E0 & E1) are referenced as T0 and T1.
Update 2022/09 I replaced MKS Gen L 1 with MKS Monster8 with 8 drivers, still running Marlin but its 2.0.x series, and since I have 8 drivers, and I possible can attach 5 extruders.
The independent dual extrusion (IDEX) is an upgrade in draft state – means, it’s untested for now. It provides a 2nd extruder on the same X axis. As of 2021/01 there is only Duet RepRap firmware able to provide support for it as CoreXYU, whereas Marlin 2.x doesn’t provide support yet.
Right now I keep the up-to-date information on Ashtar C IDEX in this blog-post, once things actually are tested all the details will be documented in this document.