Short Description:

Build your own DIY giant robot that plays the piano, draws pictures, prepares meals, waters plants, engages in lightsaber duels and more. The Multipurpose Mobile Manipulator is an advanced open-source human-size mobile robotics platform for students, educators, hobbyists, artists and researchers alike.


Quick Links:

Further documentation

Step 1: Why We Made It

Since the beginning of the 20th century, humans have yearned for machines that could help us in our everyday chores, such as preparing meals, cleaning the house, and watching the kids. Significant progress has been made towards this goal over the course of the past 50 years, primarily through the efforts of large research institutions and universities around the world. In spite of this, development remains rather slow - only a small handful of researchers are working on this, as they are the only ones who have access to the expensive robots needed to perform state-of-the-art robotics research. (To illustrate, Boston Dynamics's ATLAS robot used in the DARPA Robotics Challenge is estimated to have a price tag of well over 1,000,000 USD.)

By providing a research-grade mobile manipulator platform that is low cost, robust, easy-to-use, and large enough to do a variety of human-size tasks, we allow a large number of students, educators, hobbyists and artists from around the world to enter the robotics research ecosystem, accelerating the speed at which intelligent human-size helper robots become a reality. This is where the Multipurpose Mobile Manipulator Mk 1 comes in.

Step 2: Features

The Multipurpose Mobile Manipulator is an advanced research-grade mobile manipulator platform, designed with modularity, accessibility, compatibility and affordability in mind:


  1. The base, arms and chest can be attached and detached for easy transportation and storage.
  2. There are plenty of mounting holes to add custom sensors and electronics.
  3. The top can run independently of the bottom and vice versa.


  1. Open source software gives users unlimited freedom.
  2. Open hardware lets users fully understand how the robot works.
  3. Laptop-for-a-face greatly simplifies the testing and development pipeline.
  4. Arduino Mega makes interfacing with the robot's sensors and actuators a snap.


  1. The robot is compatible with Windows, Mac and Linux.
  2. Libraries for Python 2.7 and Arduino are currently supported.
  3. Libraries for Unity, Processing, ROS, MATLAB, C++, and Scratch are planned.


  1. The entire cost of building the robot (parts and fabrication) is estimated to be 2000 USD.
  2. This makes the robot around the same cost as a modern hobbyist 3D printer.
  3. And a fraction of the cost of similar research grade robotics platforms.

Step 3: Future Work

The Multipurpose Mobile Manipulator is an ongoing work in progress, and many, many more future developments await. The project is spearheaded by a Choitek, a new robotics startup founded by John Choi, a Computer Science and Arts student from Carnegie Mellon University. As a company, we still have very much to learn, and we will do our very best to keep things as open as possible to make the Multipurpose Mobile Manipulator an endeavor for the global robotics community.

Simplifying the Build Process

Understandably, most folks do not possess the resources to produce a Multipurpose Mobile Manipulator on their own (machine shop, laser cutter, et cetera), and working full time, this project is expected to take at least one entire month to build from scratch; part time, it may take far longer. For this reason, we intend to sell a kit by early 2017 so that everyone can be a part of the growing robotics movement. All parts will be pre-fabricated in this kit, and raw assembly directly from a kit is expected to take one or two weekends. Join our mailing list and we will let you know when we are ready to begin delivering kits.

Multipurpose Mobile Manipulator Version 2

Development of the second version of the Multipurpose Mobile Manipulator is already underway with some serious improvements on the mechanical, electrical and software sides, as listed below:

  • Libraries for Unity, Processing, ROS, MATLAB, C++, Scratch, and RobotC
  • Easy-to-use simultaneous localization and mapping system
  • Robot animator system that does not require any coding
  • Arduino Mega 2560 Shield for easy wiring
  • Fully customizable robot face

Right now, we are currently looking for high schools to participate in pilot tests over the course of the 2016-2017 school year, and if you are interested in working with a Multipurpose Mobile Manipulator or have any special requests for the second version, don't hesitate to contact us directly :)

Step 4: Special Thanks

The Multipurpose Mobile Manipulator is made possible in part by generous support from the following programs, organizations and initiatives at Carnegie Mellon University:

Note that the project represents the views of the author and not those of the programs, organizations and initiatives mentioned here.

Step 5: Parts

Here is a comprehensive list of all of the parts needed to build one Multipurpose Mobile Manipulator Mk 1, separated by components for control, actuation, power distribution, and raw materials. The estimated cost for all parts is estimated to be roughly 1500 USD, more or less depending on the suppliers chosen and the materials already owned.


  • Laptop computer
  • A to B USB Cable
  • 1x Large Perfboard
  • 1x Arduino Mega 2560 R3
  • 1x Dual 12V DC Motor Driver
  • 2x A4988 Stepper Motor Driver
  • 4x HC-SR04 Ultrasonic Rangefinders
  • 10x 3ft Servo Extension Cables
  • Red and black 18 gauge wires
  • Assorted colored 22 gauge wires
  • Assorted wire connector headers
  • Female crimp wire connectors
  • Male crimp wire connectors
  • 3x 80mm Computer Fans
  • Assorted Nylon spacers
  • Heatshrink Tubing
  • Spiral Wire Wrap
  • Electrical Tape


  • 2x 5 in Wheels
  • 2x 8 mm Wheel Hub
  • 1x Caster Wheel 2x1x2 1/2 in
  • 2x 12V High Torque DC Gearmotor
  • 2x 12V 150mm NEMA 17 Linear Lead Screw Stepper motor
  • 4x Aluminum Right Angle Stepper Motor Mount
  • 2x Steel Extension Springs, 2.5 in
  • 10x Standard Hobby Servos
  • 4x Large Hobby Servos


  • 2x 12V 8AH Sealed Lead Acid Battery
  • 1x 12V Sealed Lead Acid Battery Charger
  • 1x 12V to 6V DC Step Down Voltage Converter
  • 1x Rocker Switch SPDT 10A
  • 1x Terminal Block Bus Bar
  • 1x Red Emergency Stop
  • 2x Roller Limit Switches
  • 4x XT60 Male Connectors
  • 4x XT60 Female Connectors


  • 1/4 x 1/8 in Threaded Aluminum Rod
  • 24x Aluminum Extrusion Right Angle Support
  • 4x Aluminum Extrusion 20x20x610 mm
  • 8x Aluminum Extrusion Sliding Nut
  • 4-40 Screws, Nuts, Washers
  • 2-56 Screws, Nuts, Washers
  • 6-32 Screws, Nuts, Washers
  • 3D Printer Filament
  • 4x Magnetic Latch
  • 4x Metal Hinge
  • 1/4 in Plywood
  • 1/8 in Acrylic

Step 6: Equipment

Access to a variety of heavy fabrication equipment and various small hand tools are required in order to fully build this robot from scratch! Many of these tools can be dangerous if used improperly, and it is highly recommended to either get familiar with the tools listed below or to enlist the aid of someone already experienced with them. Remember that you are following this Instructable of your own accord: the author of this Instructable is not responsible for any unfortunate circumstances that may arise from building this project.

Heavy Fabrication Equipment:

  • Laser Cutter
  • 3D Printer
  • Shop Drill
  • Band Saw
  • Belt Sander

Small Hand Tools:

  • Assorted Screwdrivers
  • Assorted Hex Keys
  • Soldering Station
  • Assorted Pliers
  • Wire Strippers
  • Wire Cutters
  • Hand Drill
  • Heat Gun
  • Hammer
  • Clamps
  • Files

Step 7: General Assembly Notes

The Multipurpose Mobile Manipulator is divided into three major assemblies: the base, the arms, and the chest. The base contains motors for mobility and batteries to power the robot. The arms contain grippers, shoulder and elbow joints and an extensible arm for interacting with environments. The chest connects all of these together with control electronics and serves as a platform for an intelligent laptop-for-a-face.

Laser Cutting

To begin preparing for assembly, laser cut all of the plates with plywood and make sure all the pieces fit together. Due to the material properties of plywood, slight warping of the wood while laser cutting might make some pieces very hard to fit. To account for this, either use a belt sander or a file to shave bad edges until all pieces fit together as desired.


Many steps of the assembly require screws to be fit on the thin sides of plywood after laser cutting is complete. Because holes cannot be laser cut on the thin side of plywood, you will need to drill screw holes everywhere where screws needed. Do this by aligning the drill with the positions of screw holes after the pieces fit together, and then drill using the screw guide holes on the flat sides of the fit piece. Many screw holes are intentionally made smaller than the diameter of the screws in order to account for the variable burn radius of the laser cutter. Drill these as well until they are the correct size for the screws.

3D printing

Some components on the main robot assembly are designed to be 3D printed. 3D print all of these components, namely the large shoulder plates and the circular spring assist wheels. Further supports can be 3D printed and mounted on the robot at various locations for increased integrity. Additionally, the grippers on each of the robot's arms are adaptable to perform a variety different tasks, where each task has a very specialized set of 3D printable grippers. These are left for the user to design, experiment and iterate upon.

Note: This project is not meant for beginners, and prior knowledge on how to use a variety of software, tools and equipment is required! The following instructions will assume some experience with mechanical assemblies, soldering, electronic layouts, current and voltage, schematics, scripting, hardware troubleshooting, rapid fabrication, Arduino, Python scripting and more. It is highly recommended to read all of the instructions before attempting to build in order to get a general idea of how everything is supposed to work together.

Step 8: Base -- 0

To begin constructing the base of the robot, prepare the base fan and the red emergency stop.

The base fan is a standard 80 mm computer fan with two wires, one red wire for 12 volts and one black wire for ground. Extend the fan's red and black wires by 4 feet using solder and heat shrink. Route the fan wires out through the middle hole. Attach the fan to the first laser cut piece with 4 screws and 4 hex nuts.

The red emergency stop is used to power the base of the robot on and off. Attach 2 feet of high-gauge (recommended 18 gauge) red wires to both ends of the emergency stop, one for each end. Screw the emergency stop to the back of the laser cut piece.

Step 9: Base -- 1

Attach the caster wheel to the laser-cut piece shown in the diagram with 4 large screws. The caster wheel should spin freely on both axes of motion.

Step 10: Base -- 2

Position the first laser cut piece from Base -- 0 with the second laser cut piece from Base -- 1 along with the other two pieces as shown in the image above.

Step 11: Base -- 3

Secure the arrangement of pieces from the previous step with two large side plates as shown in the image above. Fasten the side plates by adding 5 screws to each side plate.

Step 12: Base -- 4

Next, we prepare the bottom plate of the robot's base. The bottom base plate has a terminal block as well as the dual DC motor driver.

The terminal block distributes power to the top and bottom of the robot. When completed, there are 8 high-gauge connections to the terminal block: 4 for power (left row) and 4 for ground (right row). Two XT60 male connectors attach to the terminal block with 1-foot wires for two 12 volt sealed lead acid batteries for a total of 4 connections, 2 to power and 2 to ground. Be extremely careful about the polarities of the XT60 connectors. If flipped, they may cause some very nasty short circuits when hooked up to a live power source.

The last four connections go to the top and the bottom of the robot, two for each. For the bottom, route one red wire to the emergency stop from step Base -- 0 to the power input of the dual DC motor driver. Route one ground wire directly to the ground input of the dual DC motor driver. The emergency stop turns the motor controller on and off.

Add XT60 male connectors with 6 inches of wire for each motor input on the dual DC motor driver,for a total of two XT60 connectors and 4 wires. These are used to connect to the robot's motorized wheels. Additionally, prepare five 4-ft smaller gauge wires (recommended 22 gauge with different colors), and attach them to the control pins on the dual DC motor driver. These will be routed to the top of the robot for control.

When you are done wiring the terminal block and motor driver, screw the terminal block with 2 screws and the dual DC motor driver with 4 screws (you may want to add spacers for the motor driver) onto the bottom plate.

Step 13: Base -- 5

Prepare the back plate of the robot's base by screwing on magnetic latches to the left and right sides of the plate, 2 screws for each latch.

Step 14: Base -- 6

Connect the middle plate and the back plate to the bottom plate and screw them together with two screws as shown in the image. The middle plate will be secured, but the back plate will be loose for now.

Step 15: Base -- 7

Now, connect the assemblies from the Base -- 3 step and the Base -- 6 step, and fasten them together with 4 screws on the bottom plate. All pieces should be reasonably secure at this point. Note that all the 4-ft wires, the 5 wires for controlling the dual DC motor driver and the 2 wires (1 power, 1 ground) for powering the top, should be routed through the middle hole on the top plate of the base.

Step 16: Base -- 8

Now, we prepare the front plate of the robot's base. There are two ultrasonic rangefinders that slide through the holes on the left and right sides of the plate, and they stay put with friction. Connect 4-feet of wire to each of the pins on both the ultrasonic rangefinders, so that they can be controlled from the top of the robot.

Step 17: Base -- 9

When the ultrasonic rangefinders have been fixed onto the front plate, attach the front plate onto the assembly from step Base -- 7 and fasten it with 2 screws.

Step 18: Base -- 10

Now, we prepare the side plates of the robot's base. We affix a large, highly geared 12-volt DC gearmotor onto both of the plates, one for the left side and one for the right side. Solder female XT60 connectors onto each of the gearmotors, with attention to polarity. When you have soldered the XT60 connectors, fasten each motor to its respective plate with 4 screws and 4 washers.

Step 19: Base -- 11

Now attach the left and right side plates from the previous step onto the sides of the assembly from step Base -- 9. Each side plate should be fastened to the main base assembly with 5 screws. Connect the female XT60 connectors on the motors to the male XT60 connectors on the dual DC motor driver.

Step 20: Base -- 12

Now prepare the top lids of the base. Fasten hinges to the front of the lids with 2 screws, 2 washers and 2 nuts. Also fasten the magnetic pieces of the magnetic latches onto the back of the lids.

Step 21: Base -- 13

Affix the lid plates from step Base -- 12 to main assembly from step Base -- 11 with 2 more screws to each hinge. The lids should now open and close, with the magnetic latches keeping the lids closed.

Step 22: Base -- 14

Finally, attach the wheels onto the shafts of the gearmotors, one for the left side and one for the right. The wheels should have a clamping hub or a set screw hub affixed to them, which are used to tighten the connection to the motor shaft. You have now successfully finished assembly of the base.

Note that the base has 3 wheels with contact to the ground, the first two of which are driven by gearmotors and the third which is a free spinning caster. In robotics, this particular arrangement is known as a differential drive, allowing the robot to move forward, move backwards, rotate left and rotate right.

Step 23: Arm -- 0

Begin assembling the arm by affixing a large servo motor to the lower laser cut shoulder plate with 4 screws, 4 washers and 4 hex nuts. You may need spacers. This servomotor provides rotation for the shoulder joint.

Step 24: Arm -- 1

Affix the next two laser cut pieces of the shoulder as shown in the image above. Note that they will be loose at this step.

Step 25: Arm -- 2

Connect the assemblies from step Arm -- 0 and step Arm -- 1. Fasten the lower shoulder plate to the middle piece with a single screw. The top piece will still be loose.

Step 26: Arm -- 3

Now, attach the 3D printed upper shoulder plate with the assembly from step Arm -- 2. Secure the 3D printed shoulder plates' position with 4 screws as shown in the image above. We are done for the shoulder subsection of the arm for now.

Step 27: Arm -- 4

Begin assembling the elbow joint of the arm by piecing all the elbow pieces as shown in the image above. You will need 4 screws.

Step 28: Arm -- 5

Now, attach the 3D printed front elbow piece onto the assembly from step Arm -- 4 and secure its position with 2 screws on the front of the 3D printed part.

Step 29: Arm -- 6

Slide another large servomotor onto the assembly from step Arm -- 5. Make sure the servomotor's wires are coming out of the hole from the 3D printed front elbow piece. Secure the servomotor's position using 4 screws and 4 washers at each of the servo's attaching points.

Step 30: Arm -- 7

Attach a circular servo horn onto the bottom of the assembly from the previous step at its axis of rotation. Secure the horn's position with 4 screws. We are now done with the elbow subsection of the arm assembly.

Step 31: Arm -- 8

Begin the forearm assembly by screwing on three 150 mm threaded aluminum rods onto the laser cut piece as shown in the image above.

Step 32: Arm -- 9

Continue the forearm assembly by preparing the side plate of the arm. Attach a NEMA 17 stepper motor mount to the side and fasten it using 4 screws. Also, attach a circular servo horn to the back of the side plate and fasten it with 4 screws as well.

Step 33: Arm -- 10

Slide a NEMA 17 linear lead screw stepper motor onto the stepper motor mount and fasten them together with 4 screws.

Step 34: Arm -- 11

Slide the assembly from step Arm -- 0 onto the assembly from step Arm -- 10 and secure its positions with the top and bottom plates of the forearm. Things will be a little tight, but everything should snap into place. Fasten the top and bottom plates onto the side plate with 4 screws.

Step 35: Arm -- 12

Attach a limit switch onto the laser cut mid-side piece as shown in the image above. Fasten it with 2 screws. The caps of the screws should on the other side of the limit switch. The limit switch may be somewhat loose at this step.

Step 36: Arm -- 13

Snap the piece from the previous step onto the assembly from step Arm -- 11, limit switch facing towards the stepper motor. Once the piece has been fully inserted, the limit switch should be fully secure. Secure the mid-side plate you just snapped in with 4 screws, 2 on the top plate and 2 on the bottom plate.

Step 37: Arm -- 14

Now we build the extruding assembly of the forearm. Fasten three more 150 mm threaded aluminum rods to the laser cut piece with one screw each. Fasten the linear lead screw nut onto the same laser cut piece with 3 screws.

Step 38: Arm -- 15

Insert the assembly from step Arm -- 14 onto the assembly from step Arm -- 13. The main point of contact between the two assemblies is the lead screw nut and the linear lead screw shaft on the NEMA 17 stepper motor. You will have to spin the lead screw shaft as the extruding assembly goes in.

Step 39: Arm -- 16

Now, we prepare the other side plate of the forearm assembly. Fasten a 3D printed spring assist wheel onto the side plate with 4 screws.

Step 40: Arm -- 17

Combine the assemblies from step Arm -- 16 and Arm -- 15 by attaching the side plate to the main forearm assembly. Fasten it in place with 4 screws.

Step 41: Arm -- 18

Slide the laser cut front plate through the aluminum rods of the extruding assembly and onto the main forearm assembly. Screw the front plate into place with 3 screws on the threaded aluminum rods, one for each rod, and with 4 screws onto the laser cut top, bottom, and side plates.

Step 42: Arm -- 19

Finish the forearm assembly by connecting the front gripper adapter plate onto the protruding aluminum rods with 3 screws, one screw for each rod.

The forearm represents a very special kind of joint, known in robotics as a prismatic joint. A prismatic joint is basically a joint that moves in a linear fashion, as opposed to the more common rotary joint. This forearm's prismatic joint allows it to extend roughly 5 inches, or 127 mm.

Step 43: Arm -- 20

Now, we combine the elbow joint from step Arm -- 7 with the prismatic forearm joint from step Arm -- 19. One side of the connection is supported by a large servomotor and its attachment to a circular servo horn. Support the other side with a large screw that goes through the side plate of the forearm assembly and onto the side of the 3D printed front elbow plate of the elbow assembly. Pay attention to the angle at which the servo is attached - when fully attached to the forearm, the servo should be able to rotate up and down with equal rotary limits both ways. To support the weight of the forearm, attach an extension spring onto the arm such that it rests on the 3D printed circular spring assist wheel. One side of the spring should be attached to the forearm, while the other side of the spring is attached to the elbow.

Step 44: Arm -- 21

Finish the arm by combining the forearm/elbow from step Arm -- 20 with the shoulder joint from step Arm -- 3. Like the previous step, one side of the connection is supported by a large servomotor and its attachment to a circular servo horn. Support the other side of the connection with a large screw and washer, and one arm will be complete. Repeat steps Arm -- 0 to Arm -- 21 to build the other arm.

As an interesting note, this arm is very unique in the space of robotic arm designs. Unlike many other arms, there is no rotary joint in middle of the forearm, and instead there is a prismatic joint. In total, there are 3 joints per arm; one for shoulder (rotates left and right), one for elbow (rotates up and down), and one that extends. This avoids complicated inverse kinematics needed for most robotic arms and makes it very easy to calculate the angles needed to position the robot's end effector. Simply point the elbow and shoulder towards the position desired and extend the prismatic joint until the target position is reached.

Step 45: Chest -- 0

Now for the third major part of the robot: the chest.

Begin assembling the chest by attaching a perfboard with all the connections to the robot's actuators and sensors onto the first piece of the chest. Fasten the perfboard with 4 screws, 4 hex nuts, and 4 spacers. For more information on how to prepare the perfboard, see Step 60: Wiring.

Step 46: Chest -- 1

Attach the middle side plates onto the piece with the perfboard attached from the previous step, along with the lower chest plate as shown in the diagram above. You will need to use 4 screws to fasten both side plates, 2 for each plate. In addition, fasten a magnetic latch onto both the left middle side plate and the right middle side plate with 2 screws and 2 hex nuts per plate.

Step 47: Chest -- 2

Now attach laser cut chest plate pieces to the left and right of the assembly from the previous step, secured with 4 screws, 2 on the left side and 2 on the right side. An Arduino Mega 2560 sits on the right chest plate, fastened with 4 screws, 4 spacers and 4 hex nuts. On the left chest plate, a single high current 12 volt to 6 volt DC voltage converter is fastened with 2 screws, 2 washers and 2 hex nuts. The voltage converter is used to provide 6 volts of power to the robot's servomotors, and everything else is powered either directly from 12 volts or from the Arduino Mega's regulated 5 volts. See Step 61: Batteries for more information on the 12 volt power source.

Step 48: Chest -- 3

Now, prepare the back plate of the chest. On the back plate of the chest, there is a rocker switch for the turning the robot's top half on and off, as well as two 80 mm computer fans for cooling the electronics. The switch connects to the perfboard from step Chest -- 0 and routes 12 volts of power from the terminal block located at the base of the robot. Snap the switch onto the back chest plate and fasten both computer fans onto the back chest plate with 4 screws and 4 hex nuts as shown in the image above.

Step 49: Chest -- 4

Along with the back plate, prepare the front plate of the chest as shown in the image above. Like the front plate of the robot's base from step Base -- 8, slide two ultrasonic rangefinders through the holes on the left and right sides of the plate, and they will stay put with friction. Connect 1 foot of wire to each of the pins on both of the ultrasonic rangefinders, so that they can be controlled from the perfboard.

Step 50: Chest -- 5

Now that both the front and back plates of the robot's chest have been prepared, attach them both to the front and back of the chest assembly from step Chest -- 2 respectively. There are two screws for both the front and back plates, for a total of 4 screws.

Step 51: Chest -- 6

Prepare the left and right plates of the robot's chest by fastening a NEMA 17 stepper motor mount with 4 screws and 4 hex nuts on both the left and right plates.

An interesting note is that the robot was initially planned to have NEMA 17 stepper motors rotate the shoulder joints left and right. After some testing, it was determined that stepper motors were too weak to drive the shoulder joint, and they have now been replaced with a pair of large servomotors instead. The stepper motor mounts, however, are left in the final design in order to provide extra support to the chest.

Step 52: Chest -- 7

Attach the left and right plates from the previous step to the chest assembly from step Chest -- 5 and fasten them with 3 screws for the left plate and 3 screws for the right plate.

Step 53: Chest -- 8

In the same fashion as the base lid plates from step Base -- 12, add two hinges to the front of the chest lid plate and add two magnets to the back of the chest lid plate. Use 2 screws and 2 hex nuts for each magnet, and 2 screws, 2 washers and 2 hex nuts for each hinge.

Step 54: Chest -- 9

Combine the lid plate from the previous step with the full chest assembly from step Chest -- 7. To do this, fasten the hinges on the lid to the front chest plate with 2 screws, 2 washers and 2 hex nuts per hinge. When the lid has been attached, the lid should be able to open and close, with the pair of magnetic latches keeping the lid closed.

Step 55: Chest -- 10

The main assembly of the chest has been completed in the previous step, so this step is optional. For an extra professional touch, fasten a 3 mm acrylic plate laser engraved with the robot's name and logo to the front of the robot's chest with 4 screws.

Step 56: Putting It All Together -- 0

Now that all of the major components of the robot, the base, the arms, and the chest have been completed, the next step is to put it all together. First, we combine the base with the chest as follows:

Connecting the base:

Attachfour 2-foot aluminum extrusions to the base of the robot, and secure them with 8 aluminum right angle supports, 2 supports for each aluminum extrusion. Screw each of the 8 right angle supports onto their respective aluminum extrusion with a sliding nut, one nut for each right angle support. Now, with the right angle supports attached onto the aluminum extrusions, screw the aluminum extrusions onto the base of the robot through each of the 8 right angle supports. Additionally, screw the mid-side plates of the robot's base assembly to each of the four aluminum extrusions with a sliding nut, for a total of 4 screws and 4 sliding nuts.

Connecting the chest:

In very similar fashion to the robot's base, we attach the four aluminum extrusions to the robot's chest. First attach 8 more aluminum right angle supports to the top of the aluminum extrusions, 2 supports for each extrusion. Screw each of the 8 right angle supports onto their respective aluminum extrusion with a sliding nut, one nut for each right angle support. Now that the right angle supports have been attached to the top of the aluminum extrusions, screw each the aluminum right angle supports onto the lower plate of the robot's chest, for a total of 8 connections. For additional support, place 4 more sliding nuts into the mid-sides of the robot's chest, one for each aluminum extrusion, and fasten the mid-side plates onto the aluminum extrusions with 1 screw per sliding nut.

Step 57: Putting It All Together -- 1

Now that the base and chest have been successfully combined, the next step is to combine the arms with the chest. Do the following instructions for the left and right arms:

Connecting the arm:

For the left arm, begin by sliding the completed left arm assembly onto the left side of the robot's chest assembly. Secure the connection by fastening 4 screws and 4 hex nuts through the top shoulder plate of the arm assembly onto the left NEMA 17 stepper motor mount of the chest assembly. Additionally, fasten 2 screws and 2 hex nuts through the bottom of the lower left chest plate and onto the lower shoulder plate of the left arm assembly. Finally, fasten one screw through the front plate of the robot's chest into the front of the top shoulder plate of the left arm. In total, there should be 7 screws connecting the arm assembly to the chest. Repeat these steps for the right arm.

Step 58: Putting It All Together -- 2

For additional support on the arm/chest connections, apply 6 aluminum right angle supports to the sides of the chest assembly as shown in the image, 3 right angle supports for the left arm and 3 right angle supports for the right arm.

Step 59: Putting It All Together -- 3

To figuratively put a cherry on top on the cake, place a laptop computer on top of the robot's chest to serve as the robot's primary intelligence processor and graphic display. (Any laptop 15 inches or smaller will work just fine. 2-in-1 foldable laptop computers look especially good on the robot).

Congratulations, you have now completed mechanical assembly of the Multipurpose Mobile Manipulator Mk 1! The next steps are to finalize all wiring connections between the Arduino Mega, the perfboard, and the robot's actuators and sensors, and also preparing the robot's internal software to perform a variety of interesting tasks.

Step 60: Wiring

The Multipurpose Mobile Manipulator Mk 1 has a lot of actuators and sensors that need to be controlled simultaneously by a single Arduino Mega. Here is a list of the components that need to go on the main perfboard to drive them all:

  • 4x Screw Terminals (12V, 6V, 12V->6V, 5V)
  • 2x 4 pin header for Ultrasonic Rangefinder (5V, TRIG, ECHO, GND)
  • 1x 5 pin header for Dual DC Motor Driver (DIR1, PWM1, DIR2, PWM2, GND)
  • 2x 8 pin header pair for Stepper Motor Driver (STEP, DIR, RESET, 12V, GND, 5V, GND)
  • 2x 10k ohm Resistor for Stepper Limit Switch
  • 2x 2 pin header for Stepper Limit Switch
  • 2x 100UF Capacitor for Stepper Motor
  • 1x 10k ohm Resistor for Transistor
  • 1x Transistor for turning fans on and off
  • 3x 2 pin header for 80 mm computer fan (12V, GND)
  • 14x 3 pin headers for Hobby Servo Motors (SIG, 6V, GND)

Arrange these components onto a large perfboard and solder/wire them according to the schematic provided. An example arrangement of the components is shown in the reference image above. Note that there are 3 main voltages that are running on the robot: 5 volts for the sensors and limit switches, 6 volts for the hobby servo motors, and 12 volts for the fans, stepper motors and DC gearmotors. (If you prefer, it is also possible create the electronics layout on a standard size breadboard first before attempting to create the more permanent perfboard.)

When you are finished soldering all of the electronics on the control board, connect the header pins on the perfboard to the various sensors and actuators across the robot. Also, connect all the required control pins from the perfboard to the Arduino Mega as shown in the schematic. An image is provided for reference on what all the wiring will look like when completed.

Note: When connecting wires to the Arduino Mega, it is recommended to use only one of the back rows of the Arduino Mega 2560, not both. The Arduino Mega has a particularly nasty pin-bleed effect with the two back rows: setting one pin to high has a very high chance of setting its adjacent pin to high as well.

Step 61: Batteries

The Multipurpose Mobile Manipulator is powered by two heavy 12 volt 8 amp-hour sealed lead acid batteries. Under normal load, these batteries are expected to last roughly 2-3 hours, and can be recharged by a standard 12 volt sealed lead acid battery charger. This 12-volt power is routed 2 ways: through the emergency stop to the dual DC motor controller on the base and also to the top through a rocker switch that powers the chest and arms of the robot. On the top, there is also a 12 volt to 6 volt DC converter that provides power to the hobby servo motors, and the Arduino Mega provides regulated 5 volts of power to all of the switches and sensors. The batteries are located on the base of the robot and weigh roughly 5 pounds each, making the robot more stable by significantly lowering the center mass. Because these batteries are very powerful and can provide a lot of current, you should be VERY careful with the polarity of the batteries. Flipping them around will cause a very, very bad short circuit. As an additional safety measure, these batteries are protected with yellow XT60 connectors to prevent accidental flipped connections. Go ahead and solder male XT60 connectors to the leads of the batteries, making sure the polarities are correct.

Step 62: General Software Notes

The Multipurpose Mobile Manipulator runs on two levels of software: low level and high level.

Low Level Software:

On the low level, the robot runs on an Arduino Mega 2560, which constantly receives and parses commands from a USB serial channel and relays them to all of the actuators, while simultaneously sending sensor data back through the same USB communication channel.

High Level Software:

On the high level, another device, usually a laptop computer running Mac, Windows or Linux, does the "intelligence" processing. Programs running on the laptop make sense of the incoming sensor data and make decisions using Python, Unity, ROS, Processing, and other languages. Once the intelligent processing has been completed, the laptop then sends commands through the USB cable to the Arduino Mega to control the various actuators.

In a way, this software hierarchy makes the robot a gigantic USB peripheral of sorts: any device that can input and output through a USB serial channel can theoretically be used to control the robot (including Raspberry Pis and Android devices).

Step 63: Arduino Firmware

As stated in the previous step, an Arduino Mega 2560 is used for low level signal handling of all of the Multipurpose Mobile Manipulator's actuators and sensors. Setup the Arduino Mega by doing the following:

  1. Download and install the Arduino IDE from the official Arduino Website.
  2. Download the Multipurpose Mobile Manipulator Library for Arduino.
  3. Install it by extracting the MMM folder into the Arduino Libraries folder (this is in C:\Users\User\Documents\Arduino\libraries for Windows).
  4. Open the Arduino IDE.
  5. In the Arduino IDE, go to Tools -> Board and select Arduino/Genuino Mega or Mega 2560.
  6. In the Arduino IDE, go to Tools -> Port and set the serial port to the Arduino Mega 2560's port name.
  7. Go to File -> Examples -> MMM -> MMM_Mega.
  8. Upload the sketch.

The Arduino Mega is now ready for low level control of the Multipurpose Mobile Manipulator.

Step 64: Testing Electronics

Now, before going on to the high level software control, it is highly recommended to test all of the electrical connections on the perfboard in order to make sure that all of the components for actuation and sensing are sound and ready to use. Do this by uploading and running the following examples on the Arduino Mega:

  • MMM_Fans: turns the 80 mm computer fans on the robot on and off.
  • MMM_Wheels: tests the dual DC motor driver by rotating the wheels forward and backward.
  • MMM_Shoulders: rotates the robot's shoulders left and right.
  • MMM_Elbows: rotates the robot's elbows up and down.
  • MMM_Arms: extends the robot's arms forward and backward.
  • MMM_Grippers: rotates all attached servos on the robot's end effectors.
  • MMM_Rangefinders: outputs serial data from the ultrasonic rangefinders.

Note that the pins in these example sketches may need to be changed depending on exactly which pins on the Arduino Mega 2560 were used to control the various actuators and sensors.

Step 65: Python Setup

Now that the low level firmware has been installed and tested to work on the Arduino Mega, we can now setup the high level.

  1. Download and install Python 2.7 (NOT 3.0).
  2. Download and install Python Serial for Python 2.7.
  3. Download and install Python OSC for Python 2.7.
  4. Download the Multipurpose Mobile Manipulator library for Python 2.7.
  5. Extract the MMM Python 2.7 folder to a location of your choice.
  6. Start programming with Python 2.7 by including this header for every script to interface with the robot:
from MMM import MMM 
from MMM_Speaker import Speaker

Although the high level can be implemented in any language that outputs a basic serial communication to the Arduino Mega, we will be using Python 2.7, as we have already developed a basic control library for the Multipurpose Mobile Manipulator with Python 2.7. Additional libraries for high level control using Python 3.0, ROS, C++, Processing, Unity, MATLAB, Scratch, and RobotC are planned and underway.

Step 66: Python Library

After completing the previous step, you should be ready to start using the provided Multipurpose Mobile Manipulator library to begin developing applications using Python 2.7. The main script that controls the robot's actuators and sensors is called MMM.py. Here is an overview of how it works:

Serial Communication Commands:

  • MMM(portName) opens a new serial channel at the robot's Arduino Mega 2560 portname. Give the Arduino roughly 5 seconds to initialize after connecting before sending any further commands.
  • parseData() gets the sensor readings on the robot by reading the serial port and parsing the input.
  • update() sends all actuator positions to the Arduino by writing to the serial port, updating the actual robot. Note that the robot will not move any of its actuators until update() is called!

Actuator Position and Sensor Reading Commands:

  • reset() resets all actuator positions to their default values.
  • setWheelVelocity(leftSpeed, rightSpeed) controls the wheels. Units are in meters, and positive values move the wheels forward while negative values sends the wheels backwards. The range of input is +.18 m/s to -.18 m/s.
  • rotateShoulders(leftAngle, rightAngle) rotates the shoulders. The range of input is from 0 to 120 degrees, where 120 degrees rotates the shoulders fully inwards.
  • rotateElbows(leftAngle, rightAngle) rotates the elbows. The range of input is from -60 to 60 degrees, where 60 degrees rotates the elbows fully upwards.
  • extendArms(leftAmount, rightAmount) extends the arms in meters. The range of input is from 0 meters to .127 meters (roughly 5 inches).
  • setLeftGrippers(l1, l2, l3, l4, l5) rotates up to 5 servomotors on the left gripper. The range of input for each servo is 0 to 180 degrees.
  • setRightGrippers(r1, r2, r3, r4, r5) rotates up to 5 servomotors on the right gripper. The range of input for each servo is 0 to 180 degrees.
  • getLeftRange() and getRightRange() return the left and right rangefinder distance readings, from 0 to 100 cm. Readings that are out of bounds return -1.

Here is a very basic example script of how these commands are used to make the robot move in Python 2.7:

from MMM import MMM<br>import time

mmm = MMM('COM3')               # Create an serial connection at COM3
time.sleep(5)                   # give some time to connect

#continuous loop
mmm.setWheelVelocity(.18,-.18)  # rotates robot left 
mmm.rotateShoulders(120,0)      # one shoulder in, one out
mmm.rotateElbows(60,-60)        # one elbow up, one down 
mmm.extendArms(0,.127)          # one arm retracted, one extended
mmm.setLeftGrippers(0,0,0,0,0)  # all servos at 0 degrees
mmm.setRightGrippers(0,0,0,0,0) # all servos at 180 degrees
mmm.update()                    # send updated actuator states to robot

Step 67: Python Testing

To ensure that all actuator positions and sensor values are being updated correctly in real time from the high level to the low level, we recommend using the provided MMM_XBOX.py controller script. Basically what this script does it that it allows manual operation of the robot through input from a wired Xbox 360 controller. If everything wired correctly and the all the software pin mappings are correct, the following controls should do the following:

  • D-pad Left: rotates the robot left.
  • D-Pad Right: rotates the robot right.
  • D-Pad Up: moves robot forward at .18 meters per second.
  • D-Pad Down: moves the robot backward at .18 meters per second.
  • Left Bumper: Rotates all left gripper servos 180 degrees.
  • Right Bumper: Rotates all right gripper servos 180 degrees.
  • Left Thumbstick: rotates the left arm up, down, left and right.
  • Right Thumbstick: rotates the right arm up, down, left and right.
  • Left Thumbstick Click: Extends the left arm forward and backwards
  • Right Thumbstick Click: Extends the right arm forward and backwards
  • Back Button: Closes the connection and quits the script.

Note: when testing out more advanced high level scripts with the robot, it is recommended to send update() commands once every 50 milliseconds in a separate thread. Constant updating is needed to flush the serial buffer and fix errors that may occur during serial transmission. Separate threads are necessary because reading and writing to serial ports is slow and may prevent other high level processes from executing at usable speeds.

Step 68: Robot Face

And the for final finishing touch, we want to give the robot some serious personality. For this purpose, we have developed a graphical 3D robot face display showing a single red eye streaming in a river of binary data. Currently, the robot eye tracks the position of the mouse, which can be set to follow real time face tracking in another computer vision processing application. Note that the robot face is really just for looks and does not affect operation of other high level and low level processes controlling the robot. However, one very nice feature of the graphical face display is that it has a real time text-to-speech feature, which can be used in tandem with other applications to make the robot verbally express its thoughts to nearby humans within auditory range. With the graphical face display running, you can use the MMM_Speaker class in Python 2.7 to make the robot talk:

from MMM import MMM<br>from MMM_Speaker import Speaker

speaker = Speaker()           # opens a new OSC connection 
speaker.speak("Hello World!") # makes the robot talk

Step 69: Conclusion

If you have made it this far following these instructions step-by-step, then you are now the proud owner of a Multipurpose Mobile Manipulator Mk 1. This is no easy feat - congratulations!

Imagine the possibilities of what you can do - and be creative! The Multipurpose Mobile Manipulator is designed as an advanced research-grade mobile robotics platform capable of performing a variety of interesting tasks for scientific, artistic, and utilitarian endeavors. Adaptable grippers allow the robot to grab and move things in its environment and a mobile base allows it to explore its environment. As the Multipurpose Mobile Manipulator is designed as an open platform, there is always room for improvement - feel free to expand upon it by adding new types of grippers, sensors, artificially intelligent software and more; this robot is here to help you unleash your potential as the brilliant roboticist you know you are. And don't forget: please contribute back to the community once you have discovered how to do amazing new things with the Multipurpose Mobile Manipulator.

Thank you again for your support and I hope you enjoyed this Instructable!

Respectfully from John Choi, creator of the Multipurpose Mobile Manipulator Mk1.

For more information about the Multipurpose Mobile Manipulator, check out these links:

And check out the next few pages for a collection of amazing things we got the robot to do so far!

Step 70: Current List of Capabilities

Over the course the the 2015-2016 school year, the Multipurpose Mobile Manipulator Mk 1 was tested with 50 undergraduates at Carnegie Mellon University as an advanced educational robotics platform. Mostly comprising of first year students with little to no prior robotics experience, students from across all disciplines got hands on experience working with a research grade robot and got a taste of the entire scope of robotics: perception, cognition, and actuation. After being given tutorials on CAD modeling, Arduino programming and Python scripting with provided libraries, students were split into 10 groups of 3-5 people each with the objective of getting the Multipurpose Mobile Manipulator to perform an interesting task. Working roughly 2 hours per week for 20 weeks, here is a list of the tasks we successfully got the Multipurpose Mobile Manipulator to do:

Full Source and CAD Files: https://github.com/johnchoi313/MMM_2015-2016

Step 71: Playing Piano

One of the more artistic tasks assigned to the Multipurpose Mobile Manipulator is the ability to play piano. The grippers for this task have five fingers each that go up and down to press keys on the keyboard. For now, the robot can only play basic songs, but with enhanced the shoulders and wrist coordination coupled with computer vision to read notes on a music note sheet, playing more complex songs is certainly possible.

Lead Contributor:Tyler Quintana


  • Won Woo Nam
  • Kimberly Lim
  • Aayush Bhasin
  • Sarah McAllister

CAD files and source:https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Piano

Step 72: Bagel Delivery

The robot can also be programmed to deliver materials from one location to another. For this example, the robot scoops up a bagel with spatula-shaped grippers and delivers it to a box located 3 feet away. For future development, this task can evolve into food stacking, acting as a robotic waiter at a restaurant, delivering food to rooms at a hotel, and disposal of waste into proper trash receptacles.

Lead Contributor: Marcus Horn


  • Raunak Gupta
  • Kashish Garg

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Bagels

Step 73: Watering Plants

The task gives the robot a green thumb, quite literally. The Multipurpose Mobile Manipulator can water houseplants in an indoor environment using a specialized hose adapter that pours water from an upside-down water bottle located on the back of the robot. It searches for houseplants using an ultrasonic rangefinder on the other hand. With enough development, this task can evolve into a full fledged autonomous gardening and farming machine, where the robot monitors, fertilizes, and waters a row of plants over time.

Lead Contributor:John Choi

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Plants

Step 74: Picking Up Legos

This is another creative task where the robot picks up and releases toy bricks. With more advanced computer vision systems to identify, pick and place bricks, the robot will be able to unleash its imagination and build whatever it wants out of toy bricks, such as toy houses and toy robots.

Lead Contributor: Yixiu Zhao


  • Brendan Wixen
  • Terence Huang

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_ToyBricks

Step 75: Drawing Pictures

Another one of the more artistic capabilities of the robot is the drawing task. The Multipurpose Mobile Manipulator is capable of drawing very fine traces onto a flat surface using virtually any writing utensil, such as pencils, pens, markers, paintbrushes, and lasers. With enough time, dedication, and practice, it is entirely possible that the robot becomes a master Impressionist painter drawing sunsets, picnics and portraits.

Lead Contributor: Ian Holst


  • Anthony Chan
  • Yuyan Sun
  • Ulani Qi
  • Jessie Xie

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Drawing

Step 76: Toy Dart Combat

Security and defense applications are also currently under exploration with the Multipurpose Mobile Manipulator. For this task, the robot attempts to track a red book and fire toy darts in its general direction. At its current state, the robot has quite a bit of fine-tuning to go through before it is ready to enter any real or imagined battlefields. Further testing including but not limited to foam rocket launchers and fully automatic bubble blasters is underway.


  • Ruvini Navaratna
  • Hannah Loy
  • Inez Khan

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_ToyDarts

Step 77: Stirring Pots

Food preparation is a major topic of interest in exploring the capabilities of the Multipurpose Mobile Manipulator. For this task, the robot stirs a pot of boiling water, where ramen noodle soup can be added. Further development of this task includes being able to pick up and drop various ingredients into the boiling pot of water at accurate time intervals for maximum flavor and food preparation efficiency.


  • Raymond Galeza
  • Ethan Gruman
  • Omar Tena
  • Olivia Xu
  • Yue Xu

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Stirring

Step 78: Hot Dog Assembly

The objective of this task was to get the Multipurpose Mobile Manipulator to assemble a classic American-style hot dog with ketchup and mustard. The robot performs this task by first stabbing the sausage, releasing it on the bun, and then spraying mustard linearly on top of the hot dog. The ultimate goal for this task is to get the robot is intelligently and autonomously operate a hot dog stand in a crowded beach or park.

Lead Contributor: Dimitrios Konstantinidis


  • Raghav Poddar
  • Zheyao Zhu
  • Harvey Shi
  • Elias Lu

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_HotDog

Step 79: Cereal Feeder

The objective of this task was to get the Multipurpose Mobile Manipulator to feed cereal or oatmeal from a bowl to a human being. The robot has specialized end effectors for both the left and right hands. On the left hand is a bowl adapter that holds the cereal bowl. On the right hand is a spoon adapter that scoops cereal from the bowl and feeds it to a human. The two end effectors work together to deliver a very robotic cereal eating experience.


  • Taisuke Yasuda
  • Brian Lu
  • Fiona Li

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_Cereal

Step 80: Toy Sword Dueling

The last task of the robot was to get the Multipurpose Mobile Manipulator to become a highly skilled toy sword combatant. Both grippers are identical and are designed to adapt to a very specific extendable toy sword, resulting in a formidable dual-wielding, sword-fighting robot. Although this was the last capability described in this Instructable, the full range of abilities of the Multipurpose Mobile Manipulator is limited only by your imagination - make it do something awesome :)

Lead Contributor: John Choi

CAD files and source: https://github.com/johnchoi313/MMM_2015-2016/tree/master/MMM_ToySword

<p>Hi, I think this is the best robot ever made! It's so incredible, what it can do is amazing! Normally, most robots can do only one task, but your project broke this rule. Congratulations!</p>
<p>Thanks MohamedElkhatri! Wait till you see version 2 ;)</p>
<p>Pretty sure it will be amazing as well. Just a small proposition if you don't mind : why don't you give it &quot;home assistant&quot; tasks such as home control and make it familiar with its environment. Hope you a good luck!</p>
I need someone who will pick up what is dropped and ask where it goes then put it away.
<p>An interesting idea. The robot can be made a little shorter to pick things up from the floor. Speech recognition is also definitely something to explore.</p>
I plan on having my students build something similar to this using an electric wheelchair as base. This design gives me more ideas!
<p>Glad to hear! Feel free to use whatever you need and I hope you will learn something useful going over this Instructable. Let me know if you need help with anything and I will be glad to advise :) </p>
Amazing build, looks incredibly modular! Any thoughts on dressing it in a tux when you're done, to make it a robot butler? ;)
<p>Certainly. I'm thinking painting it black,, making the acrylic front plate white and giving it a bow tie :)</p>

About This Instructable




Bio: Just a guy that likes building robots and videogames.
More by John Choi:Multipurpose Mobile Manipulator MkII Multipurpose Mobile Manipulator Mk 1 Virtual Reality Teleconferencing Device with Google Cardboard 
Add instructable to: