GeekSocket Plug in and be Geekified

RepRap 3D printer revision 2

Previously, I wrote about the first revision of our RepRap machine based on Prusa i3 printer. This is a project which I have been working with my younger brother. I will be talking about the enhancements, issues, and learnings from the second build of the printer.

3D printed printer parts

As soon as we got the first build of the printer working, we started printing printer parts. Basically, the idea is to replace the wooden parts with 3D printed parts which have way better precision.

Finding parts

First we started with printing the parts of Prusa i3 MK3S+. These were the ones which could use as is in our printer. We found the X gantry of MK3S+ complex and thought our printer might have a hard time printing it. Our printer uses Bowden system, whereas MK3S+ uses direct drive, so we decided to find an alternative X gantry.

I asked on the #reprap channel about alternatives, and the recommendation was to look around on We really liked Bowden X-Carriage Mount for E3D V6 by JackWaterfall, as it had options for various type of bed leveling probes (sensor). And we coupled it with an X carriage having 3 linear bearings, as one of our bearings was broken :D

Modifying and building own parts

Our printer’s frame is very different from Prusa i3’s frame. So, we had to modify some parts to fit into the frame made with aluminum L angles. Most of these changes were increasing the height of the parts, adding more holes, and so on.

Along with my brother, I also got my hands dirty on FreeCAD to modify the parts. I also created new parts using OpenSCAD. This was the first time we were doing “rapid prototyping” — printing the designs partially, modifying them, and repeating this once or twice.

Assembling everything

We disassembled the first build of the printer after confirming that we have printed all the required parts. The smooth rods had flex in them with 600 mm length, so we wanted to decrease the size of the frame altogether. We found 500 mm to be pretty standard size, so we started with cutting the angles and the rods accordingly.

We calculated a position for the Z axis motors in a way that the nozzle is at the center of the frame. This ensures that maximum bed area is reachable.

While we were cleaning up the printed parts by removing burr, drilling the holes to ensure correct size etc., something unexpected happened. We got our first order! After finishing the first build, we had listed ourselves as a 3D printing service on Google Maps. Our intention behind this was to provide affordable service to tinkerers like us, keep printing things and learn from it. In order to deliver the print on time, the hustle to assemble the printer and get it working began.

Our plan to use the existing 20 teeth pulley and bearing as idler for X axis didn’t work as expected. The belt was not moving freely within the gantry parts. We had to order 16 teeth pulley and idler, and as usual delivered it within a day.

We used the old bed with this new frame, and got the order printed.

First assembly of the printer

Improving the Y axis

One of the major issues with the first revision was the Y axis and the bed. It was using a plywood base and a thin plywood top with a glass. The top plywood got bent and was having a lot of vibrations while moving. And it was a bit heavy as well.

Due to this instability, we had to manually level the bed1 almost every time we wanted to print something. So, we wanted to have auto bed leveling. It uses a leveling probe (sensor) to detect the distance between the printer nozzle and the bed, and compensates for the differences by moving the head in the Z axis.

Finding the bed plate

Our initial plan was to use an aluminum+glass plate attached to a plywood base with springs and screws. We were not able to find an aluminum sheet. We had seen galvanized iron (GI) sheet being used for creating different enclosures, boxes etc. These sheets are flexible, have an even surface, and are pretty commonly used. The cost was approximately ₹300 for just the size of 350x350 mm.

After hunting more, we found a shop where they had CRC steel sheets. We got a 340x360 mm piece of CRC sheet from scrap just for ₹80. The surface of this sheet was not as even as GI sheet, and it was heavy as well. Another caveat with CRC sheet is corrosion, it gets rusted pretty quickly. To prevent it, we got it powder coated for ₹100.

Now, using a plywood base attached to the rods with CRC sheet, and the glass on top of it would have made the bed even heavier than what it was in the first build. As the CRC sheet is flexible, we were not sure if it can be used in this setup.

After doing some calculations, we decided to use MDF base with CRC sheet directly attached to the rods. With this setup our bed is of 1.6 Kg i.e. around 400 gm lighter that what it was in the first build. We used the remaining MDF sheet as a base of the printer, it made sure that the frame is well secured and has less flex.

Installing the bed leveling probe

We decided to use an inductive proximity sensor as a bed leveling probe. These are cheaper than other type of sensors like capacitive proximity sensors, BLTouch etc. and all of them are equally good as bed leveling probes.

In case of aluminum, the sensing distance decreases to 30-40% as compared to other ferrous metals. With our initial plan of using aluminum sheet in mind, we bought an 8 mm inductive sensor. It can detect aluminum at a distance around 3 mm.

The operating voltage of our sensor is 6v to 36v. Sometimes PNP sensors even work with 5v, that’s the voltage used for the probes/switches in case of Arduino + RAMPS 1.4 setup. 5v didn’t work for our NPN sensor, so we had to use 12v from the power supply. When the probe is triggered, it sends out 12v by acting like a closed switch.

Connecting the probe’s wires directly to the RAMPS will damage the Arduino, so it is better to use some mechanism like a voltage divider. If one of the resistors of a voltage divider breaks, it can just act like a conductor and damage the Arduino. Because of this, we decided to use a mechanism based on octocoupler as shown in this video: DIY Inexpensive Bed Leveling Sensor (Part 1) - YouTube.

Calculating the probe offset

As the probe is not exactly at the same position as the nozzle, we need to tell Marlin firmware about the offset of the probe from the nozzle. We got the X and Y offsets from the Thingiverse page of the X carriage. And we calculated the Z offset with the help of instructions from Calibrating Z-Offset With A BLTouch Bed Levelling Probe - YouTube.

Calculating the Z offset using host software (watch the above video):

  1. Home all the axis with G28
  2. Start heating the nozzle to 140-150℃ (we used 140).
  3. Switch off the soft endstops with M211 S0.
  4. Use Pronterface -0.1 Z movement.
  5. Use M114 to check current value of Z.
  6. Move the Z even further towards the bed with G1 Z-5.32 i.e. with Z current value - 0.01.
  7. This value now can be set with M851 Z-5.32 temporarily.

The value of Z offset is negative because the trigger point of the inductive sensor is below the nozzle, though the sensor is slightly above the nozzle tip. We did a few trial prints to get more accurate value of Z offset.

Configuration changes for enabling Z probe.

You can learn more about auto bed leveling and Marlin configuration in the following links:

Issues in this revision

Here are some of the issues which we faced with this build.

Flex in the frame on Z axis

Both the vertical aluminum L angles are connected with a threaded rod. This part of the frame was wobbling sideways on left and right. In the previous build, we had a wooden block which had more surface area touching the angles, resulting in less wobble. To solve this, we designed supports which can fit into both the top corners.

The angles also had forward and backward movement. We added 5 mm rods connecting the top threaded rod and the base of the frame.

Both of these calculations were tricky. We used basic trigonometry to calculate the angles. We printed 2D projection of the parts on paper and verified if they will fit well. Even with all the calculations, I got the rod length slightly wrong, luckily there was enough rod length to fit it in the part.

This indeed showed that using L angles is not a good choice, so consider using 20x20 or similar aluminum profile instead.

Z axis beam and side support

Printer getting halted due to thermal protection

Marlin comes with thermal protection, which halts the printer when certain conditions are met. It was getting triggered while printing the bridging sections of bigger top surfaces. This happened while printing the Z top supports, but we managed to resume the print by editing the G-code2.

The part cooling fan’s speed was increasing while printing the bridging sections, as these are printed faster than normal areas. Our initial speculation for printer getting halted was the increased air flow reflecting from the print’s surface. Basically, the heated block was taking time to reach the target temperature, causing Marlin to assume that the temperature sensor has been broken.

PID autotuning

Marlin uses PID controller mechanism to reconcile the target temperature and current temperature. PID (proportional–integral–derivative) controller is a continuous feedback loop which keeps calculating the error value and tries to keep the desired state. The controller depends on three constants Kp, Ki, and Kd, which can be calculated by doing PID autotuning.

The nozzle temperature should be normal printing temperature when doing the PID autotuning. In our case, it is only PLA, so we set it to 195℃. We also kept the nozzle near the bed and the part cooling fan at 100% speed to simulate printing conditions.

  1. M106 S255: Set fan speed at 100%.
  2. M303 S195 C10: Run PID autotuning at 195℃, 10 cycles.
  3. M301 P53.22 I5.91 D119.89: Set the Kp, Ki, and Kd values temporarily.

Currently, we keep the part cooling fan turned on at 90% speed after the first 3 layers. The above process should be repeated when there is some change in the printing head, part cooling etc. Configuration changes to set Kp, Ki, Kd values.

Thermal protection

Things were working just fine till winter season came, and this year was colder. Prints started failing immediately as the part cooling fan started. We came up with experimented values for thermal protection with the help of a stopwatch and the temperature graph from Pronterface. Configuration changes for thermal protection settings.

Skipped steps in extruder motor

The extruder motor was starting to skip steps arbitrarily during print. This was happening after we changed the filament spool. First we thought the filament is getting clogged, so we changed the nozzle, but that didn’t help.

After scratching our head for a while, we loosened up the tension adjustment screw. It started working fine after the adjustment. Probably the MK8 extruder was putting too much pressure on the motor, and the motor was failing to put that much power against it.

Not exactly sure why it happened, maybe it was a new filament, or we somehow messed up the adjustment during the assembly.

Waves in the prints along the Z axis

We finally got rid of the waves on the prints! 🎉

This issue has been there since the first revision of the printer, it somehow was gone in the first assembly of this revision. It came back as a nightmare again with the final assembly.

We were not able to solve it even after 10 hours of search and various trials. Our initial thought was Y axis or bed issues like, inappropriate belt tension, flex in the motor holder and pulley, and more. A few more possibilities we came across were bent Z axis rods, Z wobble due to metric nuts, or the threaded rods not being at the center of the motor shaft/coupler hole. Links: Reddit, Reddit.

It turned out that the culprit was bent threaded rods and the Z top holders. The rods were more in height, and they were passed through the holes of the holders. As the rods were bent, their effective diameter while rotating was way bigger than the holes of the holder. The rods were pressing against these holes while rotating, causing the whole X gantry to wobble. This resulted in those weird waves on the prints.

‘Taxonomy of Z axis artifacts’ article from RepRap magazine: issue 1 explains this and some other reasons clearly, it was the thing we were going to read next.

To solve this, we cut the rods to be smaller than the Z top holder. Now, the rods move freely in air, and there is no flex in the X gantry.

Print with and without waves on Z axis

Skew in the frame

We printed a box for a friend, and later found that the angles of that box were not exactly 90°. This was happening because the X axis and Y axis were not perpendicular to each other. Both Z axis angles were not exactly in front of each other, causing misalignment in X axis.

Marlin has a feature called skew compensation, which solves the exact same problem at the firmware level. This was our final assembly, and we felt fixing it physically will be risky, so we decided to use skew compensation to fix the issue. Configuration changes to enable skew compensation.

Skewed print with caliper as reference

Setting up Cura

While Slic3r was working fine, we wanted to explore other slicers as well. We decided to set up and try Cura, as it gives control over a lot of settings and has various plugins. Ultimaker Cura is a free software licensed under LGPLv3+.

Ultimaker Cura is a state-of-the-art slicer application to prepare your 3D models for printing with a 3D printer. With hundreds of settings and hundreds of community-managed print profiles, Ultimaker Cura is sure to lead your next project to a success.
Cura project on GitHub

It took some time to go through all the options, and configure them. We found the following videos and links useful while setting up Cura.

With Cura, the printer was waiting to reach the desired nozzle temperature before starting with bed leveling. This was happening due to code added by Cura. You can read more about it on community forum at Can I put the start g-code before heating? and Cura Settings and replacement patterns.

Having the following start G-code made it work the way we wanted:

M104 S{material_print_temperature_layer_0} ; set temperature
G28 ; Home
G29 ; ABL
G1 Z15.0 F6000 ; Move the platform down 15mm
M109 S{material_print_temperature_layer_0} ; set temperature and wait for it to be reached

Final assembly

After finalizing the frame components, bed etc., we disassembled everything. We colored frame parts in black with spray paint. We applied threadlocker to some bolts to make sure they don’t loosen up due to vibrations.

One of the X carriage parts was warped due to heat from the nozzle. Because of this, the fan duct was almost touching the bed, and it was affecting the cooling. So, we got the Hotend_clamp.stl printed in ABS from

We also got the extruder motor clamped to the top side of the printer with the help of custom part.

Box and the wire management

The last thing we did was the wire management. This involved cutting the pins, extending wires, putting up sleeves on all the wires, and more. We also got Arduino and RAMPS fit into a modified 3D printed box.

Photos and videos

Here are some photos and videos of the prints and the printer.

The revision 2 printer on table

Not really bill of materials

We printed 50 individual parts, out of which 4 are unused. Printing took around total 80 hours.

List of the printed parts (click to expand)
Part name Link Comment/Modifications
Z axis top Prusa i3 MK3S
Z axis bottom Prusa i3 MK3S
X carriage back thing:2752106
X carriage assembly thing:2023947
X end idler Prusa i3 MK3S Addes extra holes for rod adjustment
X end motor Prusa i3 MK3S
Y motor holder Prusa i3 MK3S
Y belt idler Prusa i3 MK3S Increased the height and added a hole at the bottom
Y rod holder Prusa i3 MK3S Increased the height
Y belt holder Prusa i3 MK3S Increased the height
Y belt tensioner Prusa i3 MK3S Increased the height
Z support plates Own design Plates to support the Z parts on L angles
LM8UU holder thing:2640562 Modified the bearing hole to be 15.3 mm
Z beam support Own design
Z side support Own design Connected with 5 mm rods
GT2 pulley hole pad Own design
X endstop thing:612028 Added slot for belt
Y endstop Own design Plug for bed and endstop
Controller Case thing:1818162 Added latch, support for 5015 fan, wire management plate
X carriage wire holder Own design
Extruder motor clamp Own design
List of the parts used (click to expand)
Item Source
5015 cooling fan
8mm NPN inductive proximity sensor
Braided sleeve
Spiral wrapping band
5015 vortex turbo cooling fan
GT2 idler pulley
GT2 pulley 16 teeth
MDF sheet local shop
CRC sheet local shop
Nut, bolts, washers IndiaLocalShop, local shop

Buying filament

The first orange color PLA filament spool we bought on Amazon was from 3idea Technology. We didn’t face any issues with the filament, and the winding was not that great (it didn’t tangle though). Later we bought gray color PLA from their website. The winding was far better than the orange one. Probably they are improving the winding quality. Checkout the 3idea filaments on

We are only buying filaments from them, which might not have major manufacturing defects or packaging issues. So, our experience so far has been fine (most other reviews about them on Google Maps are mixed and are about printers). Also, we haven’t bought any other type of filaments like ABS or PETG yet. I will keep this section updated as I buy more filaments from them.

What’s next?

This second revision of the printer came out to be really good. The print quality is far better than what we had in the first revision. Next we are planning to go through Teaching Tech 3D Printer Calibration which will help us increase the print quality and speed.

We might use a glass with aluminum foil or a GI sheet as bed top instead of the CRC sheet. That way, the printing surface will be smoother and even.

Based on the issues we faced in this revision, following are the major changes we plan to do in the next revision.

  • More stable frame using 20x20 or 20x40 aluminum profile.
  • Better part cooling from all the sides.

  1. This basically meant moving the print head to all four corners of the bed. And then adjusting the gap between bed and nozzle using the screws holding the glass top. ↩︎

  2. We were able to follow the HOW TO: Resume a failed 3D print! - YouTube video by CNC Kitchen. As it was a bridging section, it was easier to find the approximate position using PrusaSlicer’s G-code viewer. Checkout the companion blog post for the video GUIDE: Resuming a failed 3D print — CNC Kitchen, it has details on what to do if the G-code has absolute extrusion amounts. Slic3r generated G-code was using it in our case. ↩︎


Comments are not enabled on this site. The old comments might still be displayed. You can reply on one of the platforms listed in ‘Posted on’ list, or email me.