Introduction: Building a Prusa I3 3D Printer - Revisited

It's been nearly 2 years since I first published my Instructable "Building a Prusa i3 3D Printer" so I thought it was time to do an updated version. Since that first build my friend Kevin and myself have built a printer each and also one for our local Hackspace.

After we finished the original i3 build we printed a spare set of parts for the printer then 2 sets of i3 "rework" parts for our own printers. The printer we built for our Hackspace was also an i3 rework - this Instructable will focus on a rework build we did for the hackspace and also a build I am doing for myself - a second printer using a hexagon 1.75mm hotend.

The build is much the same as it was for the "vanilla" version but the main changes were:

  • 10mm threaded rods for the whole frame vs 8mm and 10mm for the vanilla
  • I used an aluminum frame, though plywood would be OK
  • 1.75mm Hexagon hot-end rather than the 3mm j-head
  • different mounting of extruder to the x-carriage
  • better Z-Axis endstop
  • aluminum heat bed

With the new Z-Axis endstop and a solid frame auto-leveling is not needed. The proof of this is when we took the printer from the Hackspace, loaded it into a van with a bunch of other stuff, took it down to our "Mini Maker Faire" in Vancouver. Set it on a table, plugged it in and started printing without even having to check the nozzle to bed gap. The printer went for over 8 hours a day for 2 days doing 30 minute prints - all without having to check or adjust the bed leveling once. After the weekend it went back to the Hackspace, was setup on the bench and a member loaded a file from the SD card and started printing - again without needing to check the bed for level.

I also still believe that building from scratch like we have done is far better than buying a kit and having to "upgrade" things to get decent prints.

The pictures in the Instructable are from both the Hackspace build and also a new build I am doing for myself.

Step 1: Sourcing the Parts

Parts List:

Frame - for this build we used a CNC'd aluminum frame from one of the Hackspace members. We did not need to use braces like we do when using a plywood frame. Don't use an acrylic frame, from helping others who have had acrylic frame kits I don't think they are rigid enough especially the bed.

See the alu-frame.dxf file in this step.

We have built "rework" i3's with plywood frames using braces and they work well. Kevin modified the bed to use 4 linear bearings which also uses shorter "fingers" out to the adjustment springs. The DXF file for this is attached to this step.

Printed Plastic Parts - we used some of the parts from the Prusa i3 Rework by eMotion. However we did use a different z-axis endstop and Kevin re-designed the y-motor and y-endstop mounts, y-idler plus the z-axis top mounts. Plus we used a different extruder for the Hexagon hot-end.

i3 Parts by eMotion on Thingiverse - we used their x-carriage, x-end-idler, x-end-motor, y-corners, y-belt-holder, z-axis-bottom-left & right,

Kevins modified y-motor/end-stop on Thingiverse - with this setup you use more nuts and washers but the end-stop is separate from the motor mounts and therefore can be moved to a different location on the frame if needed.

Kevins modified z-top mounts on Thingiverse - this covers the top if the m5 threaded rod so nothing can get caught on them. You can use the rework version if you like.

Wade Style extruder for a 1.75mm Hexagon and others on Thingiverse.

Hobbed bolt for the extruder. These off ebay have been great. In case the listing expires it was through this seller.

Z endstop on Thingiverse - I can't say enough good things about this design. This is a must if you want easy bed leveling - but more of that in a later step. Edit Sept of 2020. The links no longer works. I have added the STL to this step

X endstop on Thingiverse - a great design for the x-endstop. I use it on the left side

Kevin also designed a 2 piece y-tensioner (so you don't have to dismantle the frame to change) and also nut-holders for the bed - stl attached to this step

We used herring-bone gears for the wades style extruder taken from the original Prusa SCAD files - stl files attached to the step

Threaded Rods, nuts and washers - There are a number of places like Fastenal where you can buy these. For this build I used a local stainless fittings supplier. you will need:

  • approximately 2 meters of M10 threaded rod for the frame, stainless or zinc plated
  • 54 M10 nuts and washers (less if you use the rework all-in-one motor mount and y-stop).
  • If your supplier has larger "fender" washers in the M10 size get 4 for the chassis to frame mounting
  • 1 meter of stainless M5 threaded rod and 2 M5 nuts for the z-axis. Don't use zinc plated it won't be straight enough

Smooth Rods - The rework design uses M8 smooth rod for the X, Y and Z axis, 2x 370mm, 2x 360mm and 2x 320mm. Quality straight rod is essential for good prints. For our first build we sourced them from BST Automation via AliExpress. You will also find sellers on eBay and local hardware stores. For this build we found a 3D printer company in Toronto, Canada - but their customer service was so lacking I can't recommend them. I recently bought a set of smooth rod from this ebay seller. Though I haven't had a chance to use them on a printer the quality looks awesome, plus they come pre-cut.

LM8UU Bearings - These are the linear bearings for the bed movement on the Y-axis and the extruder/hot-end movement on the X-axis and the Z-axis. You will need 11 of these (12 if you use a 4 bearing bed design). Available from many eBay vendors. People on the reprap forums recommend Misumi brand for the quality

Pulleys, Belts & Idler Bearings - The X and Y-axis travel each use a 20 tooth GT2 pulleys and approx 1 meter of toothed belt. Available from many AliExpress and ebay vendors. The extruder will need 3 608ZZ bearings and you will need 3 624 bearings, 2 for the Y-Axis and 1 for the X-Axis.

Stepper Motors - You will need 5 NEMA 17 stepper motors. The NEMA 17 is a stepper motor with a 1.7" x1.7" face-plate. We have used this vendor on AliExpress for all the printers we have built. We had to buy 10 to get the pricing (but you have 5 to sell or use in your next 3D printer project). They are 1.2A which will keep the RAMPS drivers cooler, have approx 47N-m holding, are 1.8° stepping, 5mm shaft. If you only want to purchase 5 then search for 42BYGHW804 on AliExpress or eBay. You will also need 2x 5mm to 5mm couplers which join the Z-Axis M5 threaded rod to the NEMA 17 motors.

RAMPS 1.4 Kit - This consists of an Arduino Mega, a RAMPS 1.4 shield and 4 or 5 "drivers" The "drivers" control the NEMA 17 motors as their current requirements are greater than what an Arduino could handle. We have been using kits from AliExpress. It's hit and miss and I always change the heat bed MOSFET on the cheap China versions. For my personal printer I tried a RAMPS board from Static Boards. It cost a lot more but it's great quality and I have had zero issues. Highly recommended if you want a quality RAMPS board.

MK2A Heat Bed - In our first build we used a PCB heat bed. For later build we used an aluminum bed from Marginally Clever. I would recommend the aluminum over PCB, it is more rigid and won't flex over time. We can print PLA at 55c on blue tape and ABS at 60C to 65C on Buildtak

Hot End - Our original build and my personal i3 use a genuine J-Head 3mm hot end. It seems the industry is going to 1.75mm filament so for the Hackspace build we used a 1.75mm all metal hotend from Hexagon. We bought it from Marginally Clever in Vancouver. Dan the owner is also a member of the Vancouver Hack Space. I do not recommend the cheap clones from China or the MK8 version - whenever I have helped someone with a cheap kit build they hotend has always been an issue.

Power Supply - You can use a PC ATX power supply, but we opted for a slim 12V power supply as it's smaller and I think it looks neater as it only has the necessary wires. Something in the 200W to 350W range should work. Check ebay. Also needed were a 115V plug with wires and some spade terminals.

Nuts. Bolts & Washers - You will need different length M3 bolts with washers and regular and nylock nuts. Use allan or hex heads rather than Phillips style. We bought M3 in 10mm, 14mm, 18mm, 25mm lengths. A bag of washers, a bag of regular nuts and a bag of nylocks. You will also need some M4's for the extruder to x-carriage mount and also both of the idler bearings for the x and y axis. The extruder idler needs long thin nuts/bolts for the tension springs, I use drywall butterfly bolts - 1/8" x 3" or 4". Just remove the butterfly part of the nut and shorten bolt if needed. For the springs I use springs you will find on old car brake lines - check with your local mechanic.

Wiring Kits - we use kits found on ebay - just search for "reprap wiring kit". You will also need a roll or 2 of 16awg or 18awg wire for the power supply to RAMPS and heat bed. Try use wire with a high number of strands as it will be more flexible and less prone to fracturing. We found it at Princess Auto a Canadian parts store.


You will need 2 40mm fans for cooling the nozzle and piece being printed and possibly a 3rd for cooling the RAMPs board

Tools you will need for building:

  • Allen Keys for the hex bolts
    Small sockets for the M3 and M4 nuts
  • Small adjustable wrenches for the M10 nuts
  • Screwdrivers
  • Long Nose Pliers
  • Crimpers
  • Wire Strippers
  • Soldering Iron
  • Multi Meter
  • Digital Calipers
  • Heat Gun or Lighter for shrink tube

If you don't have a multi meter or digital calipers then get them :-)

The multi-meter is needed to check various voltages and end-stops NO or NC pairs and the digital calipers are used to check drill sizes, filament sizes among other things

Tools needed for printing

  • Tweezers
  • Ball-end 2.5mm hex allen wrench
  • Artists spatula for removing finished prints
  • Blue painters tape
  • small binder clips
  • 8" x 8" 3mm glass

Step 2: Assemble the Plywood Frame

If you are using a plywood frame with braces then assemble it now. It will use 6 nuts/bolts usually 6-32 x 1"

Step 3: Build the Y Frame Chassis

The Y frame holds the bed the printed objects will be built on. The Y-axis runs front to back (when facing the printer)

It is built from 4 printed plastic corner pieces, 6 lengths of M10 threaded rod and nuts/washers. It holds the Y-motor and Y-belt idler, M8 smooth rod & LM8UU linear bearings for the heated bed to move on.

Cut 2x 380mm to 390mm lengths of the M10 threaded rod. Slide on 2 washers, then 2 10mm nuts from each end, these will bolt to the plywood or aluminum frame so if you found larger M10 "fender" washers you should use them here. Use a washer against the plastic pieces whenever you need to bolt then to the threaded rod. Next put nuts and washers one each end of the threaded rods, these will hold the y-corner pieces. The y frame uses 2x 360mm lengths of M8 smooth rod (some kits may come with 350mm that's OK). If you are using an aluminum bed slide 1 LM8UU linear bearing on 1 of the M8 smooth rods and 2 LM8UU's on the other. If you are using a plywood bed with 4 bearings supporting it then make sure you place 2 bearings per smooth rod. Assemble the y-corners by sliding the smooth rods into the y-corners as you assemble then onto the threaded rods.

If you are using a plywood frame cut 3x 205mm lengths of M10 threaded rod and 1x 305mm length - the longer piece is to bolt to the braces of the frame.

If you are using an aluminum frame without the braces cut 4x 205mm lengths of M10 threaded rod

Assemble the M10 threaded rod cross pieces complete with the motor/endstop mounts as per the pictures. The spindle of the y-motor will face inwards and the pulley on it will be in the center of the cross pieces.

The front cross piece holds the Y belt idler. Some designs come with a tensioner built-in, others don't. If you have a design with a tensioner don't back it off too far back as it will restrict the Y bed front to back distance. Assemble it with the correct size bearing (I used 2x 624's - they take a 4mm bolt).

Step 4: Y-Motor & Heat Bed Frame

Use 2x M3 bolts with washers and nylocks to attach the y-belt holder.

Bolt one of the 20 tooth GT2 pulleys to a NEMA 17 motor. You may want to file a flat face on the shaft of the NEMA to help the set screws bite.

Bolt the Y motor to the mount. To check where the Y motor mounts will sit on the back of the frame you need to temporarily mount the frame to the chassis, then thread the belt through the front idler. Lay the belt from the idler to the motor pulley and adjust the position of the Y motor mounts so the belt sits in the middle of the V in the frame.

Remove the frame from the chassis once you have figured out the placement of the Y-Motor mounts and tightened the nuts up.

Zip tie the bed to the LM8UU's making sure they are tight. Check the ensure the bed slides freely front to back. Make sure the distance between the M8 smooth rods is equal at both the front and back of the printer so the bed doesn't bind as it moves back and forward. It should roll freely.

Next install the belt. I found it easier to do this with the chassis/bed upside down. Zip tie one end of the belt to the belt holder. The notched side of the belt faces inward. Go around the motor over the top of the belt holder, through the idler/tensioner and back to the belt holder. It is easier if you get a second person to help - put a zip tie around the belt but leave it loose. While you tension the belt get another person to tighten the zip tie. It helps to lock the notches in the belt to hold it before it's zip tied. You can adjust the tension via the front idler/tensioner if needed. I use 2 zip ties on each side and trim the belt closely so it doesn't interfere with the Y-axis movement

Step 5: X-Axis Motor and Idler Mounts

You need to prep the X-axis before it can be mounted on the Z-axis motors and smooth rods.

Find your X-End-Motor mount and the X-End-Idler. Press 2x LM8UU bearing into each. You may need to cut small tags from the top and bottom of the printed parts and the bearing should press in without too much force. I like to start by getting the end of the LM8UU into the X motor or idler piece, once square with the LM8UU flat on a table hold the mount and press down.

Next make sure the M5 threaded rod can fit through the holes and clean up with a drill if needed. While you have the drill out cleanup the 8mm holes where the smooth rod will go.

You need to press 2x 5mm nuts that will be used by the Z-Axis threaded rod, one in each x mount. Cut the Z-axis M5 threaded rod to length and put a nut onto it. Slide it through the hole and see if it fits flush into the piece. If not then heat the nut with a heat gun or gas lighter (only for a few seconds) then let the nut melt it's way into the piece so it sits flush and the threaded rod is at the right angle. You may need to do it a couple of times - just be easy with the heat. The nut doesn't need to be heated until it's red hot.

Next install a 624 sized bearing in the x-idler mount. It's easier to do this now than when this is assembled on the z-axis. In past builds I have used a tensioner for the x belt, but found it isn't really needed - whatever works for you. Even though Canada is on the metric system, metric hardware can be hard to find - rather than wait a month to get M4 hardware from AliExpress/China I went to my local hardware store and found regular M4 nuts and bolts vs the cap screws and nylocks I would have liked to use. I use a dab of super glue on the nuts to make sure they don't come loose.

Step 6: Extruder & X-carriage

For a re-work build it is easier to assemble the extruder and attach it to the extruder mount before assembling the x and z-axis. Since our first build we have change from a 3mm to 1.75mm filament and therefore use a different hotend. For the Hackspace and this build I am using this design from thingiverse. It bolts to the standard x-carriage with 3x 20mm or 25mm m4 bolts and one approx 35mm which will also hold a fan. For this build I didn't have cap screws and since I didn't want to wait 4 to 6 weeks for an AliExpress order I used regular bolts found at my local Canadian Tire store.

As well as the plastic pieces you will need 3 608zz bearings and a hobbed bolt. I bought the hobbed bolt off ebay.

Check the shaft where the filament will go through to make sure it is smooth and drill slightly larger than the filament diameter if necessary.

Drill out the 5mm hole in the small gear. You will need to fit either a 2mm (if you can find one) or a 3mm nut into a slot on the back of the small pulley. In most cases you will find the slot too small for a 3mm bolt. Even at my local hobby/RC shop I was unable to find a 2mm nut, so I enlarged the slot to fit a 3mm nut. Drill out the hole on the side of the small gear to fit the grub screw you are using (either 2mm or 3mm) The ideal length of the grub screw is 8mm, but you should be able to use something a couple of mm shorter. Small grub screws like this can often be found at RC or hobby shops. The grub screw doesn't have a regular head like a cap screw. File a small flat onto the shaft of the NEMA 17 motor you are using for the extruder. This will help stop the small gear from slipping on the shaft when printing. Fit the motor and small gear onto the extruder making sure the gears mesh correctly. I orient the motor so the wires face upward, this way I can zip tie them down to the motor so the don't later fracture where they come out of the motor and I can fed them up and over the frame along with the hotend wires.

Bolt the motor to the extruder with the small gear in place. Fit 2 of the 608 bearings into the extruder.

The hobbed bolts I use have a nylock on them - before I install it into the extruder I wind the nut onto the bolt (then off) so the nylock is cut. This way later I can grip the large gear and use a wrench on the nylock and it will wind on easier and still stay in place without moving

Shim the hobbed bolt as needed so the hobbing is centered where the filament will feed then adjust the small gear on the shaft so the gears line up. The hobbed bolt I use has the hobbing 25mm from the end of the bolt.

Assemble the idler with it's 608 bearing and bolt to the extruder.

Zip tie 4 LM8UU's to the x-carriage making sure the zip ties lay flat on the face where the extruder bolts to.

Finally bolt the extruder to the x-carriage.

Step 7: Z-Axis and X-Axis Carriage

Clean/drill the 8mm holes on the top and bottom Z-Motor mounts and also clean up the Z endstop mount that bolts onto the left side motor mount.

Bolt the Z-Motor mounts to the frame. Then bolt the motors to the mounts. The left side mount will include the Z endstop mount. Once bolted in place, bolt the z endstop switch to the endstop mount. It's easier to do it at this point before the Z smooth rods are installed.

Install the Z smooth rods into the bottom motor mounts. Bolt the 5mm x 5mm couplers to the threaded rod and screw the rod into the M5 nuts on the motor and idler mounts.

Next insert the 2 X-Axis smooth rods into the X-carriage, then slide on the X-Motor and X-Idler mounts. Install all this onto the Z-Axis smooth rods being careful that the smooth rods fit directly into the LM8UU's in the motor and idler mounts. If you try force them on at an angle you risk ruining the LM8UU bearings in the motor and idler mounts - the 5mm couplers should slip onto the Z-motor shafts. Raise the coupler up a couple of mm and tighten onto the NEMA shaft - the z threaded rod and the z motor shaft should have a small gap between then and not touch

Install the Z-Axis top mounts over the smooth rod and bolt to the frame - it's starting to look like a printer!

Step 8: X-Axis Motor & Belt

Bolt the X-axis motor onto the mount. Make sure to add the Z-axis endstop mount that will hold the M3 bolt. The top 2 bolts will be shorter than the bottom because of this.

Bolt the toothed pulley onto the X-motor. Using a similar procedure to the Y-Axis belt installation, install the X-Axis belt by using zip ties on one end, loop around the idler, around the motor pulley and back to the X-carriage. I leave the belt a little longer and tie it back - so that if I have to remove and re-fit the belt I have extra length to grip onto.

It helps to have someone hold the tension of the belt while you zip tie the end if you aren't using a belt tension system. The X carriage also has notches the belt fits into and will help hold the tension while you zip tie the belt up.

Step 9: Finishing the Extruder

For the idler bolts I start with 1/8" x 3" butterfly bolts. They are used to hang things on drywall. Break the butterflys off the nuts and trim them a little so they fit into the slots in the extruder. Also trim a little off the extruder or idler if necessary. For the springs I use discarded springs from brake lines. These springs are the ones that fit over the solid brake lines that fit on a car chassis. Just ask your local mechanic - or find some on ebay, search for reprap springs.

I cut the springs to 25mm to 30mm long and cut down the bolts to match. I make the bolts long enough that I have to compress them slightly when screwing the bolt into the nut, this gives you a few turns to get the tension right on the filament. Use a washer where they meet the idler plastic and also the bolt head if needed. Before you cut the bolt down wind on an extra nut and once cut un-wind the nut to help clean the end of the threads.

I may find the proper 1/8" nuts and file them down to fit, but will see how the small nuts off the butterfly work first.

With the design of extruder/idler I used, you can loosen off the bolts nearly all the way and slide them up to release the idler and get access to the hobbing on the bolt. You will need to do this from time to time to remove any filament that builds up on the hobbbing and also around the bearings.

Step 10: HotEnd & Fans

For my recent builds I have been using a Hexagon kit from Marginally Clever in Vancouver. It comes complete with thermistor, grub screws and the hex-allan keys needed to assemble it.

It is a quality all metal hotend with a heating element vs a resistor used in previous builds.

I recommend using a quality hotend like this vs a cheap knock-off from China. we have used a Hexagon in the Prusa i3 we built for the Vancouver Hackspace and in the 1 1/2 years of use I have only had to unblock it once.

Fit the heating element into the block and secure with a grub screw.

Fit the thermistor into the hotend and wrap with kapton tape. The hexagon kit comes with a black cap that fits over the hotend, I have found that this will eventually melt and therefore don't use it.

I route the wires on the right side of the extruder.

Bolt the hotend (nozzle) to the extruder and route the wiring up over the frame. I use expandable braid over all my wiring to keep it neat and out of the way. Use either shrink tube or electricians tape to keep the ends neat. Mount the cooling fan for the hotend. You need to have a fan blowing over the fins on the hotend while the printer is on. There are 2 pins on the RAMPs board that can be used for the 12v needed. The cooling fan for the hotend is different from the cooling fan for the piece being printed. Without the hotend fan heat will creep up the hotend causing PLA filament to expand in the throat (also known as the cold to hot transition area). When this happens the PLA can jamb up the nozzle. You will also need to mount a cooling fan for the piece being printed. I mount a single 40mm fan on the right side of the extruder. This fan is controlled by the RAMPs board and the slicing software.

Step 11: Heat Bed - Wiring

The heat-bed can pull a little over 9A of current and is controlled by a MOSFET on the RAMPS board. (12v / 1.3 ohms = 9.2A). I found the standard STP55NF06L got very hot even with a heatsink. After reading a few reprap forum threads on this issue I changed the MOSFET to a IRLB8743PBF and found the issue went away. The circuit is also protected by an 11A resettable fuse This fuse also gets hot to the touch and if the circuit pulls maximum amps it will heat up and expand and break the circuit. It helps to have a small fan blow air over the fuses to keep them cool during the initial heat up of the bed.

For a previous build I have also used a RAMPs from Static Boards:

This is a quality RAMPs board and if it's in your budget I recommend you get one. For this Instructable I am using a RAMPs from China and will detail changing the MOSFET

For this build I used an aluminum heated bed which can use either 12V or 24V and has LED's on it. Because of the LED's it is polarity of the 12V plus and minus needs to be correct. If you use a heat bed without LED's then polarity isn't an issue. Having used 3D printers with both the cheaper etched PCB style of heat bed and this aluminum heat bed I can honestly say there is a huge difference. The aluminum bed stay flat and wont flex unlike some of the cheap PCB types from China.

The temperature of the bed is is read by the Arduino/RAMPS by a thermistor (usually 100k). This is attached to the bottom of the bed with kapton tape. I used a 100k thermistor from a 5 pack I bought off AliExpress.

The thermistor wires go to T1 pins on the RAMPS.

For the 12V wires I used 18awg stranded wire. For this build the positive goes to pad 1, and being 12V power the negative goes to both pads 2 & 3 (bridging them).

Step 12: Heat Bed - Mounting

I have never wanted or needed "auto leveling" on any of the Prusa i3's that I have built. I believe that if you build a solid printer with quality parts "auto leveling" isn't needed. Yes I know Jozef Prusa has an auto-level on his new MKII i3, but he is producing a printer for the commercial market which wants one.

The home position for the bed/nozzle of my builds is the front left of the bed. I use all MIN endstop positions, so the X endstop is on the left, the Y is at the back and the Z is on the bottom. So for the front left of the bed I do not use a spring on the bed, rather I use a plastic spacer and adjust the initial Z height via a long nylon plastic screw mounted to an M3 bolt off the X motor mount (see pictures later in the endstop section). Once I have adjusted the home position height by adjusting the nylon screw I can move to the other 3 corners and use an M3 hex driver to adjust them. This makes adjustments simple - set the z height at the home position and you are set - the other 3 corners almost never change because the frame is solid, the bed frame is aluminum as is the heated bed itself. There is nothing to flex or move. Use nylock nuts to ensure they don't rattle loose. Use M3 bolts with a hex head, this way you can easily adjust them with a hex driver and you don't have to press down on the bolt you adjust it. Using a regular Phillips screwdriver requires a downward force and will not give you any accuracy.

For the M3 nuts I use a 3D printed holder, this is so I don't have to use pliers or a wrench to hold it when adjusting the bed - see step 1 for the stl file. You will probably have to heat the nuts a little and pull them into the plastic. Using the propane torch pictured it only took a couple of seconds to get enough heat. Use pliers to hold the bolt as heat will transfer down it. You can also use a heat gun or possibly a hair dryer. The plastic in the nylocks will melt a little, that's OK.

Make the spacer the same height as the springs you use. I like to add a washer each side of the spring to give it a little pre-load. See the pictures.

Route the wires behind the bed and if possible zip-tie them to the bed frame, this will put less stress on the solder joints when the bed is moving during the print.

Step 13: Motor Wiring

The NEMA 17 stepper motors used have 4 wires coming from them. They are 2 sets of coils and you will need to use a multi-meter to make sure you have the correct pairs - do not trust spec sheets etc, take a couple of minutes and be sure the pairs are correct. It may save you hours of troubleshooting later. The RepRap wiki has info on how this is done - basically you meter the pairs in turn. You will find open circuit on non pairs and low or no resistance on a pair. Mark which wires are a pair. On the 4-pin connector the pairs are next to each other - so it's wire1 of the first pair then wire 2 of the first pair, wire 1 of the second pair, wire 2 of the second pair.

I had to extend the wires for all the motors and used a 4-wire kit off ebay. I used small shrink tube on the soldered joins and braided wire sleeves with shrink tube on the ends to make the wiring look neat.

The Y and Z motors don't move and therefore are easy to judge the length, the X motor will raise up and down and therefore wire length needs to be measured from the top of the Z-axis. The extruder motor will move up and down and from side to side and wire length needs to be measured from the bottom right (assuming the RAMPs will sit on the left side of the printer).

On the motors that move (X and extruder) I zip tie the loom to the motor itself - this helps remove a possible fracture point where the wires enter to motor.

I have always tested the wiring and covered it with braided sleeve while building the printer vs leaving a rats nest of wire until the end - that will never get cleaned up. Take your time and do it right. Just made sure to meter the pairs correctly, judge the length correctly and trust your building ability. It will make wiring to the RAMPs a lot easier later in the build.

Step 14: EndStops - a Primer

The Prusa i3 printer has a build size of approximately 200mmx200mmx200mm (8"x8"x8"). To know where it can print you need to "home" the printer - this is done before each print. To home the printer we need to use endstops, mechanical or optical switches that are tripped when the movement of the axis reach their maximum (or minimum) - the switch signals the Arduino and the RAMPS and the motor stops.

People often have trouble getting endstops configured correctly because of the many variables involved - but if you take things step by step they are quite easy to configure.

For this build I used mechanical switches. The switches can be wired to be normally open (NO) or normally closed (NC). I use normally open, i.e. when the switch is hit it closes the contacts and sends a signal to the Arduino port via the RAMPS board. This logic can be changed in the firmware to normally closed if you wish. Note that the switches I used are wired by default to be NO and the wiring can be used as-is.

Some would argue that NC is better as if one of the wires break by accident it will trip the RAMPS telling it that the maximum or minimum have been reached. I chose NO as you only home the printer once per print and therefore the printer gets a signal on it's port(s) once vs having the logic on the port the whole time through the print.

In Marlins Configuration.h file this logic of NO or NC is found in the lines:

const bool X_ENDSTOPS_INVERTING = false;// set to true to invert the logic of the endstops

const bool Y_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops

const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.

You will need to change all of them to true

const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops

const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops

const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.

Also in the Configuration.h file you define whether the end-stop is at the MIN or MAX of it's travel

// Sets direction of endstops when homing; 1=MAX, -1=MIN

#define X_HOME_DIR -1

#define Y_HOME_DIR -1

#define Z_HOME_DIR -1

The Y-Axis end-stop at the back of the printer frame is a MIN, at the front it's a MAX

The X-Axis end-stop on the left is a MIN, on the right it's a MAX

The Z-Axis end-stop is at the bottom and therefore a MIN

On the RAMPS board are pins for the 3 axis - signal, ground and +5v and also for each X,Y & Z axis a MIN and MAX position - 6 sets of pins in total. In past builds I used only the signal and ground, but for this build I will use all 3 pins and have the LED on the end-stop switch light when in the home position. Just make sure the plug goes onto the RAMPs the correct way or you will damage the RAMPs board.

See the attached image of the RAMPS for the correct pins to use. For the X, Y and Z axis I used the MIN pins.

So in summary the variables are:

Switch NO or NC

MIN or MAX end-stop position in the physical build

MIN or MAX defined in configuration.h in Marlin

MIN or MAX position on the RAMPs board

I will detail how to test the end-stops in a later step.

Step 15: End Stops - Mounting Them

I use different mounting brackets from the previous Instructable.

The X-Axis mount is put on the left side of the printer making it a MIN end-stop. Route the wires along with the X-motor wires. I put them in separate braided sleeves.

The Y-Axis end-stop should be assembled as per the pictures. The design allow for the switch to be moved back and forward and also up or down so that the heated bed hits it and trips the switch. Route the wires across that back of the chassis.

The Z-Axis mounts found here are IMHO the best I have seen for the Prusa i3 in any of the kits I have seen (I haven't seen a genuine Prusa so can't comment on them). These should already be installed at this point. Use a long M3 bolt on the mount on the X-motor mount, and add a tight fitting long nylon nut that will hit the Z end-stop switch.

Step 16: Power Supply

I have been using slim 12V power supplies for my builds vs a computer ATX power supply.

I have also used removable slim power supplies salvaged from old computer servers, but they like the ATX supply need wires to simulate the power button on a computer. Either will work.

A 3D printer like this will require approx 9A for the heated bed and 4A for the hotend, so something around 350W (30A) will be good. Most slim 12V power supplies from China are probably rated higher than what they actually are, so one rated at 20A may not be quite enough.

Note: If you are not comfortable with working with 115V AC (or 230 depending where you live) get a licensed electrician to do this next step for you.

Start by cutting the end of a power cable and if possible use spade terminals for the connections. For this Instructable I am just going to solder the ends of the cables. There is a live, neutral and ground connection - make sure they go onto the correct terminals.

You will need 4 16awg or 18awg wires from the power supply 12V outputs to the RAMPs - 2 each for the positive and negative. Screw them into the blocks on both the power supply and the RAMPs 12V connectors being careful of the polarity. Before plugging the block into the RAMPs power on the power supply and check the voltage output and adjust if necessary.

If you are using a plywood frame you can mount the RAMPs on the left side of the frame and the power supply on the right side of the frame making it easy to move the printer if needed without having a RAMPs board and power supply falling all over the place.

Step 17: Wiring Up the RAMPs Board

With the 12V power supply done it's time to move onto wiring the RAMPs board.

If your RAMPs board didn't come with the 2 12v pins for the hotend fan soldered in solder them in now.

As noted in my previous Prusa i3 Instructable it's been hit or miss as far as the MOSFET for the heat bed circuit. On some boards they are fine, on others they let out the magic blue smoke. I change them at this point.

Once done, check the pins on the underside of the RAMPs and plug it into the Arduino board.

The RAMPs has sockets for 5 "drivers" These are small boards that plug into the RAMPs and power the NEMA 17 motors. The Arduino ports cannot handle the current needed by the motors and this is off loaded to the RAMPs drivers. If your board came complete with the driver boards installed remove them now and check that all 3 jumpers are on under each driver. I have helped many people troubleshoot their printers as the axis aren't moving properly. In many cases the reason was that the jumpers were missing - to save money some vendors in China will populate the jumpers in the 5th unused driver socket and not put them under the installed drivers on the other 4 sockets. So it looks like the vendor would have populated all 5 when in fact they haven't. I have seen this on more than one kit - so check now to be sure.

Once the jumpers are in place install the drivers and then the heat sinks onto the drivers. When placing the heat sinks make sure they do not short out any pins or components on the board.

There are many wiring diagrams on the Internet showing what pins are for what on the RAMPs - I have labelled the one needed on one of the images above.

Now is a good time to check the driver voltages. Make sure the 12V is off.

Connect the Arduino to a PC or Mac via the USB port to power up the Arduino/RAMPs boards. With a multi-meter on the 2v DC setting, put the negative lead to ground (use one of the ground pins on the 12V input) and put the positive lead onto one of the pots. Be careful not to short anything out. A reading of 0.65v to 0.7v is a good starting point - this may need to be adjusted later when testing the motors. If the reading is higher or lower turn the pot clockwise to increase and counter clockwise to decrease. If you have a plastic or ceramic screwdriver use it, if not disconnect the USB before adjusting (not totally necessary, but if you zap something you are on your own). Repeat as necessary for all 4 pots.

Wire the heat bed power lines to D8 observing the polarity, connect the heat bed thermistor to T1

Wire the cooling fan (for printing pieces) to D9 observing the polarity.

Wire the extruder heating element to D10 (no polarity), and the thermistor to T0

Wire the hotend fan to the pins next to the diode

Plug in the motor cables - either way around is fine just make sure the Z are the same way

Plug in the endstop plugs making sure they are in the correct MIN/MAX position and also the polarity is correct.

If you have an LCD unit don't plus it in yet - there is plenty to configure without having to worry about an LCD screen.

Step 18: Marlin Firmware

There are 3 pieces of software you will need to test the printer setup and get printing.

Marlin - this is the firmware you install onto the Arduino - get the "latest release" which was 1.0.2-2 when the Instructable was written.

Arduino IDE - this is used to upload the Marlin firmware to the Arduino

Pronterface - Pre-compiled binaries for Windows and Mac can be found here. This is used to control and setup the printer before you start printing

Install the Arduino IDE via the installer. Unzip Marlin and Pronterface into their own folders.

Open the folder where you extracted Marlin to, then open the Marlin folder.

Double click the Marlin.ino file to launch the Arduino IDE with the configuration files.

The Arduino IDE will open with a number of tabs - click on the Configuration.h tab, this is where we will make the changes to the firmware file before uploading it to the Arduino.

Before we can upload the file you will need to configure the port and Arduino type in the IDE. Click Tools, then Board and select the Mega. You will need to know the port the board is on, in a PC this can be found under Device Manager "Ports" - Control Panel then Device Manager, look under Ports.

In the IDE click Tools then Port and select the correct port.

In the configuration.h tab some changes need to be made:

#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.

change none to your name - you can also add a revision level if you want rather than "default config"

#define STRING_CONFIG_H_AUTHOR "(Steve, default config)" // Who made the changes

#define BAUDRATE 250000

make sure BAUDRATE is 250000


change to:


look for:

#define TEMP_SENSOR_0 -1
#define TEMP_SENSOR_1 -1

#define TEMP_SENSOR_2 0


change to:

#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0

#define TEMP_SENSOR_2 0


look for:

#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.0*8/3,760*1.1} // default steps per unit for Ultimaker

change to:

#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,4000,473}

These are the steps for x,y,z,extruder - based off the Prusa calculator

A 20 tooth GT2 pulley requires 80 steps, M5 threaded rod for the Z-Axis requires 4000 steps. The extruder value will change when we calibrate it.

look for:

#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (mm/sec)

change to:

#define DEFAULT_MAX_FEEDRATE {500, 500, 2, 25} // (mm/sec)

this is the feedrate and the Z rate must be reduced to 2 or the motors will just buzz and not move

look for:

#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves

change to:

#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves

look for:

#define DEFAULT_XYJERK 20.0 // (mm/sec)

change to:

#define DEFAULT_XYJERK 5.0 // (mm/sec)

These values have worked for me in the past

Also check the endstop settings:

const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops

const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops

const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops


#define X_HOME_DIR -1

#define Y_HOME_DIR -1

#define Z_HOME_DIR -1

Save the file, then upload to the Arduino

Step 19: Testing and Making the Axis Move

At this point it's almost done.....

We need to test a few things, then position the frame in the chassis to make sure the print bed is in the correct position, then get the Z endstop working, finally calibrate the extruder steps.

Power up the 12v and plug the USB cable into your computer.

Start Pronterface, click on Settings, then Options, then User Interface. Check the box Display temperature gauges

Click OK to go back to the main interface. You should see the temperature gauges.

Select the correct COM port and make sure the baud rate is 250000.

Click connect - you should see the printer info load in the right side pane and the temperature of the heat bed and hotend on the gauge. If you don't see any printer info then check the COM port and baudrate


First test the endstops, move the carriage and bed off the endstops so the switches are open, then in the bottom right put M119 in the box and click send. You should see all endstops as open. Hold each one down in turn and repeat the M119 command, it should show as triggered. If they aren't working correctly check the previous steps. Don't go on until they are working correctly

Heated Bed

You should see the bed and hotend temperature at around room temperature. Set the bed temperature to 60c and click "Set" You should see the temperature gauge rise as the bed heats and then level out at 60. It will over-shoot a little then come down as the bed switches off and back on. The cooling fan in your powers supply will probably come on as the bed pull amps from it.


Load PLA filament into the extruder then set the temperature to 185c and click "Set" The temperature should rise fairly fast. Once at temp I just turn the large extruder gear to feed filament. You can also use Pronterface to extrude filament. Try 50mm at 80mm/min. Later we will calibrate the firmware with the correct extruder steps. if you click "Extrude" and the filament goes in the wrong direction, power everything down (both 12V and USB power) and reverse the extruder plug on the RAMPs board

Turn off both the bed and hotend


Check the nozzle fan is blowing onto the fins and not outward.

For the D9 fan that is used to cool the piece being printed you can turn it on with a M106 command and off with a M107 command. Make sure it's blowing toward the piece, if not reverse the fan in the holder.

Axis motors

The axis usually will only move in one direction until they are homed - as at power up the printer firmware has no idea where the axis are. We need to test the direction of the motors. Move the axis to the center on the bed

Click the X plus 10, the carriage should move to the right, a X minus 10 should move the carriage to the left

Click the Y plus 10. the bed should move forward, a Y minus should move the bed back.

Click the Z plus 10, the carriage should go up. a Z minus should move the carriage down.

If any are wrong, power everything down and rotate the plugs on the RAMPs 180 degrees.

Power everything up and test again. If they are OK try home the X and Y axis. If you are using MIN endstops like in this build the X should go to the endstop on the left and the Y to the endstop at the back.

If the motors just buzz and the carriage or bed just sit there, power everything down and try swap the drivers around on the RAMPs. I found one of the drivers in my kit was faulty and used the spare. Also check the voltage again and try bring it up to .8v to .9v You don't want to go too high on the voltage as the driver will run hot and shutdown during a print

Now onto the Z stop - have a look at the pictures. For the initial setup I put the bolt through the top mount off the X-axis motor and tighten it down. I then thread on the long nylon nut on the bottom. With the glass (with blue painters tape) on the bed I home the Z-axis being ready to trip the switch myself if the nozzle is going to crash into the bed. Use a piece of paper between the nozzle and bed and adjust the bolt until you feel the paper drag when you move it. Tighten the metal nuts/bolts tight. Now you have a fine adjustment with the long nylon nut. When I am prepping for a print with bed and nozzle at temperature I home the z-axis using the paper as a feeler gauge and then just turn the nylon nut for adjustment (while using Prnterface to home the Z axis)

Move the carriage up and measure the distance from the table to the bottom 8mm smooth rod on the x-axis (you will need to move the X endstop out of the way. Check the left side first - I use a small piece of plastic/ood/notepad (something small and solid) and lower the z-axis 1mm at a time until it just slides in, then move it to the right side and if it isn't the same turn the right side z-axis up or down (via the coupler) so it's the same as the left side - basically you are enduring the smooth rod is parallel to the table. You may need to click "motors off" in Pronterface.

Finish by checking the other 3 corners of the bed. A handy tool is a "ball-socket" hex allan key. They can be found on ebay and are often sold as a hex key for tattoo machines.

Typically before printing, the bed and hotend are brought up to there operating temperature before then the z gap is measured and adjusted.

Step 20: Calibrate the Extruder Steps

Heat the hotend and prime it with some PLA filament.

Measure from where the filament goes into the extruder and make a mark on the filament at 100mm and 120mm from there.

In Pronterface extrude 100mm of filament at a speed of 80 mm/min.

Figure out how much was actually extruded and use this equation to correct the steps in Marlins configuration.h

new_value = old_value * (100 / actual_amount_extruded)

In Marlin in a previous step we set extruder steps to 473 (This is what works for the gear set I use)

#define DEFAULT_AXIS_STEPS_PER_UNIT {80,80,4000,473}

So if you extruded 90mm of filament you would need to change this value in configuration.h and upload it to the Arduino. Before you upload it you must disconnect the printer from Pronterface as Pronterface will lock the port out from the Arduino IDE

So the new value in this example would be (100/90) * 473 = 525.56

After uploading go through the steps again until you are between 99 to 101mm actually extruded - or as close as you can get. It's important to get this right or you will either under or over extrude in your prints

Step 21: Slicing and Printing

It's time.....

There are 2 slicers I use that convert a 3d model stl file into gcode the printer will understand.

Cura and slic3r - both are great and free.

I am going to use Cura for this Instructable as it is easier to use in that it has less options than slic3r.

Download and install Cura, select Prusa Mendal i3 as the machine

One of the differences between Cura and slic3r is the way you tell the software how many perimeters you want for your printed piece and how many solid top and bottom layers. You also typically use a percentage of infill when printing a piece, i.e. it's not solid in the middle as it would use too much plastic and take too long.

In slic3r you tell the software you want x number of top and bottom layers and x number of perimeters. In Cura this is stated in mm. So if you have a .4mm nozzle and want 3 perimeters, in Cura you set the Shell thickness to 1.2mm

If you are using .2mm later height and you want 4 top and bottom layers you set the Bottom/Top thickness to .8mm

If the piece being printer has overhangs you will also need to add the support option when slicing the model - since the printer can't print in "fresh air" a support is built up to give the piece something to sit on. When the print is finished the support pieces are broken off.

Update: I have found that it helps to have the Retraction Speed and Distance reduced from the default. During a print that was doing a lot of retraction/extrusion steps in rapid succession the filament would sometimes stop flowing. I think the filament was being pulled too far back into the nozzle and then getting momentarily stuck on the next extrude. The hobbed bolt would then grind a pit into the filament and it would stop flowing (and ruin the print).

I use speed of 30 and distance of 2 and haven't had issues since. I also slow down the first layer speed to 20mm/s from the default of 40 mm/s and this helps with a print that has many small areas for the first layer.

For a first print pick something simple that isn't going to take hours. I like the Keff's Weeping Skeleton Vamipre Mummy Earphone Winder. Download the model/stl file and open it in Cura. Check the images in this step to see the settings I use.

Click File then Save GCode - save the file on your desktop.

In Pronterface connect to the printer, pre-heat the bed and nozzle, prime the nozzle and check the z-axis height, move the z-axis up 5mm or so and clean any filament off the nozzle

Click Load File and select the GCode you just created in Cura. Once loaded click Print.


While printing via Pronterface works it's not the most ideal way of sending gcode to the printer. If the USB cable gets any noise on it or the PC or laptop goes into a sleep mode and "wakes up" the USB port will reset and stop the print.

A better way is to use an LCD screen with SD card reader built in. I typically slice the model on my laptop, copy the gcode to an SD card, prep the printer with Pronterface and print off the SD card.

Step 22: What Next?

Start by using PLA filament, it is a lot easier to print with than ABS.

ABS required a constant temperature around the printer, if there is a change of temperature in the room the print can lift off the bed. I have found BuildTak is the best surface for printing ABS on (at 65c). Though relatively expensive (compared to kapton tape or hairspray) it has helped me get constantly good prints from ABS. Also having a shroud or enclosure helps keep a constant temperature around the printer. At the hackspace we used an Ikea "lack" table upside down with clear acrylic panels

Once you are getting successful prints there are a number of things you can add to make printing easier.

A spool holder being one of the first - there are many designs on Thingiverse.

An LCD display with SD card holder. Depending on the display type you will have to uncomment a line or lines in Marlins configuration.h file and upload it to the Arduino

If you find the RAMPs drivers or MOSFETs are getting hot this is a great design for a 40mm fan holder - splice into the 12v you use for the nozzle fan.

It's also a great idea to print a set of spare parts or a set of parts for someone else.

I welcome feedback and questions on building a Prusa i3 printer and will update the Instructable if a step needs clarification.