Introduction: Building a Prusa I3 3D Printer

Edit: updated Instructable here:

Even though we have access to a (sometimes working) 3D printer at our local hackspace my friend Kevin and I decided to build our own from scratch vs buying a kit or finished printer. The reasons being we'd get to learn how they work, we can pick the quality of parts and we like to make stuff.

After looking at various designs we decided on a Prusa i3. We hope to document the build from start to finish, initial calibration and our first prints.

For this Instructable we have obviously used information gathered from all over the Internet and that was a part of the learning process. A great place to start is the RepRap wiki, particularly the section on the Prusa i3

We had a lot of great advice from another friend Rob I met through my day job as an IT support person and also members at our local Hackspace - a big thanks to Ashley in particular.

The Prusa i3 is a part of the RepRap 3D printer family. It is a design from Josef Prusa, and the i3 stands for iteration 3.
It uses either a "single frame" or "boxed frame" and there are many derivatives from the original design. His original single frame uses a water jet cut aluminum frame but for our build we used a derivative - a laser cut plywood frame with braces designed by sgraber. It was cheaper to make and we were able to use the laser cutter at our local hackspace. The rest of the parts were sourced from vendors on AliExpress, eBay and local businesses.

We used the "vanilla" printed parts, but did make some small changes along the way.

To build this printer you should be comfortable with "making stuff", Arduino's, know how to use a multi-meter, solder and also know a little about electronics.

Step 1: Sourcing the Parts

Parts list:

Frame - laser cut 6mm Baltic birch plywood. We bought a 5'x5' sheet from Windsor Plywood - a Western Canadian and North Western US supplier of wood products. I used the "frame-6mm-colored-lines.dxf" design as a basis but narrowed the slots a little to make the 6mm ply fit tighter. You will need 6x 6-32 x 1" bolts and 6x 6-32 nuts to match. You could use 3mm or 4mm x 25mm bolts but we found the 6-32 a better fit.

Printed Plastic Parts - You will find them on eBay from various sellers. We had hoped to find someone local to print the parts for us but went with a set from eBay. If you want to get your own printed look under Josef Prusa's GitHub for the Prusa3-vanilla scad or stl files. You can also search Thingiverse for Prusa i3

Threaded Rod, Nuts and Washers - you will need approx 1 meter of M8 threaded rod and 1 meter of M10 threaded rod. Also 26 M8 nuts, 26 M8 washers, 12 M10 nuts, 12 M10 washers. These are for the frame Y-axis. We used zinc plated threaded rod from Fastenal - but you can find it at some hardware stores, AliExpress and eBay. You will also need 2 lengths of M5 threaded rod and 2 M5 nuts for the Z-axis. The minimum length we could buy was 1 meter. We first bought zinc plated 5mm threaded rod for the Z-axis but it wasn't very straight. The supplier told me this was typical of the cheaper zinc plated threaded rod so I looked for stainless threaded rod which was a lot better quality and very straight.

Smooth Rod - The design we used needs 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. We sourced them from BST Automation via AliExpress. You will also find sellers on eBay and local hardware stores. My mentor Rob tells me not to cheap out on the smooth rod.

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 10 of these. Available from many eBay vendors.

Pulleys, Belts & Idler Bearings - The X and Y-axis travel each use a 20 tooth GT2 pulleys and approx 1 meter of toothed belt. We sourced ours from a local eBay vendor ibi-battery, but you will find them available from a lot of vendors. Also needed are idler bearings. Most i3 designs use either 608zz or 623 bearings. The 623 bearings are tiny and use printed guides which fit over them. You will see what I mean in later pictures.

Stepper Motors - You will need 5 NEMA 17 stepper motors. The NEMA 17 is a stepper motor with a 1.7" x1.7" faceplate. The RepRap wiki has quite a bit of info on them. My mentor Rob suggested this vendor on AliExpress - 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 are unsure then buy from a 3D printer vendor or check the RepRap wiki.

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 sourced ours from SainSmart, but found a cheaper alternative on AliExpress Naturally you can find them on eBay too.

MK2A Heat Bed - As per the wiki article you want to be sure to get a good heated bed. We sourced ours from Botech Eng. There are a lot of other vendors listed on the wiki page. Make sure you get a 214mmx214mm size. You will also need a 3mm thick sheet of glass 8"x8" and blue painters tape or wide kapton tape.

Hot End - The hot end is another place not to cheap out. This blog article explains the difference between the original designs and clones. This wiki article has more info on hot ends. We went with this one from Makerfarm including the install kit.

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.

Extruder - This was included in the printed parts we bought from eBay. It is a "Wades" style

Nuts. Bolts & Washers - You will need different length M3 bolts with washers and regular and nylock nuts. We bought M3 in 10mm, 14mm, 18mm, 25mm lengths. A bag of washers, a bag of regular nuts and a bag of nylocks.

Also M4 bots/nuts to bolt the hot-end to the extruder mount.

Wiring Kit - We bought a generic wiring kit off eBay. You will also need some heavier wire for the 12V connections. We bought a small roll or red and black stranded wire (16awg or 18awg)

Tools you will need:

Allen Keys for the hex bolts

Small sockets for the M3 and M4 nuts

Small adjustable wrenches for the M8 nuts


Long Nose Pliers


Wire Strippers

Soldering Iron

Multi Meter


Heat Gun or Lighter for shrink tube

Step 2: Assemble the Plywood Frame

The frame design uses T slots in it to hold the nuts.

Assemble the frame but placing the nuts into the T slots and bolt from the front of the plywood frame as per the pictures

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, M10 threaded rod/nuts/washers, M8 threaded rod/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 lengths of the M10 threaded rod. Slide on 2 washers, then 2 10mm nuts from each end, then a washer from each end, then a y-corner piece and finish with a washer then a nut. The inner nuts and washers are later used to attach the chassis to the plywood frame. The M10 threaded rod will go front to back.

It should look like the picture above.

Next cut 3x 205mm lengths of the M8 threaded rod and 1x 305mm length of the M8 threaded rod. The longer M8 threaded rod is for the rear of the frame where the slots are cut.

The top front threaded rod holds the y-belt idler pulley.

From left to right it goes nut, washer, y-corner, washer, nut, nut, washer, idler, washer, nut, nut, washer, y-corner, washer, nut. The bottom goes nut, washer, y-corner, washer, nut, nut, washer, y-corner, washer, nut.

The back threaded rods hold the y-axis motor.

The back top from left to right goes nut, washer, plywood frame, washer, nut, nut, washer, y-corner, washer, nut, nut, washer, y-motor mount, washer, nut, nut, washer, y-corner, washer, nut, nut, washer, plywood frame, washer, nut.

The back bottom from left to right goes nut, washer, y-corner, washer, nut, nut, washer y-motor mount, washer, nut, nut, washer, y-corner, washer, nut.

Assemble it as per the pictures and bolt it into the frame for a test fit. From the front face of the frame to the end of the front M10 nut should be 215mm.

Cut 2x 360mm M8 smooth rod for the y-carriage. They fit into notches on the top of the y-corners. You will need to undo the M10 nuts to enable the rod to slide into the groves. Before you place them onto the Y-corners slide 1 LM8UU bearing onto the left rod (when looking from the front) and slide 2 LM8UU bearings onto the right side rod. The smooth rods should be 170mm apart measured on the center-line of the rods when placed into the notches.

Step 4: Y-Motor, Build Frame and Belts

Attach one of the motors to the rear bracket using M3x10mm cap screws. Attach a GT2 pulley to the motor shaft.
The idler in the front uses a 623 bearing which has 2 pieces of plastic on each side of it to make a larger pulley.

Note: some designs use a larger 608zz bearing which doesn't need the plastic pieces. Assemble the idler as per the picture. Attach the Y-belt holder to the build plate with M3x14mm cap screws using washers and nylock nuts. Using zip-ties attach the build plate onto the LM8UU bearings as per the pictures. The last step is to attach the belt. We found it easier by removing the Y-frame from the plywood chassis and flipping it upside down. Start at the Y-belt holder go around the motor, then idler and back to the Y-belt holder. Leave the belt longer than needed at the Y-belt holder and loop it back over itself and zip-tie as per the pictures. Use something like a credit card to press the belt into the notches on the belt holder.

Tip: If you slacken off the front M8 nuts a little before you install the belt, you can tension the belt later by tightening the nuts back out.

Step 5: X-Axis

The X-axis hold the extruder and moves left to right when facing the printer. It holds the LM8UU linear bearings that fit onto the Z-axis smooth rod. It also holds the X-axis motor and idler pulley.

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.

You also need to press 2x 5mm nuts that will be used by the Z-Axis threaded rod. Ours were a press fit but you may have to heat the nut up a little to get it pressed in - be careful with the heat!

Cut 2x 370mm M8 smooth rod for the X-Axis. Slide on 2x LM8UU bearings on the top one and 1x LM8UU bearing on the bottom one. Fit these into the X-Axis. They are a exact fit and the holes in the X-Axis side may need to be cleaned a little - but don't over do it. Ours was a snug fit.

Install the X-idler pulley c/w a 623 bearing on the right side X-mount. It goes together the same as the Y-Axis idler pulley in the previous step.

The extruder will have to attach to the X-Axis carriage. Out plastic kit came with an adapter we had to trim down a little. It is held onto the carriage with 2x 25mm M3 bolts and nuts. The nuts slide into slots on the adapter and the bolts fit from the back of the X-Axis carriage. There are a few different ways of attaching the extruder so test and check fit everything well. At this stage we just test fit everything with the X-carriage not installed onto the smooth rod. Do all this now as it will be too hard once the X-Axis is assembled into the chassis.

Update: The X-Axis smooth rods are 370mm not 350mm

Step 6: Z-Axis and X-Axis Motor/carriage.

The Z-axis moves the extruder/hot-end up and down. It has 2 motors, M5 threaded rod, M8 smooth rod, top and bottom printed plastic mounts and couplers for attaching the M5 threaded rod to the motor spindles.

Attach the Z-Axis bottom mounts to the frame with 14mm M3 bolts, washers and nylock nuts.
Attach 2x NEMA-17 motors to the Z-Axis mounts with 10mm M3 bolts. Temporary mount a top Z-Axis mount and measure the distance between the bottom to the top. We got 320mm - this will be the length of your Z-Axis smooth rod so measure twice and cut once. You could make it longer if you want.

Cut 2x 320mm lengths of M8 smooth rod for the Z-Axis and fit them into the bottom mounts. They should fit flush against the Z-Axis motors.

Fit the X-Axis frame onto the Z-Axis rods and attach it all in place with the Z-Axis top mounts.

Confused? See the pictures.

Attach the X-Carriage to the 3 LM8UU bearings with zip ties.

Attach a GT2 pulley to one of the NEMA-17's. We found that the toothed part need to sit on the inside so the belt would fit through the slots in the X-Ends. Mount the motor with 3x 18mm M3 bolts. Thread the belt as per the pictures making sure to tension it. Start at the X-carriage and press the belt into the slots the same as you did for the Y-belt. Go around the motor pulley, over to the idler and back to the X-carriage. Use zip ties to hold it in place as per the pictures. It was hard to get good tension on the X belt and we will probably print up this design of tensioner once the printer is up and working.

The Z-Axis moves on 2x 5mm threaded rod. We used stainless steel as the cheaper nickel plated threaded rod I found wasn't straight and the supplier said it was typical of the cheaper nickel plated stock. Cut 2x 310mm lengths.

They attach with 5mm x 5mm flexible couplers.Attach the couplers to the Z-Axis motors, thread/screw the rod through the 5mm nuts you placed in the X-Axis mounts and into the top of the couplers. There should be a gap between the motor shaft and the threaded rods so that the couplers can flex - if they are tight against each other then the coupler will not flex.

Once this is all complete then attach the extruder adapter that was test fit in the previous step.

Step 7: Extruder

There area few different designs for extruders. Our plastic kit came with a "Greg's Wade" style.

It consists of a "hobbed" bolt, 3x 608zz bearings, small gear for the motor and a large gear which the hobbed bolt fits into, M8 nuts and washers, a 25mm M3 bolt and nut for the idler, a 10mm M3 bolt and nut for the small gear, a 20mm length of M8 smooth rod, 3x 10mm M3 bolts to hold the motor. For the idler tension you will also need 2x 6-32x2" (or longer) bolts and nuts to match. Also 2x tension springs - we used discarded springs that are found on a car brake-line.

Start by cleaning out the holes where the motor will mount and make sure the 608 bearing fits into the main piece of the extruder.

Slide a 20mm length of M8 smooth rod into one of the 608 bearing and press it into the idler. It should snap into place with a little force.

We used a 25mm M3 bolt and nut to attach this to the body of the extruder. The nut fits on the inside of the tag - check the pictures.

The M8 hobbed bolt fits into the big gear and through a 608 bearing fitted into the large extruder piece. You will have to add shim washers between the gear and the 608 bearing to make sure the hobbing lines up with the guide hole for the filament. A second 608 bearing holds the bolt in place. Test fit and shim as necessary. Use an M8 nylock or 2 M8 regular bolts cinched together to hold the hobbed bolt in place.

The small gear fits onto the motor shaft, we had to ream the hole out a little for a good fit. An M3 nut goes into the slot on the side of the small gear and an M3 x10mm bolt screws through this to hold the small gear against the motor shaft. We filed a flat face onto the motor shaft to help hold the small gear to the motor shaft - if your motor shaft does not have a flat face on it you must file one onto it. If you don't then the gear will slip on the shaft and the filament won't extrude properly.

Bolt the motor to the extruder and test fit the gears to make sure they line up - just make sure the hobbed bolt has been test fitted first and that the hobb lines up with the guide hole for the filament, then make sure the small gear will fit and mesh with the larger gear. There are slots on the main body of the extruder where the 6-32 nuts fit into. We had to file quite a bit of material off ours to make them slip into place, see the pictures. Assemble the 2x long 6-32 bolts through washers and the springs. The correct tension will not be known until you test and calibrate the extruder motor.

At this stage the physical build is pretty much done. Next we will move onto mounting the Arduino Mega c/w RAMPs board and start to wire up the electrics

Step 8: Power Supply

For our Prusa i3 we bought a slim 12V power-supply vs using an old ATX PC power-supply. It's nothing to do with function - it's just a smaller neater power-supply. Kevin laser cut an enclosure for it. The power supply will need to supply approximately 9A for the heat bed and 4A for the hot end. A 350W (29A-30A) is a good choice, though a 20A should work.

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.

We started by cutting the end off a computer power cable, we then crimped spade terminals to the 3 leads. Use the ones with small hooks on the end - this will help stop the terminal from sliding off the screw terminal (see the picture). There is a live, neutral and ground connection - make sure they go onto the correct terminals.

Next to the AC input is 2x 12V DC outputs that go to the RAMPS board.

We used 18awg stranded wire for this. Again we used spade terminals with the hooks. There is an adjustment pot next to the 12V output. Use your multimeter to check the output voltage and adjust if necessary. If you don't have a multimeter go get one! They are needed for this build. As with all the wiring for our project we want to make it neat right from the start - so we got the mesh type cable wrap and used that along with heat-shrink tube to make the ends neater.

Step 9: Arduino, RAMPS and Motor Wiring

On our laser cut frame are mounting holes for our Arduino Mega. Use plastic stand-offs so the Mega sits off the plywood. The holes lined up perfectly though we found we had to file the heads of a couple of the bolts (slightly) as the mounting holes in the Arduino were right next to header pins.

Mount the Arduino to the frame with the USB connector facing the bottom - leave enough space to plug in the USB cable. The RAMPS board mounts on the Arduino.

Before you mount the RAMPS have a read of Step 14 and what we found with the heat-bed and the MOSFET that controls it. Basically we found the MOSFET got very hot even with a heat-sink on it. After reading a number of reprap forum threads we decided to change the MOSFET to a IRLB8743PBF. It would be easier to do this now rather than later - but you may also find the quality of your RAMPS board is better than ours and the standard MOSFET is OK.

The RAMPS board has places for 5 "drivers" one each for the X, Y and Z motors, one for the extruder and a place for an optional second extruder . We are using 4 of the 5 for this build. If your RAMPS board came with the drivers pre-installed onto the board you should remove them and check the jumpers under them. There should be 3 rows of jumpers and depending on how they are jumpered it will affect the stepper motor. According to this chart we need to jumper all 3 pins to get 1/16th of a turn of the motor per pulse/step. So make sure all 3 pins are jumpered. If you don't have jumpers they are the same kind as found on PC motherboards, SCSI hard drives etc. Make sure you fit the driver back into the board with the correct orientation - if you don't you will blow components. The driver also has a tiny potentiometer on it to adjust the amount of current that you give the motor. This will have to be adjusted later - too little current and the motor will not step, too much and the driver will heat up and go into a thermal shutdown.

Once your drivers are installed we can move onto wiring the X, Y and Z motors. We found a wiring kit on ebay which has a selection of 2, 3 & 4 pin ends that fit onto the RAMPS board jumpers. They are the standard 0.1" spacing.

The NEMA 17 stepper motors we need to use 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. 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. When we spliced the wires that run back to the RAMPS we staggered the joins so that if the insulation we used ever broke down the wires wouldn't short. We used small shrink tube on the soldered joins and braided wire sleeves with shrink tube on the ends to make the wiring look neat.

Route the wires where the are out of the way. For the Z and Y motors you can make the length pretty exact as the motors don't move. For the X motor keep in mind that it moves up and down on the Z-Axis. The extruder motor will move both up and down and side to side. At this stage you should be able to wire the X, Y and Z motors. Temporarily mount the extruder c/w motor to figure out how long to make the wires. There will be the hot-end wires and also a fan wire in this "loom" and they should all be routed together - though not necessarily in the same braided sleeve.

Have a look at the RAMPS board, next to the drivers you will see 4 pin connectors for the motors. One each for the X, Y and extruder motors and 2 sets for the Z motors. Plug them in either way around for now (match the orientation for the Z-motors) - we just want to see if the motors move.

Step 10: Making the Axis Move

At this point we wanted to check our wiring and see if the motors would work. To do this you will need to download the RAMPS firmware. (We used Marlin). This can be found in this github repository. Use the "Download ZIP" link and unzip the main folder to your desktop or similar - as long as you know where to find it. You will also need the Arduino IDE if you haven't got it installed. The Arduino IDE can be found here. Current version as of this instructable is 1.0.5. Install the IDE, plug in the USB to Arduino cable, leave the 12V to the RAMPS board off. Open the marlin.pde or marlin.ino file from the Marlin software.

Click the Configuration.h tab and check the following lines:

#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ // build date and time

add the date between the " " like this:

#define STRING_VERSION_CONFIG_H __DATE__ "July 8th 2014 " __TIME__ // build date and time

also the line below it:

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

change the none and default config to something like this:

#define STRING_CONFIG_H_AUTHOR "(Steve, first test)" //Who made the changes.

Find the BAUDRATE line further down

#define BAUDRATE 250000

This should be 250000

Next choose the motherboard type so find:


if it's 7 change it to 33

Since we don't have any temperature sensors hooked up we need to disable them for testing the motor movement.

Find the line:

#define TEMP_SENSOR_0 -1

Change this to:

#define TEMP_SENSOR_0 0

The direction the motors move can be changed by reversing the wiring on the RAMPS board or via the Configuration.h file. Look for the lines:

#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true

#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false

#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true

and change them to:

#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true

#define INVERT_Y_DIR true // for Mendel set to true, for Orca set to false

#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true

We also need to change the number of turns the Z-axis motor makes to move it up and down and also the feed rate of the Z motor

Find the line:

#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.0*8/3,760*1.1}

and change it to:

#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,4000,760*1.1}

Find the line:

#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25}

and change it to:

#define DEFAULT_MAX_FEEDRATE {500, 500, 1, 25}

I usually copy and paste the original line, then comment out the original line with two leading forward slashes, i.e. //

I also put a comment line above it so I know where i have changed the file. e.g.:

// SR changed to temporarily disable the temp sensor

So I can search the file for SR and find my changes and also I can go back to an original setting easily.

Save the changes and test compile the sketch. If it's OK then upload it to the Arduino.


You will have to make sure you have the correct board (Mega 2560) and port selected under the "Tools" menu on the Arduino IDE

Whenever you make a change in the Configuration.h file you will need to compile/upload it to your Arduino for the changes to take effect.

To control the printer you will also need Pronterface software . Download the Printrun-Win-Slic3r for Windows or Mac and unzip it to a folder and run the pronterface.exe file.

Note there is other software like Repetier Host from Repetier Software which will work with the Prusa i3 and have the same functionality as Pronterface.

OK, check that everything is correctly connected to the RAMPS board and that the RAMPS is plugged into the Arduino Mega correctly. Plug in and power up the 12V supply. Plug in the USB cable to your PC/laptop if it isn't already.

In Pronterface check that the correct port and speed are selected, the port will be the same one used to download the firmware to the Arduino, the speed should be 250000. Click the "connect" button. On the right side you should see the software connect and detect the RAMPS board. Look for the Author: it should be the same as what you put in the Configuration.h file. Use the X, Y and Z movement arrows and try move the motors - try move them 1mm or 10mm for now. As you move your mouse over the X, Y and Z grid the directions and distance will highlight. DO NOT try to home the motors at this time - you will need to put end-stops onto the RAMPS board i.e. do not click on the "home" icons. If you accidentally move the motors too far and they reach a limit of travel and try to keep going just unplug your power supply or press the reset button on the RAMPS board.

You can also try the "Extrude" and "Reverse" buttons to test the extruder motor.

If the motors "chatter" and don't move the axis you will need to adjust the small pot on the driver board. Ideally you should use a ceramic/plastic screwdriver as to ensure you don't short anything out. To adjust the driver first disconnect the 12V power to the RAMPS by either unplugging your power supply or pulling the clips out of the RAMPS board, then click the "disconnect" button in Pronterface. Give the pot a slight turn clockwise, connect up everything again, connect to the RAMPS via Pronterface and try again. Keep going up in 1/8th of a turn increments until you get motion. You will probably also find the motor will turn only in one direction. This is normal for now as we don't have end-stops installed and haven't homed the axis - so the software doesn't know how far it can go in one direction or the other.

It was a great moment in our build when we finally got the motors to move all the axis and extruder motor - It's Alive!!

Before we test the end-stops in the next steps we need to make sure each Axis move in the correct direction.

Lets start with the X-Axis, power everything up and open Pronterface, connect to the board, click the X-Axis 10mm minus and the carriage should move from right to left, click the X-Axis 10mm plus and it should move right. If this is backward then power down everything and flip X motor plug on the RAMPS board around. Power everything up and try again.

For the Y-Axis, start with the bed in the middle. Click the Y-Axis 10mm minus and the bed should move toward the back, click the Y-Axis 10mm plus and it should move toward the front. If this is backward then power everything down and flip the Y-Axis plug on the RAMPS board around. Power everything up and try again.

For the Z-Axis when you click 10mm minus the motors should go anti-clockwise and move the extruder down, when you click 10mm plus the motors should go clockwise and move the extruder up. If this is backward then power everything down and flip both Z-Axis plus on the RAMPS board. Power everything up and try again.


1. we found with the cheaper ~$42.00 Arduino/RAMPS combo we got off eBay that the drivers needed adjustment, however a more expensive (~$80.00) combo from SainsSmart the drivers were adjusted and the motors just worked. Part way through our testing I did manage to blow the eBay bought Arduino when I placed a driver board in incorrectly and powered everything up - so be careful with it all.

2. If you have Pronterface open and want to compile/upload changes to the Arduino first click the "disconnect" in Pronterface - this will allow the Arduino IDE to use the port. Once the changes are uploaded you can leave the Arduino IDE open and connect to the Arduino/RAMPS from Pronterface. The Arduino only needs control of the port when you upload the complied changes - no need to close and reload the IDE every time.

3. Save the Marlin file often when changes work. It's a good idea to keep notes on what works and doesn't.

Step 11: End Stops - 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. To home the printer we need to use end-stops, 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/Pronterface software get the signal and knows the movement limit.

For our build we used mechanical switches. The switches can be wired to be normally open (NO) or normally closed (NC). We used 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. 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. We 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 the 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.

We changed all of ours 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

We found the defaults worked.

We placed our Y-Axis end-stop at the back of the printer frame, if you wanted to place it at the front of the frame you would change the firmware line to read #DEFINE Y_HOME_DIR 1 and also change the end-stop wiring to the Y MAX pins on the RAMPS board. That way Marlin knows the Y home position is with the bed forward and to look for the signal on the MAX pins.

Make the changes as above and compile and upload to the Arduino board.

On the RAMPS board are pins for the 3 axis for both the minimum and maximum positions - 6 sets of pins in total. There are 3 pins for each of the X, Y & Z and their MIN and MAX positions - however you only use 2 of the 3 and some documentation we've read suggest you could damage the RAMPS board if you use all 3 of them.

See the attached image of the RAMPS for the correct pins to use.

For the X, Y and Z axis we used the MIN pins - when we clicked X minus in Pronterface the carriage moves left, when we clicked the X home position the carriage moved left to the end-stop, when we clicked the Y plus the bed moves forward, when we clicked the Y home position the bed moves back to the end-stop, when we click Z minus the carriage moves down, when we click the Z home position the carriage moves down toward the end-stop.

A note on the Marlin software and the RAMPS pins:

We placed our Y-Axis end-stop at the back of the printer frame, if you
wanted to place it at the front of the frame you would change the firmware line to read #DEFINE Y_HOME_DIR 1 and also change the end-stop wiring to the Y MAX pins on the RAMPS board. That way Marlin knows the Y home position is with the bed forward and to look for the signal on the MAX pins.

Step 12: End Stops - Setting Them Up & Testing

For our home position we wanted the bed (Y-Axis) all the way back, the X-Axis to the left and the Z-Axis all the way down - this makes the print head home on the front left of the heat bed.

To do this the X-Axis end-stop goes on the left side of the X-Axis, the Y-Axis end-stop goes at the back of the printer and the Z-Axis end-stop goes on the bottom left. Included in our plastic kit were 3 switch holders. We were able to use 1 of them for the X-Axis, but decided to use different designs for the Y and Z axis. Our Y-Axis holder just wouldn't work and while the Z-Axis could have worked there was (IMHO) a better design. For the Y-Axis we used this design from thingiverse, and for the Z-Axis we used this design from thingiverse.

First thing is to use a multi-meter and figure out which wires to use on the switch, if you use a multi-meter with a buzzer that sounds when the leads are shorted and therefore when the switch is closed you will be able to figure out which pair to use that is NO and closes when the switch is tripped.

Use the pairs that are open when the switch isn't tripped and closed when the switch is pressed.

Wire up the switches and plug them into the RAMPS board - looking at the RAMPS from the top - plug in the X end-stop on the first row, miss a row then plug in the Y end-stop, miss a row and plug in the Z end-stop.

See the image above to see where to connect them on the RAMPS board. For testing don't mount the switches in their holder as you first need to figure out if everything works and at first we just want to test that the axis movement will stop when the switch is closed. You only need 2 wires from the switch to the RAMPS board, do not connect a wire to the 3rd pin on the RAMPS. Also when testing be ready to either disconnect the 12V power or press the reset switch on the side of the RAMPS board as if the end-stop switch doesn't work as expected the motor could continue to try drive the axis even though it hit it's limit.

With the end-stop switches plugged in power everything up and connect to the Arduino/RAMPS with Pronterface.

Be ready to unplug the power supply or press the reset on the RAMPS if the following doesn't work...

With the X-Axis in the middle click the X-Axis home icon - the carriage should move left. Press the end-stop switch and the carriage should stop moving.

With the Y-Axis in the middle click the Y-Axis home icon - the bed should move toward the back. Press the end-stop switch and the bed should stop moving.

With the Z-Axis, click the home icon - the carriage should move down. Press the end-stop switch and the carriage should stop.

If things don't work as expected:

1. Make sure the direction of the axis is correct - check in Configuration.h that you changed to mendal as in the previous step, if correct and you did compile and upload to the Arduino you can change the the plug-in on the RAMPS.

2. Make sure the switch is NO and goes closed when pressed and that the logic was changed in the Configuration.h (and compiled/uploaded) as per the previous steps.

3. Make sure the MIN or MAX is configured correctly in the Configuration.h

4. Make sure the leads go to the correct position on the RAMPS board

Step 13: End Stops - Mounting Them

You will need to mount the heated bed onto the bed base. You may want to wire it as per the next step before this - or just mount it temporarily for now. We are using springs between the bed and holder to help level the bed when we calibrate - so make sure you add them when testing the height of the bed vs the Y-Axis end-stop. (search ebay for "reprap springs" to find them)

X-Axis: We used the "vanilla" end stop mount for the X-Axis. It clips onto the top 8mm smooth rod and faces downward. It can be adjusted left to right to get the correct position of the home position of the X-Axis

Y-Axis: Since we couldn't fit the vanilla end-stop mount we had a member of our hackspace print us up this design. It sits behind the printer and is adjustable both up and down and forward and back.

Z-Axis: The vanilla mount would have worked for us, but it had to be mounted on the right side and therefore needed a longer run for the wires. Because we used the alloy couplers between the motor and M5 threaded rod (vs 4mm tubing) the vanilla mounts were a tight fit. I found this design on thingiverse which moved the stop to the left side and was a lot neater.

See the pictures of our mounts - and yes we did cover the wires with braided sleeving.

We also un-soldered the large plugin adapters on the switch and soldered the two wires directly to the PCB, in most cases they interfered with mounting the switch to the mount and we think it looks a little cleaner.

Once everything is in place connect it all up, start Pronterface and test the positions. With the bed installed and the hot-end temporarily installed you will be able to adjust the stops and frame to home the extruder/hot-end to the front left of the bed. You will also have to adjust the 10mm threaded rod on the Y-Chassis to move the bed back or forward so the Y motion covers the whole bed.

Step 14: Heated Bed

A heated bed helps print quality by allowing the printed part to cool slowly and therefore not warp, it also helps the extruded ABS/PLA etc adhere to the bed.


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). We found the standard STP55NF06L got very hot even with a heatsink. After reading a few reprap forum threads on this issue we decided to change the MOSFET to a IRLB8743PBF and found the issue went away. The circuit is also protected by an 11A resettable fuse - the extruder circuit is protected by a similar 5A fuse. See the images. 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. We found that we had to have a small fan blow air over the fuses to keep them cool during the initial heat up of the bed. Once we did this it heated no problem. We may look at changing the fuse out to a 15A unit later.

When attaching the two 12v circuit wires from the heat-bed to the RAMPS make sure they are inserted into the terminal blocks correctly and the screws are tight.

On to the build:

In our build we turned the bed around so the 12V solder pads were at the back of the printer - this was so the wire runs were shorter and didn't run under the bed itself. We used the same 16awg we used for the 12V power supply run. You must use stranded/flexible wires for the 12V heat-bed.

The temperature of the bed is is read by the Arduino/RAMPS by a thermistor (usually 100k). We used a pair of wires from the wiring kit we bought from eBay. Solder the thermistor to the wires and cover the joins with heat-shrink.

The thermistor is attached to the underside of the bed with "kapton" tape. See the attached image.

There is also a hole in the center of the heat bed - this is so if you want to put the thermistor in contact with the glass sheet that usually goes onto the heat bed, you can read the temperature of the glass directly. Due to the shape of our thermistor we stuck with the normal placement against the heat bed itself.

Solder the two 12V wires to the solder pads and then mount the heat-bed onto the frame. With the bed all the way forward measure and cut both sets of wires to length. The 12v bed wires go to the RAMPS D8 position - make sure the screws that hold the end in the terminal block on the RAMPS are tight..

The thermistor wires go to T1 pins on the RAMPS.

We attached out heat bed to the frame with M3 bolts and used springs with washers to enable us to level the bed if needed.

In the firmware Configuration.h file look for the line:


Change the value to what best matches your thermistor - we used a value of 1

Save and upload to the Arduino.

Connect everything up and open Pronterface, connect to the RAMPS and click the box "watch" in the left column above the graph, on older versions of the software it's the "Monitor Printer" at the top of this column.

Also click "Settings" then "Options" then "User interface" and make sure there is a check mark on "Display temperature gauges" - you should restart Pronterface after this.

You should see the bed temperature reading the current room temperature. Select PLA temp from the drop down menu and click the "set" button. You should see the temperature rise in the graph and it will level out at 60c.

On our RAMPS a red LED comes on when the heat bed is on and goes out when the temperature is reached. Once it hits the desired temperature it will cycle on and off to maintain the correct setting.

Hold your hand above the bed (don't touch it - it will be hot!) and you should be able to feel the heat. Try the ABS setting and make sure the bed temperature levels out correctly.

Be sure to click the "off" button before disconnecting from the RAMPS to shutoff the 12V to the bed.

If the fuse trips before the correct temperature is reached try using a small fan to cool the fuses. As mentioned above we found a small fan was needed to help cool the fuse.

You will need a 8"x8" piece of glass - we used 3mm. We covered the glass with blue painters tape to help the first layer of extruded abs/pla adhere to the bed/glass. Another option is kapton tape. Do not let the tape overlap on itself as it will cause the first layer to print incorrectly and therefore every other layer.

Step 15: Calibrate the Extruder

Before you attach the hot-end to the extruder you should calibrate the number of motor steps to extrude an amount of filament (we tested 100mm). Open the marlin.ino file and in the configuration.h tab find the line:

#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,4000,760*1.1} // default steps per unit for ultimaker

We have already changed this line to get the correct number of steps for the Z-Axis. Change the 760*1.1 to 450 and upload the file to the Arduino. Move the Z-Axis up toward the top and put a 200mm length of filament into the extruder and wind it down so it just comes out the bottom. Using a ruler or calipers measure up 120mm from the top of the extruder idler and place a mark on the filament. Start Pronterface and connect to the printer.

Under the extrude button change the amount to 100mm and change the rate to 300 mm/min.

Click the "extrude" button to extrude the 100mm of filament.

Measure from the top of the idler to your mark to figure out the actual amount extruded. i.e. if it measures 30mm then the actual amount extruded is 90mm (120 - 30 = 90)

Use this formula to get the new value for the steps per unit:

new_value = old_value * (100 / actual_amount_extruded)

Using the above example then... 450 * (100/90) = 500

So in Marlin replace the 450 with 500 and try again. Save and upload the changes to the Arduino. You should be able to get within a mm doing this 2 or 3 times.

Our final number was 472 - but it will be based on the gearing etc of the extruder.

If the filament doesn't extrude properly make sure the hobbed bolt is lined up correctly with the guide hole for the filament - if not shim it with washers as necessary. Also try adjust the tension of the idler springs - they may be too tight or loose.

Step 16: Hot End

I thought installing the hot end would be one of the hardest parts of the build and in some ways it was - once wired up it was quite hard to install into the extruder. It helps to use a small nut driver on the bolt head (or use a cap screw and allen key)

Since we bought the hot end kit from Makerfarm we followed their video tutorial on wiring it up - for the most part.

Start by inserting the resistor through the hole in the hot end, Cover the exposed pieces of wire with the heat resistant tubing leaving enough to go into the end of a ferrule. Crimp a ferrule on each end.

Measure 2 lengths of the 18awg wire - keep in mind it has to reach from the bottom right position of the axises to the RAMPS board. Crimp on the wire.

Note: it is a bad idea to solder these wires as the temperature could get to 220 degrees C, enough to melt solder - so this is why crimps are used. Cover the crimps with shrink tubing.

For the thermistor we covered the leads with the temperature resistant tubing and soldered 2 wires from our wiring kit to the thermistor. (our kit was missing the ferrules and I could only source larger ferrules for 16awg wire locally) These were covered with shrink tubing.

Insert the thermistor into the small hole on the hot end and use thin kapton tape to hold it in place. As per the Makerfarm video run thin kapton tape around the end a few times, then tape all the wires just a little further up (below the bottom cooling fins). Fit the hot end into the base of the extruder - our was a really tight fit. Slide the extruder/hot end into the mount and use M4 nuts and bolts to bolt them together. Make sure you don't crush any wires doing this.

We didn't remove the mount from the X-carriage and it was quite hard to get everything together - so it may be easier to remove the mount first. Once we have an operational and tuned printer we will probably look at alternatives to this setup.

With the hardware mounted we connected the 12v wires to the RAMPS D10 terminal block and the thermistor to the T0 pin on the RAMPS. You will need to open the Marlin.ino (or pde) file and change the line:

#define TEMP_SENSOR_0 0


#define TEMP_SENSOR_0 1

This tells the RAMPS that we have a 100k thermistor on pin T0 and we will be able to test heating the hot end.

Save the file and upload it to the Arduino, start Pronterface and connect to the RAMPS, check the "watch" box as per the heat bed step (or "monitor printer" box) and you should see the hot end temperature (should be around room temperature). Next to the "heat:" select 185 (pla) and click the "set" button. You should see the temperature graph rise as the hot-end heats to 185 and of you put your hand close to the hot end you will feel the temperature (don't touch the hot end, it will burn you!). Try the ABS setting too. Make sure to click the "off" button before you disconnect from the RAMPS.

At this stage of the build you can test extruding actual ABS or PLA - raise the Z-Axis, heat the hot-end to the required setting and give it a try. Try extrude 20 or 30mm, you should eventually get fine plastic extruding from the hot end.

Don't leave the hot end at the melting temperature too long without extruding plastic particularly with PLA as it can overheat in the hot end and gum everything up. So after testing click the "off" button.

Step 17: Calibration Before the First Test Print.

At this stage of our build we haven't really done much calibration except for the extruder and the Z-Axis under the #define DEFAULT_AXIS_STEPS_PER_UNIT line.

To find the "steps per unit" for the X, Y & Z axis you can use Jozef Prusa's RepRap Calculator. For the X and Y Axis we used a GT2 pulley with 20 teeth. The motor step angle is 1.8 degrees and they are setup for 1/16 micro step (remember we used 3 jumpers under the driver on the RAMPS). So using those values in the calculator we get a value of 80 for the X and Y.

In an earlier step we changed the Z-Axis value to 4000. This was found using the Steps per millimeter - leadscrew driven systems. Again - 1.8, 1/16 and pick M5 to give 4000.

The extruder value was found as per the previous step by extruding 100mm of filament and calculating the correct step number. So our final default axis steps per unit line looks like this:

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

It goes X, Y, Z, E

To ensure our Z-Axis was level we moved it close to the top of the axis and measured the distance between the top of the X-Ends and the top Z-Axis mount on each side, then manually wound one motor so the measurement was the same on each side. You can also sight the X-Axis smooth rod along the top of the frame to visually see if it is parallel.

Next we moved all the axis to the home positions to level the bed. From the home position move the Z-Axis down so you can just slide a piece of paper between the nozzle and painters tape on the glass, then move the bed forward all the way and adjust the M3 bolt so the paper just slides between the nozzle and tape. Move the nozzle/bed to all four corners doing the same until it's even. You will have to go around a couple of times to get it correct. It's important to get the bed as level as you can as the first layer of the print has to be as accurate as possible as every other layer is built on top of this.

The Pronterface bundle downloaded in step 10 includes "Slic3r" This takes a 3d model and generates G-code. It slices the 3D model into the layers for the 3D printer. Start Pronterface and click "Settings" then "Slicing Settings"

This will start Slic3r. If it starts with a configuration wizard then go through it, if not then click "Help" then "Configuration Wizard".

Firmware Type = RepRap (Marlin/Sprinter/Repetier)

Bed Size = 200mmx200mm

Nozzle Diameter = ours is .35mm

Filament Diameter = 3mm

Extrusion Temp = we used 200C

Bed Temperature = 60C

Step 18: First Test Print

At this point of our build we just wanted to print something - and if you use this instructable as a guide for building your own Prusa i3 you will probably want to as well.

A normal first print is calibration cubes/set - but we chose "Keff's Weeping Skeleton Vampire Mummy Earphone Winder" from thingiverse. It may as well be something useful!

We loaded some PLA into the extruder, started Pronterface, did a "file" then "open" found the .stl file and brought it into Pronterface. After heating the bed and hot-end, we homed the print head and clicked the "print" button.

After a few seconds the printer did a quick "home" then moved to the center of the bed and our print started.

With the minimal calibration we have done the first two prints we did turned out fantastic. As we fine tune and further calibrate the printer we will be keeping notes and hope to have another Instructable on the actual fine tuning andcalibration.

The RepRap wiki also has a great write up on calibration.

When you have finished your print using PLA don't let the filament sit in the heated hot-end, either let the head cool a little (about 10 degrees) then reverse it out or let it cool while you are preparing for your next print. Five or so minutes is OK.