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.

<p>Am I blind or are the 3d Print files not anywhere for download? If some could please help me with the 3d print files.</p><p>Thank You</p>
<p>What material did you use for your print PLA or ABS? </p><p>I am planing to make a replica of it with following tweaks</p><p>1. Lithium batteries</p><p>2. Rotational servo with Ultrasonic sensor</p><p>3.Remote on off using Android mobile and Bluetooth</p><p>4. Powerful motors with a better differential drive system.</p><p>5. Drive the bot wireless with a Bluetooth.</p><p>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 </p>
<p>Hats off to your work man!</p>
<p>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.</p>
<p>Hi Jake</p><p>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?</p><p>Tony</p>
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.
<p>just to help I ran the code through translate on google. hopefully this helps</p><p>// Supersonic car (ARDUINO)// L = Left R = Right F = B = before after<br>&quot;&gt;#include &lt;Servo.h&gt;int pinLB = 6; // Definition 6 pin rear left<span>int pinLF = 9; // define Pin Left Front 9<span>int pinRB = 10; // define the right after 10 pin<span>int pinRF = 11; // define the 11-pin front right<span>int SR; // Right sensor status<span>int SL; // left sensor status<span>int inputPin = A0; // define the ultrasonic signal receiving pin<span>int outputPin = A1; // define the ultrasonic signal transmitting pin<span>int Rsensor = 4;<span>int Lsensor = 3;<span>int Fspeedd = 0; // - speed<span>int Rspeedd = 0; // Right Speed<span>int Lspeedd = 0; // left velocity<span>int directionn = 0; // = before after 8 = 2 Left = 4 Right = 6<span>int delay_time = 250; // servomotor stabilization time after the turn<span>int Fgo = 8; // Forward<span>int Rgo = 6; // turn right<span>int Lgo = 4; // turn left<span>int Bgo = 2; // reversing<span>void setup ()<span>{<span>Serial.begin (9600); // define the motor output pins<span>pinMode (pinLB, OUTPUT); // pin 8 (PWM)<span>pinMode (pinLF, OUTPUT); // pin 9 (PWM)<span>pinMode (pinRB, OUTPUT); // pin 10 (PWM)<span>pinMode (pinRF, OUTPUT); // pin 11 (PWM)<br> <span>pinMode (inputPin, INPUT); // define the ultrasonic input pin<span>pinMode (outputPin, OUTPUT); // define the ultrasonic output pins<span>pinMode (Rsensor, INPUT);<span>pinMode (Lsensor, INPUT);<br> <br> <span>}<span>void advance (int a) // Forward<span>{<span>digitalWrite (pinRB, LOW); // the motor (right rear) Action<span>digitalWrite (pinRF, HIGH);<span>digitalWrite (pinLB, LOW); // the motor (rear left) Action<span>digitalWrite (pinLF, HIGH);<br> <span>delay (a * 100);<span>}<span>void right (int b) // Turn right (single wheel)<span>{<span>digitalWrite (pinRB, LOW); // the motor (right rear) Action<span>digitalWrite (pinRF, HIGH);<span>digitalWrite (pinLB, HIGH);<span>digitalWrite (pinLF, HIGH);<br> <span>delay (b * 100);<span>}<span>void left (int c) // turn left (single wheel)<span>{<span>digitalWrite (pinRB, HIGH);<span>digitalWrite (pinRF, HIGH);<span>digitalWrite (pinLB, LOW); // the motor (rear left) Action<span>digitalWrite (pinLF, HIGH);<br> <span>delay (c * 100);<span>}<span>void turnR (int d) // Turn right (wheel)<span>{<span>digitalWrite (pinRB, LOW); // the motor (right rear) Action<span>digitalWrite (pinRF, HIGH);<span>digitalWrite (pinLB, HIGH);<span>digitalWrite (pinLF, LOW); // the motor (front left) Action<br> <span>delay (d * 100);<span>}<span>void turnL (int e) // turn left (wheel)<span>{<span>digitalWrite (pinRB, HIGH);<span>digitalWrite (pinRF, LOW); // the motor (front right) action<span>digitalWrite (pinLB, LOW); // the motor (rear left) Action<span>digitalWrite (pinLF, HIGH);<br> <span>delay (e * 100);<span>}<span>void stopp (int f) // stop<span>{<span>digitalWrite (pinRB, HIGH);<span>digitalWrite (pinRF, HIGH);<span>digitalWrite (pinLB, HIGH);<span>digitalWrite (pinLF, HIGH);<br> <span>delay (f * 100);<span>}<span>void back (int g) // Back<span>{<br><span>digitalWrite (pinRB, HIGH); // the motor (right rear) Action<span>digitalWrite (pinRF, LOW);<span>digitalWrite (pinLB, HIGH); // the motor (rear left) Action<span>digitalWrite (pinLF, LOW);<br> <span>delay (g * 100);<span>}<br> <span>void detection () // measure three angles (0.90.179)<span>{<span>int delay_time = 250; // servomotor stabilization time after the turn<span>ask_pin_F (); // read from the front<br> <span>if (Fspeedd &lt;10) // if the distance is less than 10 cm in front<span>{<span>stopp (1); // clear the output data<span>back (2); // back 0.2 seconds<span>}<br> <span>if (Fspeedd &lt;25) // if the distance is less than 25 cm in front<span>{<span>stopp (1); // clear the output data<span>ask_pin_L (); // read the left distance<span>delay (delay_time); // wait for servo motor stable<span>ask_pin_R (); // read the right distance<span>delay (delay_time); // wait for servo motor stable<br> <span> Rspeedd) //假如左邊距離大於右邊距離<br> &quot;&gt;if (Lspeedd&gt; Rspeedd) // if the distance is greater than the right side from the left<span>{<span>directionn = Rgo; // go right<span>}<br> <span>if (Lspeedd &lt;= Rspeedd) // if the distance is less than or equal to the right of the left distance<span>{<span>directionn = Lgo; // Turn Left<span>}<br> <span>if (Lspeedd &lt;10 &amp;&amp; Rspeedd &lt;10) // if the distance between the left and right are less than 10 cm distance<span>{<span>directionn = Bgo; // go back<span>}<span>}<span>else // add as front no less than (greater than) 25 cm<span>{<span>directionn = Fgo; // move forward<span>}<br> <span>}<span>void ask_pin_F () // Measure the distance from the front<span>{<br> <span>digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2&mu;s<span>delayMicroseconds (2);<span>digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10&mu;s, here at least is 10&mu;s<span>delayMicroseconds (10);<span>digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltage<span>float Fdistance = pulseIn (inputPin, HIGH); // read time difference difference<span>Fdistance = Fdistance / 5.8 / 10; // the time into distance (unit: cm)<span>Serial.print (&quot;F distance:&quot;); // output distance (unit: cm)<span>Serial.println (Fdistance); // display the distance<span>Fspeedd = Fdistance; // will enter Fspeedd (former speed) distance reading<span>}<span>void ask_pin_L () // Measure the distance left<span>{<br> <span>delay (delay_time);<span>digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2&mu;s<span>delayMicroseconds (2);<span>digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10&mu;s, here at least is 10&mu;s<span>delayMicroseconds (10);<span>digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltage<span>float Ldistance = pulseIn (inputPin, HIGH); // read time difference difference<span>Ldistance = Ldistance / 5.8 / 10; // the time into distance (unit: cm)<span>Serial.print (&quot;L distance:&quot;); // output distance (unit: cm)<span>Serial.println (Ldistance); // display the distance<span>Lspeedd = Ldistance; // will be read into the distance Lspeedd (left velocity)<span>}<span>void ask_pin_R () // Measure the distance to the right<span>{<br><span>delay (delay_time);<span>digitalWrite (outputPin, LOW); // make ultrasonic transmitter low voltage 2&mu;s<span>delayMicroseconds (2);<span>digitalWrite (outputPin, HIGH); // make ultrasonic transmitter high voltage 10&mu;s, here at least is 10&mu;s<span>delayMicroseconds (10);<span>digitalWrite (outputPin, LOW); // maintain ultrasonic transmitter low voltage<span>float Rdistance = pulseIn (inputPin, HIGH); // read time difference difference<span>Rdistance = Rdistance / 5.8 / 10; // the time into distance (unit: cm)<span>Serial.print (&quot;R distance:&quot;); // output distance (unit: cm)<span>Serial.println (Rdistance); // display the distance<span>Rspeedd = Rdistance; // will be read into the distance Rspeedd (the right speed)<span>}<br> <span>void loop ()<span>{<span>SR = digitalRead (Rsensor);<span>SL = digitalRead (Lsensor);<br> <span>detection (); // measuring angles and determine where to move to a direction<br> <span>if (directionn == 2) // If directionn (direction) = 2 (reverse)<span>{<span>back (8); // reverse (car)<span>turnL (2); // move slightly to the left (to prevent card dead alley)<span>Serial.print (&quot;Reverse&quot;); // display direction (reverse)<span>}<span>if (directionn == 6) // if directionn (direction) = 6 (right turn)<span>{<span>back (1);<span>turnR (6); // turn right<span>Serial.print (&quot;Right&quot;); // display direction (left)<span>}<span>if (directionn == 4) // if directionn (direction) = 4 (left)<span>{<span>back (1);<span>turnL (6); // turn left<span>Serial.print (&quot;Left&quot;); // display direction (turn right)<span>}<span>if (directionn == 8) // If directionn (direction) = 8 (forward)<span>{<span>advance (1); // normal forward<span>Serial.print (&quot;Advance&quot;); // display direction (forward)<span>Serial.print (&quot;&quot;);<span>}<span>if (SR == 1)<span>{<span>back (18);<span>turnR (8);<span>}<span>if (SL == 1)<span>{<span>back (18);<span>turnL (8);<span>}<span>Serial.print (&quot;TESTSL&quot;);<span>Serial.print (SR);<span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
Thanks plucas1. Clever Google manages all but one Chinese comment! I'll copy and paste to restore the formatting.
thanks plucas1
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.
<p>awsome amount of creative time! well explained well done,if you deciide to stop using it just pack it up and send to me. ha.cheers</p>
thank you wood doctor, too bad I am still using it ha, cheers.
<p>Awesome project!</p><p>Congratulations!</p>
thank you
<p>Congratulations Jake-lee!</p><p>This project is very well explained and professionally constructed. </p><p>I am curious about the cost of the components and materials.</p><p>Have you calculated it?</p><p>Bye</p><p>Isacco</p>
I didn't calculate how much I spent, but here we go roughly(price in taiwan): l298- $7. uno- $10 , cliff sensor- $3eachx2 , extended shield-$4 , motor- $5 each x3, gears- 0.5each x4, wheel- $3each x2, battery case-$0.7each x2, ultrasonic sensor-$2 , printing material for 3 colors- $35eachx3, 3v dc-$2, customized acrylic board and rod- $1, relay and switch-$2, sum up- $164, if you just want 1 color, it will be$94. also I didn't include the cost for cables and screws and bearing .
thank your very much for this detailed information<br>isacco
no worries.
<p>your videos DONT play.... says they are set to &quot;private&quot; (fyi)</p>
thnks, I have reset them, didn't notice that.
looks like a lot of time went into this, nice job
indeed, a whole month of devotion of hard work day n night, thanks for the compliment.
<p>You did well documenting this complex project. Very well done.</p>
thanks :-)
thank you

About This Instructable




Bio: I am an industrial designer, nice to find a place like this to share my stuff ,
More by jake_lee_1105:Baby's snot aspirator PANDA 2- DUST SEPARATION VACUUM CLEANER (100% SUPPORT-FREE ) Tortoise's Floating Apartment 
Add instructable to: