ToyREP 3D Printer

Author: thorgal, published on 2015-07-28

Click this button to get the 3D model


ToyREP is a tiny and inexpensive FFD 3D printer designed mostly as a technology demonstrator or child’s toy. The print volume is 100x100x100mm (125x125x100mm with some upgrades) with a cold bed made of polyacrylate. Hot end is a E3D clone for 1.75 PLA or ABS filament with 0.4mm noozle. Using very cheap 28BYJ-48 stepper motors (with Bi-polar hack) in all axis and geared extruder, Arduino Mega 2560 with Ramps 1.4, DRV8825 and modular RepRap construction based on Mendel, Printerbot, Cherry, Prusa i3 and CARP Box ideas. It is designed to use 12V PSU for LED lights that should fit under bed. Power consumption is currently ca 40W when heating just hotend and 15W-20W when printing on polycarbonate bed. Or with 100x100mm PCB heatbed it will consume 75-85W when preheating and 30-45W in total when printing.

On video, bridge test calibration model is printed. During this particular print it is reaching top speeds 30mm/s in X and Y axis, 0.35mm/s in Z axis and extruder can push filament up to 4mm/s. But such speeds requires higher current, so the motors are overheating and eventually the internal gear box or coils of 28BYJ-48 may got damaged.

For a reliable long term print, printer should not exceed 12.5/s in X and Y axis and 1mm/s on extruder with as low current as possible so the real speed will be close to the first layer on the video. Also usage of coolers above stepper motors is highly recommended. You can find such solution among improvements. Despite this precaution I’ve already burned two motors in extruder so consider this until the reason will be found.

More up to date video from October 2015 of ToyREP was captured when Marvin Key Chain was made. Printer is reaching speeds 16mm/s, on X, Y and E motors are fans, DRV8825 stepper drivers are tweaked for precise current control and it is equiped with heatbed. This 11 minute long time laps is showing complete 1h41m long print and is probably most accurate example of printer’s performance.

Other Print Examples

Calibration Box
Bridge Test


All of the information provided about ToyREP 3D Printer is provided as-is and with no warranties. Author assumes or undertakes no liability for any loss or damage suffered as a result of the use, misuse or reliance on the information and content on this project.


ToyREP, although proved working, is still experimental. The whole idea is based on 28BYJ-48 stepper motors, that are capable of driving 3D printer, but their longevity is not tested thoroughly. In two months of usage I’ve burned two motors. Keep that in mind when building it.

To make them last as long as possible:

  • Be very careful when disassembling the motors. Even slight shift of the PCB under the plastic cap can damage tiny wires from coils. You are doing the bipolar hack at your own risk.
  • Set the current as per the specification of the manufacturer.
  • Keep the timing belts as loose as possible. Tight belts would put side stress to the motor shaft. This is very harmful for this tiny motor.
  • Keep the working temperature of motors within manufacturers limits.


Please follow the CC-BY-SA terms.

  • Share freely but give credit or link to the source.
  • You can alter this design with attribution to the original. All subsequent designs have to be released under the same license.
  • Commercial use only with the consent of author.


  1. LED PSU mount and cover with switch for size 111x78x36mm and 129x99x38mm
  2. Frog for print area 125x125mm – uploaded to ToyREP.
  3. Bowden extruder mount – uploaded to ToyREP.
  4. ZMAX without 608ZZ bearings (to prevent wobbling) – uploaded to ToyREP.
  5. Coolers for stepper motors and different motor mount – Use them instead of X1, Y1, Z1&2 and Extruder parts uploaded here
  6. X1_M8 and X2_M8 for quicker z movement – Use them instead of X1 and X2 parts uploaded here
  7. 100x100mm PCB Heatbed by kolardan – Use it instead of polycarbonate plate
  8. 28BYJ-48 Plastic Cap – Use this cover if you want to customize the colour or you break it when disassembling steppers.
  9. Additional extruder gears for hobbed bolts with different spacing between groove and hexagonal head – uploaded to ToyREP
  10. Pulleys for T2.5 and GT2 timing belts of width up to 7mm uploaded to ToyREP files. These Rev2 parts are experimental. Use them only if (for some strange reason) you don’t like original T2.5 pulley.
  11. 120x120mm PCB Heatbed by kolardan – Use it instead of polycarbonate plate
  12. 50mm Long Legs by sobo84 – print it instead of legs placed here.
  13. 3 point levelling for 100x100mm bed by timbologist.
  14. Frog for 120x120mm Aluminum Heatbed with mounting holes 112x112mm apart – uploaded to ToyREP
  15. Remixed extruder with servo for auto bed levelling BranJaq S1 by Branez
  16. Hotend Fan Duct – Use this additional cooler if you want to print PLA
  17. Geared Extruder for 3mm Fillament by TouchWARE – rest of the extruder uses the same vitamins (except for the 3mm hotend)

Planned improvements (no promises :D):

  1. 40 teeth T2.5 pulleys (require also major changes in frog, carriage, X1 and X2) to achieve higher print speeds (around 25mm/s)
  2. Adjustable legs
  3. Direct drive extruder
  4. Fan mount to cool stepper drivers
  5. Mount compatible with Prusa Mendel vertical carriage

Change log


  • Published 3mm Geared Extruder – See Improvement No.17


  • Hotend nozzle cooler published – See Improvement No.16


  • Remixed extruder with servo driven auto bed levelling – See Improvement No.15


  • Frog for commercially available 120x120mm Aluminum Heatbed – See Improvement No.14


  • Added 3 point bed levelling upgrade – See Improvement No.13


  • Printed another example – Marvin Key Chain.
  • Replaced drivers with tweaked DRV8825 with 2R2 reference resistors for better current control. Current lowered down to 100-105mA per coil to reduce overheating.


  • Added 120x120mm heatbed and 50m long legs – See Improvements No.11 and 12.


  • Changed BoM due to fact, that RAMPS 1.4 have to be adjusted from power plugs to screw terminals. Also made minor changes in Instructions and
  • I’ve burned second motor in extruder. Looking for the reason.


  • Prepared pulleys for wider timing belts. See Improvement No.10.


  • The distance of mounting holes on micro switches was corrected. Holes should be 9.5mm apart (not 11mm). BoM re-uploaded.


  • Added two more extruder gears for different hobbed bolts – See Improvement No.9.


  • Added model of plastic cap for 28BYJ-48 – See Improvement No.8.


  • With Courtesy of my friend Dan Kolar PCB Heatbed was published as another upgrade – See Improvement No.7.
  • Minor changes in Description and Instructions related to heatbed


  • Prepared X1 and X2 models using M8 threaded rods for Z movement – see Improvement No.6.


  • Prepared models for motors with four mounting holes – see Improvement No.5.


  • As I already found copies of ToyREP source files on chinese servers, Warning, Disclaimer and Licence Agreement had to be added.


  • Published fan mounts above X, Y and E stepper motor – see Improvement No.5.


  • Added some examples of print quality – see chapter Thing Info – Print Examples.


  • Frog for 125x125mm print area, Z max without 608ZZ bearing, PCB2-1 + PCB2-2 for 129x99x38mm PSU (PSU2) and Bowden extruder fan mount uploaded.
  • Minor changes in Instructions


  • New revision of extruder uploaded as the older one was colliding with some of the blue caps on 28BYJ-48 motors.
  • Prepared instruction how to set up firmware
  • Added LED PSU cover for sizes 111x78x36mm.

Print Settings

Rafts: Doesn’t Matter

Supports: No

Resolution: 0.5mm nozzle, 0.25mm layer

Infill: 30% hexagonal



This page is mostly for the overview. For detailed instructions see the build manual at:



Made for 28BYJ-48 stepper motors with bi-polar hack:
Further reading about this small motor with geared extruder is here:


Arduino Mega 2560 with adjusted RAMPS 1.4 can be embedded into the printer, as well as small 12V 40W+ PSU for LED lights (for 78x111x36mm and 129x99x38mm big PSU now) motors are driven with common stepper driver A4988 or DRV8825 with current set to minimum! You can use 1/8, 1/16 or even 1/32 microstepping – not for precision but better current control. Power plugs have to be changed to screw terminals on RAMPS as plugs cannot be installed in tiny space between Z1 and Z2.


Extruder is geared for better precision and to reduce speed as direct drive would be too quick for the movement speeds this machine can perform. Also to avoid side stress on motors shaft. M8 hobbed bolt is used to drive the filament. Pushed through 608ZZ bearing and in idler also another 608ZZ is used. The motor have power to drive 1.75mm filaments only.

Although this extruder was designed for Hyena hobbed bolt, it can be used also with common hobbed bolt with hexagonal head with spacing 23, 26 and 30 mm between groove and hexagonal head. Basic gear is designed for 23mm, others are distinguished by spacing dimension in the model name.


Chines E3D clone is used as a hot end (it have a little bit longer cold end compared to original). It is secured to the carriage by fan mount. 12V 40W Ceramics cartridge is used as a heat source with some 100k Ohm thermistor. Cooling fan 40x40x10mm have to be used. It is powered directly by 5V from Arduino or 12V from PSU.

Movable parts

For linear movement LM8UU bearing on 8mm smooth rods are used although printed replacement for LM8UU can be used to reduce the price further. My favourite design is this: although I do not have any long term test of them. Models are prepared for T2.5 timing belts as GT2 are harder to print. Pulley have 20 teeth (50mm per turn). The opposite side of the belt is turned around 624ZZ bearing with bigger M6 washer preventing belt to slide of the bearing.
Z axis is pushed by M5 threaded rod. To release stress from motors, threaded rod is suspended from the top, pushed through 608ZZ while centred by 8mm long piece of PVC tube 5/8mm dia tightened from both sides by nuts and washers. Threaded rod is joined with 28BYJ-48 motor by the same PVC tube and tightened by printed Z-joint.

Lengths of smooth rods are listed bellow along witch threaded rods for printer frame.


Endstops are mechanical with flat lever and 2.5mm dia. mounting holes 9.5mm apart. In X and Y axis push pin is already printed on carriage and frog. In Z axis ca 85mm long piece of M3 threaded rod have to be used so the distance of the noozle from bed can be adjusted.

Print area

Use either 120x120x3mm piece of polycarbonate with mounting holes 105mm apart in each corner as a coldbed or 40W PCB heatbed with 3mm glass sheet designed by Dan Kolar. Mounting of the bed is the same in both cases. For glass you will need additional clamps.


Construction is mostly done of M8 threaded rods. Their length are as follows:


  • threaded rod M8x170mm – 4 pcs – in the front and rear frame

X axis

  • threaded rod M8x255mm – 3 pcs – those are parallel with X axis
  • smooth rod 8x245mm – 2 pcs – for X axis

Y axis

  • threaded rod M8x245mm – 2 pcs – those are parallel with Y axis
  • smooth rod 8x225mm – 2 pcs – for Y axis

Z axis

  • smooth rod 8x290mm – 2 pcs – for Z axis
  • threaded rod M5x250mm – 2 pcs – for Z axis movement
  • threaded rod M3x90mm – 1 pc – for Z endstop

This is default/recommended setup for printer with embedded PSU 111x78x36mm and Arduino but without filament spool placed on top of the printer.

If anybody would like to place spool on top of the printer than I would recommend to prolong Z axis smooth rods by a radius of your spool + 20mm and make one additional threaded rod for X axis, which will hold the spool.

I’ve got another slightly bigger PSU at home of size129x99x38. Seems to me, this kind is more common but will also make the printer much bigger. For this one, rods would have to be 10mm longer in X axis and legs, also 20mm longer in Y axis. Print area may then grow up to 125×125 instead of 100x100mm.

The last option is to make entirely plain printer without PSU and Arduino embedded and with print area 100x100mm. For that you may use 15mm shorter rods in X and Y axis direction. It would give you the smallest ToyREP possible.

Otherwise M3, M4 screws and nuts are used. Motors are attached by 3×13 wood screws and endstops are attached by 2,5×10 wood screws.


The only crucial measurement during the construction of ToyREP is distance between Z1, 2 and between legs in X and Y axis direction. The rest is usually placed centred, on the edge of the rod or in such way, that something like Arduino have to fit in between two parts.

For machine with 111x78x36 PSU and/or 100x100mm print area is the distance between Z1 and Z2 120mm. The distance between Z1,2 and front legs is 103mm.

For machine with 129x99x38 PSU and/or 125×125 mm print area is the distance between Z1 and Z2 130mm. The distance between Z1,2 and front legs is 128mm.

Machine without PSU and Arduino and with only 100x100mm print area have the distance 105mm between Z1 and Z2. The distance between Z1,2 and front legs is 103mm.

Putting into operation

Wire Ramps as per the schematic you will find on internet. If You are not using heatbed, than 11A power supply is not used as well as heatbed D08 and heatbed thermistor T1. Keep in mind that ends stops are (from left to right) X_min, X_max, Y_min, Y_max, Z_min, Z_max and last one is I2C bus. You will use X_max, Y_max and Z_min. Before you will try to move the printer, set at least the micro stepping to 1/16 and max 150mA on the stepper drivers!

Following part is a bit of calibration and testing. Read it first, than set basic values to firmware and load it to Arduino. Than return to the points where it is required, measure, recalculate and load again and again until all the steps are completed. For Marlin firmware change the lines as follows (For other firmwares this may be a bit different).


For Arduino Mega 2560 with Ramps 1.4 – one extruder and no heatbed, I am using MOTHERBOARD 33 as the PWM fan may be useful. But you can use different electronics so set it accordingly.

#define MOTHERBOARD 33 // (Power outputs: Extruder, Fan, Bed)  
#define EXTRUDERS 1  

With Marlin 1.0.2+ consult boards.h file to pick the right type of electronics. Instead of MOTHERBOARD 33 it will look like this:



Unless you want to use redundant heat sensor there will be only one thermistor on position T0 for extruder.

#define TEMP_SENSOR_0 1  
#define TEMP_SENSOR_1 0  
#define TEMP_SENSOR_2 0  
#define TEMP_SENSOR_BED 0  

Eventually if using also heatbed change the last line to:

#define TEMP_SENSOR_BED 1   

Some versions of Marlin can show actual power consumption of hotend. Measure the voltage of your PSU under load an put it into equation instead of both 12.0V. 40W Heat cartridge have resistance 3.6 Ohm. Again, you can measure ours precisely with multimeter. Don’t forget that multimeter have internal resistance that you have to measure separately an deduce from measured value.

#define EXTRUDER_WATTS (12.0*12.0/3.6) //  P=I^2/R  

For heatbed uncomment also next line. The resistivity may vary from 3.6-4.8 OHM

#define BED_WATTS (12.0*12.0/4.8)      // P=I^2/R  

If your firmware supports PID for thermal control, than for Chinese extruders with ceramics heat cartridges you can use following numbers. Latter you can use code M303 S200 in Pronterface to find your numbers and place them there instead.

#define PIDTEMP  
#define BANG_MAX 255  
#define PID_MAX 255  

#ifdef PIDTEMP  
  #define PID_FUNCTIONAL_RANGE 100   
  #define  DEFAULT_Kp 16.51  
  #define  DEFAULT_Ki 0.87  
  #define  DEFAULT_Kd 78.47  
#endif // PIDTEMP  

With heatbed you can also uncomment PIDTEMPBED. For ToyREP’s 30W 100×100 PCB heatbed use following numbers. Eventually you can find your own PID with code M303 E-1 C8 S90 in Pronterface

  #define  DEFAULT_bedKp 377.26  
  #define  DEFAULT_bedKi 74.27  
  #define  DEFAULT_bedKd 479.07  


When setting up the printer keep in mind that you have endstops in X max, Y max and Z min.



You should disable steppers when the axis is not moving to prevent overheating.

#define DISABLE_X true  
#define DISABLE_Y true  
#define DISABLE_Z true  
#define DISABLE_E true  

Stepper in Y axis have inverted direction compared to X, Z and E motors.

#define INVERT_X_DIR true   
#define INVERT_Y_DIR false   
#define INVERT_Z_DIR true   
#define INVERT_E0_DIR true  

Also the homing direction is positive in X and Y axis and negative in Z.

#define X_HOME_DIR 1  
#define Y_HOME_DIR 1  
#define Z_HOME_DIR -1  

Print area

The build volume is 100x100x100mm. To begin with, set the printer as follows, but keep in mind this will not align hot end and print area yet:

#define X_MAX_POS 100  
#define X_MIN_POS 0  
#define Y_MAX_POS 100  
#define Y_MIN_POS 0  
#define Z_MAX_POS 100   
#define Z_MIN_POS 0   

#define MANUAL_X_HOME_POS 100  
#define MANUAL_Y_HOME_POS 100  
#define MANUAL_Z_HOME_POS 0  

After the movement is calibrated you will have to return back to this and measure real coordinates of hot end and print area. You will probably have X, Y homing position somewhere around coordinates 108,101mm:

#define X_MAX_POS 108  
#define X_MIN_POS 8  
#define Y_MAX_POS 101  
#define Y_MIN_POS 1  
#define Z_MAX_POS 100  
#define Z_MIN_POS 0  

Homing position is outside the printing area so:

#define MANUAL_X_HOME_POS 108  
#define MANUAL_Y_HOME_POS 101  
#define MANUAL_Z_HOME_POS 0  

Speeds and units

Now speeds, steps per unit and acceleration needs a bit of math and testing.
Motors have 32 steps per turn, the gear is not exactly 1:64, but for the first run and tests it will be OK. I recommend using 1/16 micro stepping. 20 teeth T2.5 pulleys have ca 50mm circumference. M5 have pitch 0.8mm (M8 have 1.25mm). The gear on extruder is 1:4 and hobbed bolt have usually 6.0mm dia. Each 28BYJ-48 motor should be able to do 15RPM for sure. So:

In X and Y it should be capable of = 15×50 = 750 mm/min
In Z = 15×0.8 = 12 mm/min

#define HOMING_FEEDRATE   {750, 750, 12, 0}  

Use these numbers in Pronterface until you will find quicker ones when steps per unit is calibrated precisely.

In X and Y set default steps per unit = (32x64x16)/50 = 655.36 microsteps/mm
In Z = (32x64x16)/0,8 = 40960 microsteps/mm
In E = (32x64x16x4)/(6×3,1415) =6953.59 microsteps/mm

#define DEFAULT_AXIS_STEPS_PER_UNIT   {655.36, 655.36, 40960, 6953,59}  

Later on, you will move the motor in each axis, measure the distance with calliper and adjust the numbers. For eg. if you move the X carriage 100mm in Pronterface, but you measure 99.7mm, or mark 100mm on filament, extrude 100mm and end up with 1mm leftover then:
X = 655.36/99.7×100 = 657.33
E = 6953.59/(100-1)x100 = 7024.20

Do it for X and Y axis separately. You will probably end up with two slightly different numbers. Although pitch on threaded rods is quite precise, there will be the difference due to motor gearbox, so you have to measure Z axis too. You will end up with something like:

#define DEFAULT_AXIS_STEPS_PER_UNIT   {657.33, 657.10, 40757.73, 7024.20}  

Initially set the maximal movement speed to numbers bellow. It is way to much, but will give you a headroom for some experiments. The values represent movement speeds in mm/s.

#define DEFAULT_MAX_FEEDRATE   {50, 50, 1, 5}  

When default axis steps per unit is calibrated you can test the maximal speeds In Pronterface. Slightly rise the mm/min value and move the motor for 100mm in X, Y or 10mm in Z. Repeat this up to the point when the motor do not have enough torque to move. Then return 10% back from the last working value to be sure and use it from now on. There is only one value for X and Y axis, so pick the lower one.

You will end up with something like 2200mm/min in X, 2000mm/min in Y, 21mm/min in Z and 250mm/min on extruder. Divide these numbers with 60 seconds and put them to firmware to prevent future failure.

#define DEFAULT_MAX_FEEDRATE   {30, 30, 0.35, 4.17}  


Acceleration is way different from common NEMA17 motors. I did not find any easy way how to measure or calculate the values. I only have a simple equation. If you are going to move in axis X 100mm, with top speed 30mm/s, it should finish in 100/30= 3.33 seconds. If the maximal acceleration of the printer would be (100×30)/(100/30) = 900, the printer would not almost use it and that is wrong. This machine can do safely 750mm/min in X axis = 12.5mm/s so 100×12.5/(100/12.5) = 156.25. That may be to low, so you will have to elaborate a bit and find your numbers within these limits. For Z and E the numbers are coming out really low with this method, so you will and up doing it try-and-error anyway.

#define DEFAULT_MAX_ACCELERATION   {300, 300, 1, 17}  


It is good idea to force the acceleration whenever the printer is moving, but it gets too slow. The values bellow should be enough.

#define DEFAULT_XYJERK   5.0  
#define DEFAULT_ZJERK   0.01  
#define DEFAULT_EJERK   0.1  

That is mostly it. There is also my working Configuration.h among the thing files for your inspiration. Keep in mind, that your printer may have different limits, so it is really better to set it for your machine.

Required Parts

To keep the price as low as possible, most of the parts are ordered from China with free shipping or bought in local store. BoM is available at:
Here on Thingiverse is also uploaded version of BoM with prices. They are counted with duty tax and VAT valid for Czech Republic. If this do not apply to your orders from China, you can get somewhere around 75-85 EUR for complete and brand new printer. Even less if using some leftovers from previous projects.

License: Creative Commons – Attribution – Share Alike

Tags: 28BYJ-48, 3d_printer, Arduino_Mega, diy, E3D, Geared_Extruder, mechanical_toy, ramps, ToyREP