Introduction: Proto - the 3D Printed BattleBot

About: I am a high school graduate from Palos Verdes, and have been admitted to California Polytechnic University, San Luis Obispo. I have always loved building and creating my own things, whether it be with a 3D pri…

BattleBots is one of my favorite TV shows. If you don't know what it is, in a nutshell it's a show where builders create robots to fight one another. As a fan, I have wanted to build my own for a long time. This is the 4th version of my design and after many hours thinking and redesigning, I am proud to showcase my finished bot, Proto. I have put a lot of thought and effort into making this work, with all of its features.

I chose to glue down only certain parts to keep my options open if I eventually wanted to swap parts, for example: a faster motor. The supplies for this robot can run expensive, but the finished product is well worth the cost. I happened to have some of these parts from my previously failed mini-drone project (I have made a successful drone as well don't worry).

Putting this robot together does not take much time at all, aside from waiting for glue to dry. Many of the connections are plug-in and there is very little soldering involved. Glueing was tricky but after finding the right clamps it went very well.


For this project, I used Autodesk Fusion 360 to design and export my parts, Simplify3D to create the .gcode files, and a Qidi X-Pro 3D printer. Here are the supplies that I used but feel free to deviate a little for a better price or faster shipping (just make sure that the new parts are compatible with the others):

-10 cm jumper wires (female to female and male to male)

-6-pin pcb headers (male to female)

-an l298n motor controller

-at least 8x 10mm by 3mm magnets

-a 3s or 4s lithium polymer battery (and charger)

-a drone power distribution board

-2x RS1306 brushless motors (1x clockwise and 1x counter-clockwise) (with hex caps and attachment screws)

-2x 12a electronic speed controllers

-FlySky transmitter and receiver

-Arduino nano with headers

-2x brushed 12v dc motors (between 200 and 600 rpm)

-XT60 to t-plug adapter

-rubber bands (size 16)

-4x 608 bearings


-small flathead screwdriver

-small philips screwdriver

-wire strippers and cutters


-pipe clamps (or similar) for gluing

-soldering iron

-lead free solder (for health reasons)

-PLA / ABS filament ( I used red PLA black PLA and white ABS)

-TPU filament (I used black)

-.stl files located in the next step

Step 1: History

I said before that Proto is my fourth design. I have attached photos of my other three designs so that you could see what they are. I did not get very far with any of them as you may be able to tell.

The first design was called simply "Drum Bot". It was very boxy as I wanted to give the frame the structural support that it needed, which originally meant that I could not round any corners. The main box was just large enough to fit all of the internal parts. I made the back half removable so that I could access the main cavity, but after thinking about it a little, I realized that that would not be good enough for me. I decided to redesign it all. That was on August 19, 2019.

My second design was called "New Bot". I outfitted it with a more curved design to give it more elegance. I still couldn't figure out the right body dimensions to have enough room for all of the internal parts. I wanted to play around with what I wanted the bot to look like in the end, and figure out what size I wanted the wheel to be and what I wanted the bot to look like in the end. I decided to give designing another go on December 27, 2019 (right after Christmas!!)

The third bot I made was completely different. I named it "Rethought" and it was very curved, maybe even too much. I put a lot more into this design than I had on my previous two, likely because I liked the curved body more than the plain boxy type. I ended up deciding not to use this design either, asa the parts didn't fit onto the sides of the body because of all of the curved surfaces. I eventually stopped working on this design on March 14, 2020.

I started to work on Proto in late March of this year. I spent the most time on it, determined to make it work. I combined the elegance of the curved body of Rethought with the functionality of the other ones to make the perfect balance, and eventually a working bot.

Thanks for reading this if you did. I know it doesn't have anything to do with building Proto but I just thought that a little history of this project would be nice.

Step 2: .stl Files

Here are all of the .stl files the I used. I would have attached the .gcode files but my print settings are likely a little different. Here is how many of each you will need:

1x Rear.stl

2x Tire.stl (print one with the left flat side facing down and one with the right flat side facing down for a nicer look)

1x left Wheel.stl

1x Right Wheel.stl

1x Lower Thorax.stl

1x Upper Thorax.stl

2x Motor Bed.stl

2x Cylinder.stl

1x Left head.stl

1x Right head.stl

1x Left Spike Clamp.stl

1x Right Spike Clamp.stl

1x Drum.stl

The video shows how to put parts together except yo have to put the drum in before one of the two arms. It is pretty self-explanatory but I will walk you though it to be sure.

Step 3: Arduino and Fs-ia6

This is how to connect your Arduino to the receiver module. The wiring diagram visualizes these steps.

The Arduino wiring:

Solder the headers onto the Arduino and glue it to the top of the receiver. All of the pins on both the Arduino and on the receiver should be accessible from the top. The Arduino should fit nicely on the cover of the receiver. Cut a black and a red female-female jumper in half and strip all four newly-created ends. Set one black and one red aside for later. Plug the female end of the red jumper into the CH5 (+) pin on the receiver and the black jumper to the CH5 (-) pin on the receiver. Connect a red female-female jumper from the VCC pin on the Arduino to the CH6 (+) pin on the receiver. Connect a black female-female jumper from the GND pin on the Arduino (I used the one closest to the VCC pin but any of them will work) to the CH6 (-) pin on the receiver. Connect a black female-female jumper to the CH4 (-) on the receiver. Connect a different female-female jumper to the CH5 signal (S) pin on the receiver. These last two jumpers will be used later.

Next, connect a colored female-female jumper (it doesn't really matter I just like to keep organized) from Arduino pin 2 to the CH2 signal (S) pin on the receiver. Connect a different colored female-female jumper from Arduino pin 3 to the CH3 signal (S) pin on the receiver. Next connect four female-female jumpers to pins 6, 7, 8, and 9 on the Arduino. Lastly, connect two female-female jumpers to ports A0 and A1 of the Arduino. These last six jumpers will be used in a later step.

To finish up, organize the jumpers with zip-ties or find ways to route the jumpers around each other to keep them in a tight form factor.

Step 4: L298n and Fry's Header

In this step I will show you how to wire the l298n to the motors and the fs-ia6 receiver and Arduino. Again I have attached a wiring diagram to help.

Find your jumpers from pins 6, 7, 8, and 9 on the Arduino and connect them to pins IN1, IN2, IN3, and IN4 on the l298n (IN1 -> 6, IN2 ->7, IN3 ->8, IN4 ->9). Find the jumpers connected to pins A0 and A1 on the Arduino and connect them to pins ENA and ENB on the l298n (A0 -> ENA, A1->ENB). You may have to remove jumper blocks from ENA and ENB before connecting your jumpers to them. All of these jumpers should line up in a straight line.

Fin a black and a red male-male jumper and cut and strip both like before. Insert the stripped end of the red jumpers into the appropriate slots on the l298n as indicated on the diagram. Do the same with the black wires. The non stripped ends will go into the motor terminals.

Find a black female-female jumper and a red female-female jumper and cut and strip them. Insert both black stripped sides into the GND terminal on the l298n and a red stripped end into each (+) terminal (5v (+) and 12v (+)). Connect the 5v (+) red jumper to the CH5 (+) pin on the receiver and a black jumper to the CH5 (-) pin on the receiver.

Grab one of the Fry's headers. Orient it so that it is flat against the floor of the Rear piece and the female end is facing you. Connect the 12v (+) jumper from the l298n to the far right pin (pin 6) on the header and the other GND jumper from the l298n and connect it to the far left pin (pin 1) on the Fry's header. Grab the jumpers connected to CH5 signal (S) pin and CH4 (-) pin on the receiver. Connect the CH5 signal (S) pin jumper to Fry's pin 2 (the one just to the right of the pin on the far left) and the Ch4 (-) pin jumper to Fry's pin 5 (the pin just to the left of the pin on the far right).

Congratulations! The hardest wiring is now complete and you can move on to step 4.

Step 5: Finishing the Rear

To finish the rear piece glue four magnets into the holes around the frame on the front. Polarity matters but as long as you match it up in the next step with the thorax magnets, wrong polarity in this step doesn't matter. Glue all of the parts down that you wish, I recommend at least the Arduino/receiver module and the Fry's Pin to the 'floor' of the Rear piece. I recommend gluing the Fry's header to ensure no wrong orientation when inserting it into the other Fry's pin later.

Next, fit each tire with a wheel by inserting the tire into the wheel until they move as one unit and the flat sides match up. Insert a bearing into the hole where the motor peeks though and move the motor and the wheel unit around until they slide into each other. Once they fit together try not to take them out because the pressure fit will wear off and they will slide apart more easily.

Fry's pin gluing instructions:

Glue the Fry's header down so that the pins read 1-6 from right to left with the open side of the rear facing you. WRONG ORIENTATION FOR THIS LAST STEP WILL CAUSE SMOKE AND POSSIBLY FIRE WHICH CAN LEAD TO INJURY AND DAMAGE, so make sure that the Fry's pin is exactly as described.

Step 6: Thorax Internals

Screw the motors into the motor beds. Glue the motor beds into the holes on the side of the lower thorax module (make sure that the clockwise motor is on the right and the counter-clockwise motor is on the left {when the robot is upright and facing away from you}). Allow the glue to dry for at least 18 hours before fastening the cylinders to the motors with the appropriate hex nuts to the motors.

Solder the wires of the motors to the ESCs (electronic speed controllers) and solder the power wires from the ESCs to the appropriate pads on the power distribution board (positive to positive and negative to negative). Glue the ESCs down in the corners closest to you (with the robot facing away from you) and secure them with tape or springs until they dry (another 12 hours at least). Glue the power distribution board to the center of the lower thorax. Make sure to leave enough space for the battery port to be connected to the adapter and the battery.

Cut a male-male jumper wire in half and strip the ends. Solder the ends to positive (12v (+)) and negative (12v (-))pads on the power distribution board and attach the male ends to Fry's header. They should match the other Fry's header (put your head where the drum will go and orient the Fry's header so that the female end is facing you and pressed against the floor of the thorax, the positive (+) jumper goes to to pin 6 {far right} and negative (-) jumper goes to pin 1 {far left}). MAKE SURE THAT THE FRY'S HEADER IS CORRECT TO PREVENT INJURY AND DAMAGE.

To finish up the Fry's header connect the wires of the ESCs (signal to signal and negative to negative). I connected mine by creating a 3x3 board out of headers and solder. Connect the pins on the left with a line of solder and do the same for the right pins. Plug both ESCs into the grid (the colors should match) so that the colors are on the same line of solder. Plug in male to female headers on the left row and the right row. Connect the signal jumper to pin 2 on the Fry's board and the negative jumper to pin 5 on the Fry's header. Again, THE FRY'S HEADER MUST MATCH MY DESCRIPTION.

Glue the upper thorax to the lower part (this is where pipe clamps come in handy). Use a little extra glue and a little extra pressure clamping the two parts together and let sit for at least 36 hours this time (this is the toughest part to glue as it has little surface area and a lot of pressure on it.

Insert the battery into the upper area of the thorax and the pressure fit should hold it there. Make sure that the battery can plug into the power distribution board a before moving on.

Glue on one, but not both, head piece and secure both parts to a spike clamp piece. After waiting 18 hours for the glue to dry insert a bearing into the gap and fit the drum into the bearing. Make sure that the teeth are facing upwards in front and downwards in the back. Lay down as many rubber bands over the drum on each cavity (I suggest two per cavity) then insert another bearing into the other head and fit it into the drum. Secure the head with glue and another spike clamp, and wait another 18 hours for the glue to dry. Use needle-nose pliers to pull the rubber bands through the gap in each head and around the appropriate cylinder. This can be a bit tricky but it's necessary for the bot to work. Last step, glue the magnets into the holes in the back (make sure the right polarity is facing outward to attract the magnets on the rear piece).

Nicely done! Move on to the next step.

Step 7: Make Sure the Fry's Headers Are Perfect

Last step is to double check the Fry's headers. I looking at the female end on the rear header, the pins should go to, reading left to right, with the back of the robot facing away from you: 1st 12v (+) l298n, 2nd Signal 5 on the receiver, 3rd and 4th empty, 5th negative on the receiver, and 6th the shared ground. THESE MUST BE CORRECT. See the first picture if you are confused or just to ensure that it is wired correctly.

Looking at the male headers on the thorax, they should read, from left to right with the front of the robot facing away from you: 1st 12v(-), 2nd ESC negative, 3rd and 4th blank, 5th ESC signal, and 6th 12v (+). THESE MUST BE CORRECT. See the second picture if you are confused or just to ensure that it is wired correctly.

Step 8: Coding You Arduino

This code uses PWM to read the signals coming in from the remote control, and with the specific transmitter I linked to in the materials list, the numbers will work out. PWM is read through digital pins 2 and 3 and transmitted to IN1, IN2, IN3, and IN4. What goes on in between is how the Arduino transmits a number into a speed and direction for the motor. I have attempted to use analog 0 and analog 1 to control the speed of the motors as well but have not had much success, so I set the speed to output at 100%. Here is the code so that you can copy and paste it into the Arduino IDE and upload it to your robot (I commented everything so that if you are curious you can see what everything does).

int thr; // sets throttle variable

int ele; // sets elevator variable

int lspeed; // sets left motor PWM

int rspeed; // sets right motor PWM

void setup() {

pinMode(3, INPUT); // throttle // left motor control

pinMode(2, INPUT); // elevator // right motor control

pinMode(A0, OUTPUT); // left PWM

pinMode(A1, OUTPUT); // right PWM

pinMode(6, OUTPUT); // left motor FWD

pinMode(7, OUTPUT); // left motor BWD

pinMode(8, OUTPUT); // right motor FWD

pinMode(9, OUTPUT); // right motor BWD }

void loop() {

thr = pulseIn(3, HIGH); // set throttle variable ele = pulseIn(2, HIGH); // set elevator variable

if(thr > 1520){ digitalWrite(6, HIGH); digitalWrite(7, LOW); // if left joystick is pushed forward

lspeed = map(thr, 1520, 1975, 0, 255); // sets left motor speed when joystick pushed forward

} else if(thr < 1440){ digitalWrite(6, LOW); digitalWrite(7, HIGH); // if left joystick is pushed backward

lspeed = map(thr, 1440, 985, 0, 255); // sets left motor speed if joystick is pushed backward

} else{ digitalWrite(6, LOW); digitalWrite(7, LOW); // if left joystick is centered

lspeed = 0; // sets left motor speed to 0

} if(ele > 1520){ digitalWrite(8, HIGH); digitalWrite(9, LOW); // if right joystick is pushed forward

rspeed = map(ele, 1520, 1975, 0, 255); // sets right motor speed when joystick pushed forward

} else if(ele < 1440){ digitalWrite(8, LOW); digitalWrite(9, HIGH); // if right joystick is pushed backward

rspeed = map(ele, 1440, 985, 0, 255); // sets right motor speed if joystick is pushed backward

} else{ digitalWrite(8, LOW); digitalWrite(9, LOW); // if left joystick is centered

rspeed = 0; // sets right motor speed to 0

} analogWrite(A0, 250); // send left motor speed to PWM, constant at 100% (250)

analogWrite(A1, 250); // send right motor speed to PWM, constant at 100% (250)

// this last part is where setting the speed does not work. If you swap out lspeed and rspeed for the two values set

// at 250 then it is jumpy and may not work at all. If you know what is wrong, I would love if you let me know.


Step 9: The Remote

By nature, the fs-i6 transmitter is a drone remote, so the throttle (the joystick on the left) does not return to its vertical position, but the other joystick does. To make the joystick on the right not return to its original position, the remote must be modified. I recommend this step as it makes the robot much less frustrating to drive, but it is not necessary. The bar in the second picture is what we will be removing.

First remove the batteries of the transmitter. Then take the back plate off as well. Only four screws hold it in place and a small Phillips screwdriver works well to take them out. Next, locate the right joystick (it's on the left because the remote is upside-down). Take off the five screws (highlighted in picture 3). Then remove the joystick from its housing to expose the bar that we will now remove.

Remove the bar by sliding it upwards. After that put the joystick back into its housing and screw in the screws. Feel how stiff the right joystick is in comparison to the other one, and if it is much stiffer, loosen the two screws in picture seven. Tightening them makes the joystick differ, and loosening them makes it swing freely. Once they match up, replace the back of the remote.

Thats all! your remote is now perfectly suited for driving your battlebot!

Step 10: You're Done

Finally finished!

To drive, first turn on the remote and set both sticks to the middle area (50% power) before turning your BattleBot on. Plug your battery in and connect the rear to the thorax power your BattleBot. The knowledge labelled VRB is the power knob to the drum. I do not recommend using more than 30% power if anything you care about is closely unless you fully trust your glue and your floor. It can get a little out of control :)

Thanks for reading and I hope you enjoyed this intractable!

3D Printed Contest

Participated in the
3D Printed Contest