Wall-E Malone - The drawing robot


Make your own drawing robot

Made by: Caroline Malling, Emma Striib Nielsen, Johanne Engbirk, Lucca Marie Nielsen, Malene Hoffmeyer, & Tue Brisson Mosich


Wall-E is a drawing robot, which is made out of laser cut wood. If using the guide, he is easy to assemble. He is driven by an Arduino board and two servoes. A sensor placed on his front makes sure he does not hit anything on his drawing adventures. He is programmed to draw "random" patterns, which creates beautiful art and funky moments. Besides all the artsy qualities, he can be your new best friend - he is so cute and loveable.

Materials and resources


  • 4mm HDF: w: 40cm x 52cm
  • 2x Continuous servos (+ accessories)
  • Arduino Board
  • Sharp 2Y0A21 IR Sensor
  • LED light strip
  • Portable battery
  • 1x M5x20 bolt
  • 1x M5x30 bolt
  • 4x M5 nut
  • 1x M5 locking nut
  • 2x M3 nut
  • 2x M3x20 bolt
  • 5x plastic rivets
  • 2x 4mm Ball bearing
  • 2x Clothes-pegs
  • Paper
  • Pen
  • Extra Arduino Microphone sound sensor module


  • Lasercutter
  • Computer & USB doodle
  • Glue gun
  • Screwdriver
  • Cutting nippers


Download the PDF template and the other files you have to use here.
Save the downloaded PDF template on your USB doodle and start laser cutting the template.
Tip! Remember to convert the PDF file into a PLT file so you are able to laser cut the template. Otherwise feel free to ask the FabLab gurus for help.

This is how the PDF template should look:
Laser cut the blue lines and engrave the red.

Set power and speed on the laser cutter as on the picture below.
Tip! This setting was what worked for us on the lasercutter we used, but remember all laser cutters are different.

This is how your finished laser cut template should look:

Before you can assemble your drawing robot you must pop out the pieces from your lasercut template.

Step-by-step assembly guide

Step 1: Assemble the small wheel

This is the materials needed to build the small wheel. The bolts and nuts in the picture are as follows:

  • 1x M5x20 bolt
  • 1x M5x30 bolt
  • 4x M5 nut
  • 1x M5 locking nut
  • 2x 4mm Ball bearing

One of the ball bearings should be placed inside the round lasercut piece from the template to form a small wheel.
Tip! If the hole is a bit too small you can use a rubber hammer to knock it into the hole. If the ball bearing still is too big for the hole, file it into shape.

The other ball bearing should be placed in the big hole in the front of the platform.

Assemble the small wheel by plugging the rounded sides into the rectangle platform. The small wheel with the ball bearing should be placed in between the two sides and assembled with the M5x20 bolt with a nut at the end and on each side of the wheel.

Step 2: Attach the small wheel to the platform

The small wheel is attached to the big platform with the help of the M5x30 bolt which is put through the squared platform (with the small wheel attached to it) and through the ball bearing in the big platform. The last nut is placed on top.
Tip! Use the locking nut on top, otherwise there is a risk of the small wheel twisting the nut off the bolt, when the robot is turning.

Step 3: Attach the sensor to the platform

  • Arduino Board
  • Sharp 2Y0A21 IR Sensor
  • 2x plastic rivets
  • Holder to sensor

This is what you need to assemble the sensor, and attach it to the platform.

The IR sensor is attached to the lasercut sensorholder with the help of 2 plastic rivets.

Thereafter the sensor is attached to the platform.

Step 4: Assemble the big wheels

This is the material you have to use to assemble the big wheel.

  • 2x Continuous Servos (+ accessories)
  • 4x M3x20 Bolts
  • 2x Big wheels

The big wheels should be attached directly onto the continous servos.

Cut off the end of the bolts, so they don't interfere with the servo motors.

The big wheels should be attached to the servos with the small black bolts.

Tip! To get better grib on the paper add sandpaper on the big wheels.

Afterwards the servos are glued onto the underside of the main platform, in the back end of the platform.

Put the wires through the holes, on the main platform, next to the servos, so they can be connected to the Arduino board.
Connect the wires, from the servos, to the Arduino board. (See the Arduino diagram for more instructions)

Step 5: Add the battery

Use the glue gun to attach the portable battery under the platform. Be sure the USB input does not interfere with the hole for the pen.

Step 6: Attach the Arduino board to the platform

  • 4x plastic rivets

Attach the Arduino board to the platform with the rivets.

The rounded end of the plastic rivets should be placed on the underside of the platform.

Step 7: Attach the 2 clothes-pegs to the platform

  • 2x Clothes-pegs
  • 2x M3x20 bolts
  • 2x M3 nuts

Often the holes for the pen or marker is too big, so we suggest that you attach two clothes-pegs onto the platform with bolts as shown below.

Step 8: Connecting the Arduino Board

The diagram below shows how your Arduino board should be connected with the servos, sensor, and NeoPixel LED String (if you decide to use the LED string).
Connect the left servo with pin 6, and the right servo with pin 7.

Wire/solder the sensor to pin A3, ground and 5V on the Ardunino or shield.

Step 9: Assemble the top platform and attach it to the main platform

The robot's eyes are glued to the head piece.
Thereafter the head is placed into the top platform.
The top platfrom can hereafter be attached to the main platform with the help of the two sides from the lasercut template

Step 10: Connecting Arduino

Start by downloading Arduino to your computer. Click here to download.

Open the downloaded folder from above, and download all the files for this project here

Install the easytransfer library in your libraries folder (Documents/Arduino/libraries). Remember to restart Arduino. If the folder does not exist, run Arduino for the first time and it will be created.

Check the right board. It should be Arduino UNO.
Choose the right serial port.

Press the play (upload) button.
The Arduino board should blink and start to upload the code. The drawing robot should start driving and it is ready to draw.

Step 11: Pimp your drawing robot by adding LED lights (optional)

Our LED light strip consisted of 10 NeoPixels. The program should be easy to modify for varying numbers of LEDs.

Use wires to solder the NeoPixel input (Din) to pin 4 and the two others to ground and 5V respectively on the Arduino or the shield.

Tip! Note the small arrows on the NeoPixel strip - the data travel direction. The arrows should be facing away from the point of where you soldered the input wire (Din) on the strip.

Afterwards the LED light strip is glued onto the front of the platform, below the sensor so it doesn't block the view of the sensor.

The LED light is programmed to transition from red - close to an object - to green - no obstacle in sight.

Step 12: Audio controlled robot (advanced)

We tried to make the robot respond to audio by attaching the Arduino Microphone sound sensor module.

We had some trouble with noise from the servos interfering with the mic, so we weren't 100% successful. Look at code example 0.8e for a theoretically functional sound controlled robot.

Processing Code

The specific code for the template design is the following, but can also be found in the ressources folder downloaded in the beginning:

  void setupElements()

    mfab robotDraw = canvas.addPopRect(1, 20, 30, 35);//Main platform
    robotDraw.top.disabled = true;
    robotDraw.addArc(15, 0, 30, 180, 360);
    canvas.addPopCircle(16, 11.25, 4.7);//Hole to small wheel
    mfab eye = canvas.addCircle(16,12,1.5);//Eye engraving
    eye.c = #F70529;
    canvas.addPopCircle(16, 20.875, 2.5);//Hole to pen front
    canvas.addPopCircle(16, 50, 2.5);//Hole to pen back
    canvas.addPopCircle(22,20.875,0.75);//Hole to clothes-peg
    canvas.addPopCircle(22,50,0.75);//Hole to clothes-peg
    robotDraw.addRect(3,17.5,2,1);//Hole to wire
    robotDraw.addRect(25,17.5,2,1);//Hole to wire
    robotDraw.addCircle(10,10,0.75);//Hole to Arduino
    robotDraw.addCircle(17,10,0.75);//Hole to Arduino
    robotDraw.addCircle(6,22.75,0.75);//Hole to Arduino
    robotDraw.addCircle(18.125,23,0.75);//Hole to Arduino

    canvas.addMountHoleRow(11, 7, 12, 360);
    canvas.addMountHoleRow(3, 24, 25, 90);
    canvas.addMountHoleRow(30, 24, 25, 90);

    mfab robotHjul = canvas.addPopCirclePiece(25, 1, 7.5, "Small wheel"); //Small wheel 
    robotHjul.addCircle(3.75, 3.75, 4.7);//Inside off small wheel
    mfab circle = robotHjul.addCircle(3.75,4.5,1.5);//Eye engraving in small wheel
    circle.c = #F70529;

    mfab robotPlatform = canvas.addPopRect(33, 56, 4, 6.5);//Sides to small wheel
    robotPlatform.bottom.lType = LTTACKY;
    robotPlatform.addArc(2, 0, 4, 180, 360);
    robotPlatform.top.disabled = true;

    canvas.addCircle(35, 56, 1.25);

    mfab robotForm = canvas.addPopRect(38, 56, 4, 6.5);//Sides to small wheel
    robotForm.bottom.lType = LTTACKY;
    robotForm.addArc(2, 0, 4, 180, 360);
    robotForm.top.disabled = true;

    canvas.addCircle(40, 56, 1.25);

    mfab hjulPlade = canvas.addRectPiece(45, 46, 7.5, 7.5, "Platform");
    hjulPlade.addCircle(3.75, 2, 1.25);
    hjulPlade.addMountHoleRow(2, 3.5, 4, 90);
    hjulPlade.addMountHoleRow(6.5, 3.5, 4, 90);

    mfab Hjul = canvas.addPopCirclePiece(32, 0, 21.75, "Big wheel");
    Hjul.addPopCircle(10.875, 10.875, 2.25);
    Hjul.addPopCircle(10.875, 12.75, 0.5);
    Hjul.addPopCircle(10.875, 9, 0.5);
    Hjul.addPopCircle(10.875, 4.5, 5);
    Hjul.addPopCircle(10.875, 17.25, 5);
    Hjul.addPopCircle(4.5, 10.875, 5);
    Hjul.addPopCircle(17.5, 10.875, 5);

    mfab stortHjul = canvas.addPopCirclePiece(32, 23, 21.75, "Big wheel");
    stortHjul.addPopCircle(10.875, 10.875, 2.25);
    stortHjul.addPopCircle(10.875, 12.75, 0.5);
    stortHjul.addPopCircle(10.875, 9, 0.5);
    stortHjul.addPopCircle(10.875, 4.5, 5);
    stortHjul.addPopCircle(10.875, 17.25, 5);
    stortHjul.addPopCircle(4.5, 10.875, 5);
    stortHjul.addPopCircle(17.5, 10.875, 5);

    mfab Hoved = canvas.addPopRect(44, 58.5, 9, 5);//Head
    Hoved.bottom.lType = LTTACKY;
    Hoved.addArc(4.5, 0, 9, 180, 360);
    Hoved.top.disabled = true;

    mfab Censorholder = canvas.addRectPiece(32, 46, 12, 6.5, "Sensorholder"); 
    Censorholder.bottom.lType = LTTACKY;
    Censorholder.addCircle(1.375, 2.25, 0.75);
    Censorholder.addCircle(10.625, 2.25, 0.75);

    mfab top = canvas.addRectPiece(1, 56, 30, 25, "Top");//Top platform
    top.addMountHoleRow(2, 1, 25, 90);
    top.addMountHoleRow(29, 1, 25, 90);
    top.addMountHoleRow(18.5, 12.5, 8, 180);

    mfab sidetiltop1 = canvas.addRectPiece(32, 66, 6, 12, "1");//Side 1
    sidetiltop1.bottom.lType = LTTACKY;
    sidetiltop1.top.lType = LTTACKY;

    mfab sidetiltop2 = canvas.addRectPiece(39, 66, 6, 12, "2");//Side 2
    sidetiltop2.bottom.lType = LTTACKY;
    sidetiltop2.top.lType = LTTACKY;

    mfab sidetiltop3 = canvas.addRectPiece(46, 66, 6, 12, "3");//Side 3
    sidetiltop3.bottom.lType = LTTACKY;
    sidetiltop3.top.lType = LTTACKY;

    mfab sidetiltop4 = canvas.addRectPiece(33, 80, 12, 6, "4");//Side 4
    sidetiltop4.right.lType = LTTACKY;
    sidetiltop4.left.lType = LTTACKY;
Share on : Twitter, Facebook or Google+