Release status: working
Several variations have taken root, including: Kossel, Rostock mini, Rostock MAX, Rostock-Montpellier, Rostock Prisma, Delta-Pi, Cerberus, cOssel, Cherry Pi and ProStock. Both the MOST delta and their Open Source Metal 3D Printer also uses an inverted form of this design.
- Build volume: 200x200x400 mm (8x8x16 inches).
- Footprint: 300x350 mm (12x14 inches).
- Print surface: 200x200 mm heated glass which never moves.
- Mass of end effector with hotend: less than 50 grams.
- Positioning speed: up to 800 mm/s in all 3 directions.
- Positioning accuracy: at least 30 steps/mm in all 3 directions.
- Simplicity: fewer than 200 parts.
- Hardware cost: less than $500 USD.
Bill of Materials
See #Links for full BOM spreadsheet with vendors.
- Printed Parts
- Plastic parts: Printed from PLA.
- Thingiverse: Rostock (delta robot 3D printer)
- Top and bottom frame: Hand-cut plywood 2x(300x350 mm baltic birch).
- Side and Back frame: Hand-cut plywood 2x(762x9 mm baltic birch).
- Fasteners: Stainless steel, mostly M3 (some M4 and M8).
- Linear Motion
- Timing belt: 3x 1524 mm GT2 belt (2 mm pitch, 6 mm width). Closed loops or open end is okay.
- Timing belt pulleys: 3x GT2 plastic pulleys with 40 teeth. Smaller would probably work better.
- Smooth rod: 6x 762x8 mm precision smooth rod. Drill rod is probably okay too, but some report that the bearings wear grooves into the surface as drill rod is not as hard as smooth rod.
- Linear bearings: 6x LM8UU
- Cable ties: secure linear bearings and timing belts to printed parts.
- The length of belts and rods can be changed in the firmware.
- Ball bearings: 3x 608ZZ, 3x F608ZZ. If you can't find F608ZZ, use 608ZZ with printed plastic flange.(Additional bearings needed for Airtripper's bowden extruder).
- If using smaller pulleys, replace 608 (8x22x7 mm) with 688 (8x16x6 mm) or similar.
- Filament drive: Airtripper's direct drive bowden extruder.
- Hot End
- Hotend: MakerGear hotend for 1.75 mm filament, 0.5 mm nozzle.
- Stepper motors: 4x NEMA 17 (3 positioning, 1 extruder).
- Endstops: 3x ZM micro switch (pin plunger, no lever). You need only 3 top endstops. The original design also had 3 bottom endstops but they are no longer needed.
- Electronics: RAMPS 1.4 or any other RepRap board.
- Power Supply: 12v 30A
- Firmware: Modified Marlin (see #Links). This is a pretty hacky proof of concept. Hopefully we will have better firmware soon.
- Software: Same as other RepRap printers, e.g. OpenSCAD, Slic3r (see GitHub for recommended settings), Printrun.
The prototype is currently running modified Marlin firmware. This is a pretty hacky proof of concept and not a long-term solution. But it successfully receives regular G-code over USB and converts it to Delta geometry in realtime on the Arduino. I used Arduino 0023 to compile and upload this firmware to the RAMPS 1.4 board. When I tried Arduino 1.0 it didn't compile, but someone told me that newer versions of Marlin are supposed to work with Arduino 1.0.1.
I changed the G1 prepare_move() function in Marlin.pde to do the following:
- Estimate how many linear steps should be done for this line.
- Divide the line into many very small linear segments (less than 1 mm each).
- Calculate delta coordinates and speed for each segment.
- Add each segment to the path planning buffer.
- If the path planning buffer is full, wait until the next segment has been executed.
Also I improved the G28 (home all axes) command:
- Move all three carriages up until one hits the top endstop microswitch.
- Home in order X column, Y column then Z column.
- Now we know that the end effector is exactly centered at the top.
- The endstops are adjustable with M3 screws on the moving parts.
- Connect the 3 stepper motors to the X, Y, Z driver outputs on the RAMPS board.
- Maybe add short pieces of colored shrink wrap to identify the motor and endstop cables.
- Red = X: front left motor and endstops (electronics side).
- Yellow = Y: front right motor and endstops (plywood frame side).
- Blue = Z: back middle motor and endstops.
- Adjust the motor voltage (small round potentiometers) on the stepper drivers to 9 o'clock (roughly 30%). This will allow the motors to skip steps in case the endstops don't work. When calibration is done, 10 or 11 o'clock is a good setting to prevent skipping but also avoid overheating the motors and drivers.
- Grabercars says: about 1/8 of a turn clockwise off of minimum power on the Pololu is all it takes to get the motors operating correctly and not making any noise.
- Connect the 3 top endstop wires to the XMAX, YMAX, ZMAX connectors on the RAMPS board.
- The endstops are configured "normally connected", so the circuit should be interrupted when the endstop is hit. If your endstops are "normally open", change X_ENDSTOPS_INVERTING to true in Configuration.h.
It can be challenging to get good belt tension. You should be able to pluck nice bass tones on the belts. Here is Johann's tensioning method:
- Make sure you don't have a flange on the outer idler bearing (the one that is facing you).
- Put timing belt on motor pulley and idler bearings.
- Push idler end up as far as possible with one hand.
- Remove belt from idler bearings.
- Push idler end up 3 mm more and tighten screws on smooth rod.
- Put timing belt on idler again. It will be very tight.
- The idler bearings are tilted 2 degrees upwards, so your belt should not fall off even though the outer bearing has no flange.
- If the belt does fall off, reduce belt tension slightly, or print a new idler end with increased upward tilt.
This section has been updated for the latest modified Marlin firmware (without bottom endstops).
- Download https://github.com/jcrocholl/Marlin and make the following adjustments in Marlin.pde and Configuration.h.
- DELTA_DIAGONAL_ROD 250 mm center-to-center distance of the holes in the diagonal push rods.
- DELTA_SMOOTH_ROD_OFFSET 175 mm horizontal offset from middle of printer to smooth rod center.
- If your print head is too high or low in the middle of the print surface, adjust DELTA_SMOOTH_ROD_OFFSET by half mm and try again.
- DELTA_EFFECTOR_OFFSET 33 mm horizontal offset of the universal joints on the end effector.
- DELTA_CARRIAGE_OFFSET 18 mm horizontal offset of the universal joints on the carriages.
- DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET) effective horizontal distance bridged by diagonal push rods.
- Z_HOME_POS 402 mm distance between nozzle and print surface after homing.
- If you know the pitch and size of your timing belt pulleys, you can use http://calculator.josefprusa.cz/#MotorStuffSPMB to find the correct value for DEFAULT_AXIS_STEPS_PER_UNIT for X, Y, Z.
- Connect the USB cable to your computer and upload the firmware to the Arduino Mega.
- With the USB cable connected to your computer, start pronterface.py.
- Choose the USB interface, select 250000 baud, click the "Connect" button.
- If the connection is established, you should see some output from Marlin in the window on the right.
- Move the vertical carriages by hand away from all the endstops, so that there is some space above the carriages, and below the print head.
- Place an old book or thick corrugated cardboard on your heated bed or glass surface, to protect it in case of print head crash.
- Connect the 12V power supply. Make sure you can turn it off quickly if the motors are moving in the wrong direction.
- Send the G28 command (home all axes) by clicking on the little house button.
- This should move all 3 carriages up until they hit the top endstops.
- If the carriages start moving down instead of up, turn off the 12V power supply and then reverse the stepper motor connectors on the RAMPS board. Then try again.
- The top endstops are used for micro-calibrating the height of the print bed.
- If you have a dial indicator, you can attach it to the print head with this.
- After G28, move down to the print platform and try horizontal moves in X and Y direction.
- The dial indicator will show if horizontal moves are parallel to the print bed or not.
- Or you can attach a pen and draw lines on paper.
- Or if you already have an extruder and a hotend, print the first layer of a large object.
- If the first layer is too thin near one of the motors, turn the endstop screw in that carriage clockwise.
- If the first layer is too thick near one of the motors, turn the endstop screw in that carriage counter-clockwise.
- One full turn of M3 thread equals 0.5 mm.
- After adjusting endstop screws, send G28 (home all axes) and try again.
Frequently Asked Questions
How do you adjust the height of the print surface?
You can adjust the following line in Configuration.h and then recompile and upload the firmware:
// The home position of the print head. // For Rostock this means top and center of the cartesian print volume. #define Z_HOME_POS 402 // Distance between nozzle and print surface after homing.
For micro-calibration, use the adjustable endstop screws in the vertical carriages, see #Calibration above.
Should the heat bed be mounted on top of a piece of insulation or cork?
Yes, cork would probably help to heat up faster and avoid heating the plywood and electronics underneath.
Is your heat bed mounted element side up?
Yes, the etched copper side is in direct contact with the glass. You can see the LEDs and contacts in the front just next to the glass edge. But I have not actually connected my heated bed wires yet, because I print only PLA and it sticks perfectly to blue painters tape, even without heating the platform. I will connect the heated bed wires if I ever have problems with detaching corners, otherwise remove the heated bed completely at some point.
Should the heat bed be mounted so it can be leveled?
No, I think the print platform should be attached as tightly as possible to the frame, with full surface contact, possibly with cork insulation between bed heater and plywood. Then you can level the first print layer with the three micro-adjustable endstops, see #Calibration. Also make sure that the vertical smooth rods are orthogonal to the bottom plywood, otherwise your printed objects will be slightly skewed.
Will it matter if the hot end is not centered in the platform opening?
It might work okay but there are some minor issues:
- You may need to design and print a special asymmetric attachment for the bowden tube.
- The nearest inside of the moving platform may get soft because of the heat from the hotend.
- Your prints will not be centered on the print surface (closer to one edge) but this may be adjusted in your Slicer settings.
Why does the printer pause sometimes?
Print with pronsole.py instead of pronterface.py if your prints have warts. They may be caused by Pronterface redrawing the G-code view while printing, which creates significant delay between segments. My modified Marlin firmware generates many shorter lines for each G1 command, so the Marlin look-ahead buffer will run empty if you don't send the next G1 command ASAP. This can also be solved by printing directly from SD card.
If Rostock loses power, does the print head fall down?
No. The print head weighs less than 50 grams, and the three stepper motors have significant holding torque even when they are turned off (permanent magnets). You can move the print head around with your hand when the motors are turned off, but it's not very easy, and it will stay where you put it.
How do I calibrate axis_steps_per_unit?
You don't need to "move and measure" if you know the pitch and number of teeth on your pulleys. Simply enter your pulley size on http://calculator.josefprusa.cz/#MotorStuffSPMB and it will do the math and show you the result. The firmware takes care of all the non-linear math so you don't have to include that in this number. If you do want to "move and measure", use Z movement, because X and Y are non-linear.
What's the resolution in X/Y direction?
The steps per mm for X and Y is not constant across the print area. In the middle it is around 30 steps per mm, and near the edge it's more than 300 steps per mm because the push rods will be nearly horizontal.
Is it possible to mount a cooling fan on the print head carriage?
It is possible but I was trying to reduce the weight of the moving parts. So I'm using a large oscillating desk fan sitting next to the printer. You can see the fan in this picture: http://thingiverse.com/image:150904
How many bearings are actually used?
3x 608ZZ and 3x F608ZZ (F = flanged) for the timing belt idlers at the top. If you can't find flanged bearings, you can try using normal 608ZZ with a printed plastic flange. If you want to use smaller timing belt pulleys on the motors (which might be a good idea) you could also replace 608 (8x22x7 mm) with 688 (8x16x6 mm) or similar.
Also 1x 608ZZ and 1x MR105ZZ for Airtripper's direct drive bowden extruder.
How do you pronounce "Rostock"? Roe-stock, Raw-stock, Roz-talk?
It's open source, you can pronounce it how you want. ;)
I say Ross-tock but your other pronunciations are fine too.
Would you recommend 0.9 degree per step or 1.8 degree per step motors?
Use whatever you have in your workshop. If you are buying new motors, I think 1.8 degree per step (200 full steps per rotation) is more common for RepRap printers these days. Modern electronics (e.g. the RAMPS 1.4 which I currently use) support 16x micro stepping, so there are 3200 micro steps per rotation which is plenty.
Can you publish a schematic diagram of the electronic connections?
The wiring is very similar to Prusa Mendel for example. I wired my endstops "normally connected" so the circuit is interrupted when the endstop is hit. But that's easy to change in the firmware configuration.
Can Rostock print a full 11.31" diameter circle?
The current prototype can't really print the full 8x8 heated bed. It's closer to a 9 inch circle. But yes you can print a vase with overhang that is wider than the print surface.
Where can I buy a kit with parts to build my own Rostock?
Sorry, not yet. This is really still a prototype. I'm pretty sure that the first beta testers are going to find several problems and make improvements. We are working on a new frame called Kossel to replace the plywood frame with OpenBeam, and so far it's looking pretty good. Stay tuned!
In Europe you can find a full kit from Reprap Austria
Do you have any backlash problems with the metal-on-plastic universal joints?
In an earlier version some of these screws unscrewed themselves after a while, but I think that is completely solved by the inside counter nuts. My prototype has only printed about 1 kg of PLA, but so far there is no sign of wear and very little backlash.
Why do you have longer than "standard" LM8UU bearings on some of the rods?
The longer LM8LUU was just an experiment to see if it would keep the carriage more horizontal. It doesn't seem to make a difference, except for added cost and weight, so it's not recommended.
How low do the carriages need to slide on the rods during the printing/operation?
The diagonal suspension rods are 250 mm long so the max required carriage travel for printing the first layer is somewhere around 200 mm (they go from vertical to almost horizontal). You need to add the build height to the first layer travel: 200 mm + 200 mm = 400 mm carriage travel required if you want to print objects up to 200 mm tall.
What length are the belt loops?
My prototype currently uses 762 mm smooth rods and GT2 timing belt loops with 2 mm pitch and 762 grooves. This gives me 8x8x16 inches (20x20x40 cm) build volume. You can make your Rostock taller or shorter simply by adjusting the length of the smooth rod and timing belts. If you already have shorter belts, you can use them with longer smooth rod too. The extra smooth rod may stick out the top of your printer, but that's okay. A shorter printer may be more rigid / stable and may not need the extra plywood frame on the back and side.
Why did you build three towers instead of four?
I decided to start with three towers, to build the simplest design that could possibly work. Four towers might improve precision, but it also needs 33% more parts and it would be over-constrained. This means the mechanics might jam if the four sides are not coordinated exactly right.
The following improvements are planned for future versions:
- Use smaller timing belt pulleys and idler bearings.
- Find cheaper timing belts and pulleys, e.g. T2.5 / HTD-3M / GT3?
- Replace timing belts with Spectra fishing line.
- Write a new clean delta firmware based on Grbl.
- Create a Mini Rostock variation with 120x120x120 mm build volume.
- Replace metal binder clips with printed plastic clips to hold the glass platform.
- Use OpenBeam aluminum extrusion instead of plywood frame: Kossel.
- Use OpenRail (or hybrid roller slide directly on OpenBeam) instead of LM8UU and smooth rods.
- Experiment with dual extruders.
- Rostock blog on Tumblr
- Videos on YouTube
- Pictures on Flickr
- Rostock parts on Thingiverse
- Mailing list for questions and answers
- OpenSCAD source files on GitHub for printed plastic parts.
- Modified Marlin firmware on GitHub for delta geometry on Arduino.
- Bill of materials / BOM / parts list on Google Docs (work in progress)