3D Printing Contest

Runner Up in the
3D Printing Contest

Hi, this project is dedicated to my son for whom will be born in the coming month, so I named it after my son's nickname "Panda". This is an improved version of cleaning robot with robust features of cleaning such as air suction, sweeper and roller brush. It randomly picks it direction to move, obstacle and cliff detects. Since it is quite a big project to do, it takes almost a full month day and night to draft the mechanical, ID, electrical, and software, and this intructables is going to show you the concept of how to compose a robot like this!

Introduction and how it works (demo of super cleaning force) footage:

Sweeper at work

Sweeper at work2:

sweeper at work 3

Panda in action

Step 1: Brainstorming

My previous robot was done two years ago, due to the space and footprint was so small, I have to connect it to a power source such as PC with a cable dangling in the air, and this makes it so inconvenient while cleaning up the table, so I decided to make a medium size robot in order to replace my old one to clean up my desk, and floor. So get ready and here we go.

Step 2: Materials

Things you need to accomplish the robot are.

Mechanical /ID

1) All the 3D printed parts that include: Top and bottom house, mid housing, 2 battery covers, gear box cover, and dust cabinet,

2) 2 gear motors (135RPM) for the wheels.

3) 1 gear motor (1000RPM) for roller and sweeper.

4) 1 DC 3V motor for vacuuming and fan blade.

5) 1 battery box with 6 slots for AA.

6) 1 battery box with 2 slots for AAA. (Vacuuming)

7) 1 metal spindle and 1 bearing that fit tight to the end of the spindle. (Roller)

8) 3 gears - same size for sweeper)

9) 1 gear with teeth on the side ( to move the sweeper and roller)

10) Two toy car wheels.

11) 1 acrylic board for see through dust cabinet.

12) 1 name badge.

13) Metal bearing ball for front wheel.

14) 1 printed sweeper.

15) 1 printed roller.

16) 30 standoffs and 30 screws,

17) 1 gear for roller's motor.


1) 1 UNO board.

2) Extended shield for UNO.

3) 1 L298 for triggering the wheel.

4) 1 ultrasonic detection sensor.

5) 2 infrared sensors for cliff detection.

6) 1 3V relay (for vacuuming)

7) wiring cables.

8) 1 switch

9) 6 AA batteries

10) 2 AAA batteries.

Step 3: Planning

To reinforce the suction force from my previous version cleaning robot, I added a roller with brushes and sweeper to multiply cleaning force and it makes the robot a completed version of hand made robot. To achieve the roller and sweeper , I tried to think a way not to use motor to drive them ( since it wastes of battery power) but using gears to trigger both roller and sweeper. The video shows the result and idea of that, 3 gears for the sweeper are connected to the roller with 1 motor and it works just fine. This part should be the most difficult part of this project.

Step 4: Measuring and Placement

As usual , you need to do all the measuring of all component that you have in hand in 3D, this includes all the electronic boards, motors, gear, ,,,,etc, this is time laboring job, but worth it when you see the result of that.

Next, the most import part is the placement, since I made the dimension of the robot to a size of 17cm x 17cm, I need to squeeze all the measured components in that space. PLEASE be careful with those wiring cables, you need to take all that into consideration too, for example, UNO's cable to PC has this plug which is quite long, if you don't put that into consideration, you probably will end up not be able to plug the cable when screw tight the board since it will interfere with L298 just right next to UNO. The rest of Dupond wiring cable has this problem so consider all that while you do the placement.

Step 5: Housing

About modelling, please feel free to use any modelling software that suit you, in my case, I using PRO_E for the modelling, You may ignore this part if you are already good at modelling or using PRO_E. Starting with a block with less features (detail) as possible, in ID's jargon, this is called ID master model. All the housings will refer to this in the future. So when you need to adjust all the housings' dimension, all you need to do is adjust this master model, and regenerate all the housing parts, than you will get new dimension for all the housings.

So I planned to have top housing. mid housing, and bottom housing, in the picture with red block shows the master model, I created two surface to indicate the boundary for top, mid and bottom housing. Next, you need to create 3 files named TOP.prt, MID.prt, and BTM.prt. In the green block pic (TOP.prt) , I copy geometry master model's surface and solidify it, also copy the surface to slice out the top casing. The result is as YELLOW block shows. Same copy geometry steps apply to MID and BTM.prt. Once it is done, it will looks like pic4. (Assembly for TOP, MID and BTM )

Next , shell the MID housing to make it 2mm thick. so instead of a block, you need to shell it to give it spare space to squeeze all the components in.

Step 6: Things to Consider When Modelling (1)

My 3D printer only prints 20cm x 15 cm footprint, so certainly my model won't be able to fit in (17cmx17cm), If your 3D printer's print out is big enough, then you can ignore this part. So what I am going to do is, cut TOP, MID, BTM housing into half respectively. So you will get a total of 6 parts together. The benefit for that is you can have more color planning for the device, for my case, purple to the front and bright yellow to the rear, but the disadvantage for that is it weakening the structure, than you will have to apply more screws and reinforce structure to it.

Step 7: Things to Consider When Modelling (2)

My 3D printer's set up is:

  • Resolution: 0.2mm

Imagine you are printing a 0.2mm line, it generally takes up 0.1 extra thickness, lets say, if I want to have 0.1mm gap between 2 parts, you will end up with no gap at all since each part takes up 0.1mm extra space, so in 0,1mm gap scenario, you will get 0.1mm interference of two parts (0.1mm gap minus 0.2mm extra thickness). Put it in simple saying, if you want to have 0.1mm gap, make it 0.3 instead, and you will get a 0.1mm gap in real life.

So in the modelling, the easiest way to do it is.

Finish all housing and placement, and start to apply offset feature to those interact parts.

Step 8: Add Details to the 3D

Since I will put this project to another contest, I am not going to upload STL file but rather to instruct people how to do it, .

The attached file is an edrawing file, so you can flip around and look inside the details of my assembly. I also attached a pic just to show you the layout.

I use no screws to fix all the component in place, but just using two walls with tight gap to clamp the components.

Step 9: 3D Printing

Setting for my printing.

  • Printer: Makebot 2x replicator
  • Printing nozzle temp: 234 degree.
  • Platform: 150 degree.
  • Resolution: 0.2mm
  • Shell : 2 layer.

With support and raft.

Appearance facing the top, and mechanical feature facing the platform.

Using bright color like yellow and white, good thing is that, when you remove the support, support mark is less visible, with darker color, support mark is obvious. This technique only apply to must-have support's appearance surface.

I took 3 times printing trial and error to get all the dimension right.

Step 10: Assembly the Rear

  • Starting by assembly the MID-REAR housing to MID-BOTTOM housing.
  • Apply stand off to MID-REAR and BOTTOM-REAR housing.

Pic shows the structure of hooking, hookup the MID-REAR and BOTTOM-REAR housing.

  • 3. Wire the fan motor and attach fan blade to the motor, place it to the BOTTOM-REAR housing as shown.
  • 4. Wire the wheel motor, attach wheel to the motor, and screw tight the motor to the BOTTOM-REAR housing.
  • Wire the switch and snap it to the hole of MID-REAR and BOTTOM-REAR housing.

Step 11: Spindle, Roller, Sweeper

  1. Attach bearing to one end of spindle and add the roller to the spindle, adhesive the gear as the picture shows to the spindle , place the roller set to the housing, and start to plant brushes to the roller with some adhesive.
  2. Next, place the 3 blue gears to the bottom housing, and screw tight the gear cover as the pic shows, plant some brush to the black thing attached to the blue gear to become a sweeper.
  3. Try to move one gear to see whether it triggers the rest.
  4. Place the motor wired with gear attached to it to the housing,

Step 12: Battery and Assembly

Place the battery in the space dedicated for it. And your REAR half assembly should look like how the pic shows.

Step 13: Front Assembly

Once the rear half assembly is done, what we are going to do is to assemble the front half.

  • Grab your TOP-FRONT housing, flip it over, and screw tight your UNO and L298 boards.
  • Screw tight your TOP-FRONT housing to MID-FRONT housing.
  • Slide the front half assembly to your REAR half assembly through the 2 slots.
  • place your ultrasonic sensor to the MID-FRONT housing as the pic shows.

Step 14: Assembly of BOTTOM-FRONT Housing.

  • place the battery in the battery cabinet, let the cable through the housing.
  • wired the relay to the battery as the pic shows.
  • wired the relay to the fan motor,
  • Weld two cables to the relay, these two cables are for controlling the relay, so once the uno is activated, it will allow the current to flow through the relay and activate the fan motor.

Step 15: Cabling and Coding

At this stage, we will complete the wiring before screw tight the FRONT-BTM cover to the body to complete the device. Connecting the cable need to be consistence with code setting.

int pinLB=6; // define left wheel
int pinLF=9; int pinRB=10; // define right wheel

int pinRF=11;

int inputPin = A0; // define cliff sensor left
int outputPin =A1; // define cliff sensor right

For the fan and roller's motor, just connect to any vacant + and - pin.

Step 16: Final Assemblyi

Screw the FRONT=BTM cover to the assembly. For the see-through cover on the top of the dust collector box, try to put some adhesive to it with the part that holds the rod (hinge), and put the whole set to the assembly. Once done that, screw the REAR-TOP cover to it to complete the assembly.

I also added battery covers to the bottom of the robot to hold the battery and printed out a dust collector box.

Although it takes an enormous amount of time to complete this project, it worth to do it because of sense of accomplishment and I hope you enjoy this instructable.



    • Science of Cooking

      Science of Cooking
    • Pocket-Sized Contest

      Pocket-Sized Contest
    • Spotless Contest

      Spotless Contest

    We have a be nice policy.
    Please be positive and constructive.




    Could you send me the files to print, please?

    Am I blind or are the 3d Print files not anywhere for download? If some could please help me with the 3d print files.

    Thank You

    What material did you use for your print PLA or ABS?

    I am planing to make a replica of it with following tweaks

    1. Lithium batteries

    2. Rotational servo with Ultrasonic sensor

    3.Remote on off using Android mobile and Bluetooth

    4. Powerful motors with a better differential drive system.

    5. Drive the bot wireless with a Bluetooth.

    I got stuck in making the vacuum part. I did not use a roller brush to collect the dust I tried using vacuum but so far ended up with 2 failurs

    Hats off to your work man!

    The only reason I haven't bought a cleaning robot is because my rugs have fringe on them and I am afraid it will get caught up in the robots rollers and damage them, although it doesn't seem to bother my vacuums turbo sweeper.

    Hi Jake

    Great project - I see you have a Roomba in the background of your video - I wonder how it compares? I looked at your Arduino sketch and all the comments are in Chinese. I can see that you speak English well, so do you have a sketch with English comments?


    hi tony, I placed it next to Roomba just to show the size of it, not a totally expert to build a machine like Roomba. For the sketch, will post an English version later.

    just to help I ran the code through translate on google. hopefully this helps

    // Supersonic car (ARDUINO)// L = Left R = Right F = B = before after
    ">#include <Servo.h>int pinLB = 6; // Definition 6 pin rear leftint pinLF = 9; // define Pin Left Front 9int pinRB = 10; // define the right after 10 pinint pinRF = 11; // define the 11-pin front rightint SR; // Right sensor statusint SL; // left sensor statusint inputPin = A0; // define the ultrasonic signal receiving pinint outputPin = A1; // define the ultrasonic signal transmitting pinint Rsensor = 4;int Lsensor = 3;int Fspeedd = 0; // - speedint Rspeedd = 0; // Right Speedint Lspeedd = 0; // left velocityint directionn = 0; // = before after 8 = 2 Left = 4 Right = 6int delay_time = 250; // servomotor stabilization time after the turnint Fgo = 8; // Forwardint Rgo = 6; // turn rightint Lgo = 4; // turn leftint Bgo = 2; // reversingvoid setup (){Serial.begin (9600); // define the motor output pinspinMode (pinLB, OUTPUT); // pin 8 (PWM)pinMode (pinLF, OUTPUT); // pin 9 (PWM)pinMode (pinRB, OUTPUT); // pin 10 (PWM)pinMode (pinRF, OUTPUT); // pin 11 (PWM)
    pinMode (inputPin, INPUT); // define the ultrasonic input pinpinMode (outputPin, OUTPUT); // define the ultrasonic output pinspinMode (Rsensor, INPUT);pinMode (Lsensor, INPUT);

    }void advance (int a) // Forward{digitalWrite (pinRB, LOW); // the motor (right rear) ActiondigitalWrite (pinRF, HIGH);digitalWrite (pinLB, LOW); // the motor (rear left) ActiondigitalWrite (pinLF, HIGH);
    delay (a * 100);}void right (int b) // Turn right (single wheel){digitalWrite (pinRB, LOW); // the motor (right rear) ActiondigitalWrite (pinRF, HIGH);digitalWrite (pinLB, HIGH);digitalWrite (pinLF, HIGH);
    delay (b * 100);}void left (int c) // turn left (single wheel){digitalWrite (pinRB, HIGH);digitalWrite (pinRF, HIGH);digitalWrite (pinLB, LOW); // the motor (rear left) ActiondigitalWrite (pinLF, HIGH);
    delay (c * 100);}void turnR (int d) // Turn right (wheel){digitalWrite (pinRB, LOW); // the motor (right rear) ActiondigitalWrite (pinRF, HIGH);digitalWrite (pinLB, HIGH);digitalWrite (pinLF, LOW); // the motor (front left) Action
    delay (d * 100);}void turnL (int e) // turn left (wheel){digitalWrite (pinRB, HIGH);digitalWrite (pinRF, LOW); // the motor (front right) actiondigitalWrite (pinLB, LOW); // the motor (rear left) ActiondigitalWrite (pinLF, HIGH);
    delay (e * 100);}void stopp (int f) // stop{digitalWrite (pinRB, HIGH);digitalWrite (pinRF, HIGH);digitalWrite (pinLB, HIGH);digitalWrite (pinLF, HIGH);
    delay (f * 100);}void back (int g) // Back{
    digitalWrite (pinRB, HIGH); // the motor (right rear) ActiondigitalWrite (pinRF, LOW);digitalWrite (pinLB, HIGH); // the motor (rear left) ActiondigitalWrite (pinLF, LOW);
    delay (g * 100);}
    void detection () // measure three angles (0.90.179){int delay_time = 250; // servomotor stabilization time after the turnask_pin_F (); // read from the front
    if (Fspeedd <10) // if the distance is less than 10 cm in front{stopp (1); // clear the output databack (2); // back 0.2 seconds}
    if (Fspeedd <25) // if the distance is less than 25 cm in front{stopp (1); // clear the output dataask_pin_L (); // read the left distancedelay (delay_time); // wait for servo motor stableask_pin_R (); // read the right distancedelay (delay_time); // wait for servo motor stable
    Rspeedd) //假如左邊距離大於右邊距離
    ">if (Lspeedd> Rspeedd) // if the distance is greater than the right side from the left{directionn = Rgo; // go right}
    if (Lspeedd <= Rspeedd) // if the distance is less than or equal to the right of the left distance{directionn = Lgo; // Turn Left}
    if (Lspeedd <10 && Rspeedd <10) // if the distance between the left and right are less than 10 cm distance{directionn = Bgo; // go back}}else // add as front no less than (greater than) 25 cm{directionn = Fgo; // move forward}
    }void ask_pin_F () // Measure the distance from the front{
    digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2μsdelayMicroseconds (2);digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10μs, here at least is 10μsdelayMicroseconds (10);digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltagefloat Fdistance = pulseIn (inputPin, HIGH); // read time difference differenceFdistance = Fdistance / 5.8 / 10; // the time into distance (unit: cm)Serial.print ("F distance:"); // output distance (unit: cm)Serial.println (Fdistance); // display the distanceFspeedd = Fdistance; // will enter Fspeedd (former speed) distance reading}void ask_pin_L () // Measure the distance left{
    delay (delay_time);digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2μsdelayMicroseconds (2);digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10μs, here at least is 10μsdelayMicroseconds (10);digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltagefloat Ldistance = pulseIn (inputPin, HIGH); // read time difference differenceLdistance = Ldistance / 5.8 / 10; // the time into distance (unit: cm)Serial.print ("L distance:"); // output distance (unit: cm)Serial.println (Ldistance); // display the distanceLspeedd = Ldistance; // will be read into the distance Lspeedd (left velocity)}void ask_pin_R () // Measure the distance to the right{
    delay (delay_time);digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2μsdelayMicroseconds (2);digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10μs, here at least is 10μsdelayMicroseconds (10);digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltagefloat Rdistance = pulseIn (inputPin, HIGH); // read time difference differenceRdistance = Rdistance / 5.8 / 10; // the time into distance (unit: cm)Serial.print ("R distance:"); // output distance (unit: cm)Serial.println (Rdistance); // display the distanceRspeedd = Rdistance; // will be read into the distance Rspeedd (the right speed)}
    void loop (){SR = digitalRead (Rsensor);SL = digitalRead (Lsensor);
    detection (); // measuring angles and determine where to move to a direction
    if (directionn == 2) // If directionn (direction) = 2 (reverse){back (8); // reverse (car)turnL (2); // move slightly to the left (to prevent card dead alley)Serial.print ("Reverse"); // display direction (reverse)}if (directionn == 6) // if directionn (direction) = 6 (right turn){back (1);turnR (6); // turn rightSerial.print ("Right"); // display direction (left)}if (directionn == 4) // if directionn (direction) = 4 (left){back (1);turnL (6); // turn leftSerial.print ("Left"); // display direction (turn right)}if (directionn == 8) // If directionn (direction) = 8 (forward){advance (1); // normal forwardSerial.print ("Advance"); // display direction (forward)Serial.print ("");}if (SR == 1){back (18);turnR (8);}if (SL == 1){back (18);turnL (8);}Serial.print ("TESTSL");Serial.print (SR);}

    Thanks plucas1. Clever Google manages all but one Chinese comment! I'll copy and paste to restore the formatting.