Project tutorial

Wall-E © GPL3+

In this tutorial we will teach you how to build a life-sized fully functional Wall-e prototype

  • 30 respects

Components and supplies

Ph a000066 iso (1) ztbmubhmho
Arduino UNO
Screen shot 2019 03 20 at 2 38 27 pm fqndazqcx1
Aluminum Rods
acrylic sheets
sheet (40*60)cm
timing belt
DC motor (generic)
*2 for arm
DC motor with warm gear
*2 for legs
Servos (Tower Pro MG996R)
Coating for legs
pop rivets (generic)
Spray Paint (generic)

Necessary tools and machines

Pop riveter
(100*100) sheets

About this project


WALL-E is a famous Disney character from WALL-E, the animated film. WALL-E, short for Waste Allocation Load Lifter Earth-class, is the last robot left on Earth. The Pixels team tried to make a real life-sized, fully functional WALL-E with minimum costs.

We are able to wirelessly control WALL-E's leg, hand, arms and head movements. We used voice commands, as well. So we could say that WALL-E is fully functional. This is our first prototype, so enjoy our progress and build yours.

WALL-E is a robot, so it consists of two essential parts:

  • Mechanical: The mechanical part includes the structure or the skeleton that allow for movement. Though, it will not be able to move anything without the control part.
  • Control: This is the brain or the nervous system which gives the power or the energy to move the body structure.


It is shaped like a cube. We made it from aluminum bars and connected through pins. Note: We used aluminum bars because it is easier to shape than steel; although the steel is harder, inside WALL-E, aluminum bars will be lighter on the motors and this make movement easier. For covering, we used foam board, printed the design of the body, and then stuck the design into the foam board.


1) Materials:

There are many materials you can use in making the head. We are going to mention them and the advantages and disadvantages for each.

  • Acrylic: Advantages: very hard, not affected by corrosives or climate factors, and light in weight. Disadvantages: very expensive.
  • Compressed wood (MDF) Advantages: lower in cost than acrylic, light in weight. Disadvantages: absorbs moisture from the air and liquid, therefore that will affect it in two ways. First, it will develop a very dank smell. Second, it will expand and breakdown after a while, so this material is not practical for the head.
  • Compressed foam board Advantages: very cheap compared to acrylic and MDF, very light, you can easily shape it. Disadvantages: It can be eroded by any spray.

2) Design:

If we designed the head as a solid part, it would be very heavy and this will increase the torque of the head. Therefore, we need a motor with high torque. And to make the head a solid part, we had two options: first by a molten cast model (this would be very expensive and time-consuming), and second by 3D printing (which also would be very expensive).

To resolve this problem, we made the head from compressed foam board lamination and glued the lamination together to make them one part. This method was very exhausting as you need to glue the lamination by hand. But it is very cheap in comparison with the two other methods and it will be lighter than the other two.

We designed the head on SOLIDWORKS and then cut the compressed foam board via laser cutter machine so it would be easy and fast. The head consisted of two front parts and two back parts. We connected them by making small holes in every part and connected them through with a wooden rod.

We used two servo motors to move the head: one for left and right, and the other for up and down.

3) The final view:

As previously mentioned about the compressed foam board disadvantages, it can be eroded by any spray. Therefore, we had to cover it with paper maché to protect the foam board from eroding and then painted it with gray spray paint.


1) Material:

Acrylic: we used it because we needed material that can handle the head weight and will not breakdown.

2) Design:

We designed the neck on SOLIDWORK and then cut the acrylic with a laser cutter. The design is that of a cylindrical-like part similar to the human neck. We assemble the neck parts and assemble the neck with the head by using a hot glue gun.

Movement mechanism (Legs)

Consists of (materials & components):

  • Motors
  • Free wheels (pulleys)
  • Rubber belt
  • Rubber covers
  • Aluminium body

Steps for assembling the leg parts:

1. Make the structure of the legs with aluminum bars. Connect three bars: two horizontal and parallel, and the third bar is vertical between them. It should make a shape like a capital letter i.

  • The horizontal axis: You have to allow one side of the bar to open to fix motors and make holes in the other side to fix the free wheels (pulleys).
  • The vertical axis: It is the connecting bar between the inclined and the horizontal bar.
  • The inclined axis: You need to make four holes to fix the free wheels.

2. We used a right angle hollow shaft motor to rotate the wheels in all directions (forward, reverse, right and left).

3. The wheels are made of artelon material. There are two different sizes. The larger ones are driven by the motors and the smaller ones rotate freely.

4. Put the rubber cover around the wheels to increase the friction between the wheels and the belt. This will also increase the friction between the belt and the ground.

5. Put the belt around the wheels.

6. Connect two legs together by connecting aluminum bars between them. These bars act as a suspension system for the body of WALL-E. And finally, paint the legs with black spray paint.

Hand mechanism

We made the structure of the arms by connecting two aluminum bars. In this part of WALL-E, there are two kinds of motions: linear and circular.

  • Linear motion: In this motion, we can move forward and backward. You can make this movement by using a drive screw with DC motor.
  • Circular motion: We used it to move WALL-E's arm in a rounded motion similar to our arms.

There are many kinds of motors such as Servo, Stepper, and DC.

  • Firstly, we used servo motors with high torque, but it made it such that the gear box could not stand. There was high stress if anyone wanted to move the arms when the power is off.
  • Therefore, we thought to use stepper motors, but it was very large with the required torque.
  • Finally, we decided to use DC motors and see if it works or not!!

DC motors worked very well as the speed was reduced because the torque was very high.

We faced some problems:

  • Vibration from drive screw. We overcame it by putting a bearing in the end of the screw to hold it and reduce vibrations.
  • Connection between nut power screw and the arm. We overcame this by adding a cylindrical part and weld in it the nut of the power screw on one side, and in the other side, we put the motor inside it to allow the motor rotation.

Control Parts

Here we go.

  • batteries
  • Arduino
  • 1 Shield
  • wires
  • motors

Of course, we need motor drivers or relays to control the motors' directions. We used relay modules as the motor drivers cannot stand the current of our motors.

In WALL-E, we used DC motors as we mentioned in the mechanical part. For controlling Arduino, there were too many options like using a Bluetooth or WiFi module, or USB or wireless gamepad.

  • As mentioned, we used 1Shield. It connects with a phone by Bluetooth and it has many functions or shields inside it. You can see all its’ features from the 1shield site. We are going to use Gamepad Shield. It is like a joy stick or Bluetooth module Android app and you can see more about it from GamePad Shield. As well, we used Voice Recognition Shield from 1 Shield; you can also read more about it from Voice Recognition Shield.


Wall-E's hands are much like human hands and its movement will be up and down. We could have used servo motors for this but there was a problem. The torque on the axes of the motors was very big. Therefore, there were three options:

  • Use a servo motor with the proper torque but it will be expensive.
  • Use a stepper motor but it will be expensive too.
  • Use a DC motor.

We tried the DC motor and it was so perfect; it can stand the torque. Its rpm was fine, not too fast, and its cost is acceptable.

And so, we used relays to control the motors as we mentioned in the movements. But we used a Bluetooth module to control the arms.

After connecting the circuit, you just need to download the app on your smart phone and start controlling the arms.

We did not use the 1Shield to control the arms as there were not enough buttons on the gamepad. Therefore, we had to make the hand controls separate from the movement.


There are many techniques you can use to talk to WALL-E and making WALL-E reply to you.

You can put a microphone inside the body to talk with Wall-E, but does not work well because the surrounding environment must be very quiet for receiving the voices and you should be but so close to it. That was not working so, we tried to find another way to solve this issue. We decided to use the phone microphone and connect it with the Bluetooth module to the Arduino.

There was a voice recognizer shield and a voice shield. The first one is used to understand the voices and the other is used for replying. But that was not effective for many reasons; the most important reasons were that the voice shield had limited voices to save in it and we will need to connect two shields with the Arduino, which would be a waste of power.

Therefore, we search for a shield compile between them.

There was a shield that enabled us to use all sensors in the phone including a voice recognizer. Its called 1Shield and we mentioned it in movement section so you can back to it. That was an easier way. To make WALL-E reply to you, you will need an SD card module to play the sounds you want. The advantages are you can play any number of sounds you like and you can make your own voices. If you connect the SD module directly to the speaker, its voice will be very low so we searched for a solution.

We tried many circuits. Here we mention them:

  • The first circuit uses a transistor and bunch of capacitors and resistors. It did not amplify the output very much so we had to search for another solution.
  • The second circuit uses an op amp LM386, but there was noise in the output voice too.

So we decided to use a stereo speaker.

There are some issues in the voice signal itself. You must change its frequency and the amplitude to a proper number in order to remove the noise and to make the volume is higher. You can use this site to change the frequency and the amplitude (

If you are going to buy speakers, the smaller your ohms, the clearer the output voice will be.

Heart Sensor

Simply clip the Pulse Sensor to your earlobe or finger tip and plug it into your 3 or 5 Volt Arduino, and you are ready to read heart rate! The 24" cable on the Pulse Sensor ends with standard male headers so there is no soldering needed.

Our goal is to find successive moments of instantaneous heart beat and measure the time between. The main theory is that when the heart pumps blood through the body, with every beat there is a pulse wave (kind of like a shock wave) that travels along all arteries to the very extremities of capillary tissue where the Pulse Sensor is attached.

Pulse Sensor Amped responds to relative changes in light intensity. If the amount of light incident on the sensor remains constant, the signal value will remain at (or close to) 512 (midpoint of ADC range). More light and the signal goes up. Less light, the opposite. Light from the green LED that is reflected to the sensor changes during each pulse.

For this you need a LCD to show the sensor readings. All you need to do is attach the Arduino to the LCD and make them appear on LCD screen.


We took the dimensions of WALL-E's body and printed the design of WALL-E on paper. Then we put on foam and fixed it to WALL-E’s body by using double-sided tape.

  • The front is one part.
  • The back are three parts.
  • The two sides each side two parts.
  • The other parts: the arms and the legs.

We used spray paints with Black, Yellow and Silver colors.


this code is for legs part and voice recognition
/*this code for Wall-E movements(legs)and talking with Wall-E.
 * 1Shield is our main controller with Arduino in our project, therfore there is a prif about it:
 * 1Shield is multi sheelds, you can connect it with your phone throw bluetooth and then you can access all your mobile sensors. 
     All you need the shield, library for programming and you can download it from thier website( and the phone app you can download it from the play store.
     If you opened the 1Shield app on your phone, you'll see the shields that you can use.
     We are going to mention some of the shield we uesd.
   we used gamepad shield from 1shield shields for movements control, it's like joy-stick except that it is on your phone.

 Talking with Wall-E:
   For talking with Wall-E there is two things, first how could Wall-E hear and understand our voices and how he would reply on us!!
   We used voice recognizer shield from 1Shield shields, we are going to explain how did we use it in the code.
   For replying, we used SD module for plying spicific voices that Wall-E was saying in the movie.

Created on 22/02/2017
by Makers team in pixels.

//first you need to include 1Shield library and define the shields you are going to use, you can know more about this from 1shield examples.
#include <OneSheeld.h> 

//include SD library and music library.
#include <SPI.h>
#include <SD.h>
#include <TMRpcm.h>

/*for voice recognizer shield you need to define the word or the sentence that you want Wall-E to understand it.*/
//wall-e sentence (you can put any sentence or word you want).
const char NameOne[] = "name";
const char NameTwo[] = "what's your name";
const char NameThree[]= "tell me your name";

//eva sentence.
const char EvaOne[] = "what's her name";
const char EvaTwo[] = "eva";
const char EvaThree[] = "do you have a friend";
//song sentence.
const char SongCommand[] = "song";

/* The circuit for SD Module:
  * SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
     Pin 4 or 3 used here for consistency with other Arduino examples*/
const int chipSelect = 3;

//define the music pin.
TMRpcm tmrpcm;

//define the Relays pin on Arduino.
#define MOTOR1_RELAY1 4
#define MOTOR1_RELAY2 5
#define MOTOR2_RELAY1 6
#define MOTOR2_RELAY2 7

//movement function.

//Stop moving.
void Stop() {
  digitalWrite( MOTOR1_RELAY1, HIGH);
  digitalWrite( MOTOR1_RELAY2, HIGH);
  digitalWrite( MOTOR2_RELAY1, HIGH);
  digitalWrite( MOTOR2_RELAY2, HIGH);}
// Move forward.
void forward () {
   digitalWrite( MOTOR1_RELAY1, HIGH);
   digitalWrite( MOTOR1_RELAY2, LOW);
   digitalWrite( MOTOR2_RELAY1, HIGH);
   digitalWrite( MOTOR2_RELAY2, LOW);}

//Move backward.
void backward() {
   digitalWrite( MOTOR1_RELAY1, LOW);
   digitalWrite( MOTOR1_RELAY2, HIGH);
   digitalWrite( MOTOR2_RELAY1, LOW);
   digitalWrite( MOTOR2_RELAY2, HIGH);}

//Move right.
void moveRight() {
   digitalWrite( MOTOR1_RELAY1,HIGH);
   digitalWrite( MOTOR1_RELAY2,LOW);
   digitalWrite( MOTOR2_RELAY1,LOW);
   digitalWrite( MOTOR2_RELAY2,HIGH);}

//Move left
void moveLeft() {
   digitalWrite( MOTOR1_RELAY1, LOW);
   digitalWrite( MOTOR1_RELAY2, HIGH);
   digitalWrite( MOTOR2_RELAY1, HIGH);
   digitalWrite( MOTOR2_RELAY2, LOW);}
void setup() {
  //begine 1Shield.
  //define the Relays pin as output pin by for loop for reducing the code.
  for (int i = 4 ; i < 8 ; i++) {
    pinMode(i, OUTPUT); 
  //define the speaker pin you should put it on pwm pin.
  tmrpcm.speakerPin = 9;
  //the next steps are just for making sure that the SD card is ready and initialized.
  Serial.print("\nInitializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");} 
  else {
     Serial.println("card initialized.");}"s.wav");

void loop() {
 //starting the voice recognizer shield to receive commands.
  //making comparing between the sentence you saved and the commands Arduino will receive from 1Shield.
  {if(!strcmp(NameOne,VoiceRecognition.getLastCommand())|| !strcmp(NameTwo,VoiceRecognition.getLastCommand())|| !strcmp(NameThree,VoiceRecognition.getLastCommand())){"Wall16.wav");}
    else if (!strcmp(EvaOne,VoiceRecognition.getLastCommand())||!strcmp(EvaTwo,VoiceRecognition.getLastCommand())||!strcmp(EvaThree,VoiceRecognition.getLastCommand()))
    else if (!strcmp(SongCommand,VoiceRecognition.getLastCommand())){"s.wav");}}

//moving orders using gamepad.
if (GamePad.isRedPressed())
Arm movement
/*This code for Wall-E's arm movment.
   We used bluetooth module to control it by the mobile application on phone.
   Bluetooth module are connecting with the arduino throw serial communication.
   You can download any bluetooth app from play store.
   * Receives from the hardware serial(Bluetooth module), sends to software serial(Arduino).
   * Receives from software serial(Arduino), sends to hardware serial(Bluetooth module).

Created on 22/02/2017
by Makers team in pixels. 

//include bluetooth library.

//define the Relays pin on Arduino.
#define MOTORright_RELAY1 A1
#define MOTORright_RELAY2 A2
#define MOTORleft_RELAY1 A3
#define MOTORleft_RELAY2 A4

/* The circuit:
 * RX is digital pin 3 (connect to TX of bluetooth module).
 * TX is digital pin 5 (connect to RX of bluetooth module). */ 
SoftwareSerial HC05(3,5);// RX, TX
/* Firstly you should get the numbers for each button you are going to use in your mobile app, that TX is sending from bluetooth module to RX of Arduino.
 *  You can get the numbers from the SoftwareSerial example.
 *  Then you need to save it as int, therefore you need to define a int value.
int x;

//movement function.
/* For moving the arms up and down, we used two buttons for each arm movement.
  * For moving right arm up we used upright, and For moving right arm down we used downright.
  * For moving left arm up we used upleft, and For moving left arm down we used downleft.

//Stop moving.
void Stop() {
 digitalWrite(MOTORright_RELAY1, HIGH);
 digitalWrite(MOTORright_RELAY2, HIGH);
 digitalWrite(MOTORleft_RELAY1, HIGH);
 digitalWrite(MOTORleft_RELAY2, HIGH);}

//Move rirht arm Up.
void upright () {
  digitalWrite(MOTORright_RELAY1, LOW);
  digitalWrite(MOTORright_RELAY2, HIGH);}

//Move rirht arm Down.
void downright() {
  digitalWrite(MOTORright_RELAY1, HIGH);
  digitalWrite(MOTORright_RELAY2, LOW);}

//Move left arm Up.
void upleft () {
  digitalWrite( MOTORleft_RELAY1, LOW);
  digitalWrite( MOTORleft_RELAY2, HIGH);}

//Move left arm Down.
void downleft() {
  digitalWrite( MOTORleft_RELAY1, HIGH);
  digitalWrite( MOTORleft_RELAY2, LOW);}
void setup() {
  //begin he serial connection between the Arduino and Bluetooth module.

  //Define the Relays pins as Output.
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A4, OUTPUT); 
  //Define the Relays pins as High in the beginning of the code.
void loop() {
  /*Start the loop code with if condition for start reading the incoming serial from the Bluetooth module throw RX on Arduino.
   * After that start checking x values and regarding for the coming number.
if (HC05.available()){
   x =;}
    if (x == 73){    
    else if (x == 74){  
       downleft ();
    else if (x == 71){  
        upright ();
    else if (x == 72){  
    else if ((x != 73)||(x != 74)||(x != 72)||(x != 71)){ 
        Stop ();
Heart sensor codeArduino
the original code from
>> Pulse Sensor Amped 1.1 <<
This code is for Pulse Sensor Amped by Joel Murphy and Yury Gitman 
    >>> Pulse Sensor purple wire goes to Analog Pin 0 <<<
Pulse Sensor sample aquisition and processing happens in the background via Timer 2 interrupt. 2mS sample rate.
PWM on pins 3 and 11 will not work when using this code, because we are using Timer 2!
The following variables are automatically updated:
Signal :    int that holds the analog signal data straight from the sensor. updated every 2mS.
IBI  :      int that holds the time interval between beats. 2mS resolution.
BPM  :      int that holds the heart rate value, derived every beat, from averaging previous 10 IBI values.
QS  :       boolean that is made true whenever Pulse is found and BPM is updated. User must reset.
Pulse :     boolean that is true when a heartbeat is sensed then false in time with pin13 LED going out.

This code is designed with output serial data to Processing sketch "PulseSensorAmped_Processing-xx"
The Processing sketch is a simple data visualizer. 
All the work to find the heartbeat and determine the heartrate happens in the code below.
Pin 13 LED will blink with heartbeat.
If you want to use pin 13 for something else, adjust the interrupt handler
It will also fade an LED on pin fadePin with every beat. Put an LED and series resistor from fadePin to GND.
Check here for detailed code walkthrough:

Code Version 02 by Joel Murphy & Yury Gitman  Fall 2012
This update changes the HRV variable name to IBI, which stands for Inter-Beat Interval, for clarity.
Switched the interrupt to Timer2.  500Hz sample rate, 2mS resolution IBI value.
Fade LED pin moved to pin 5 (use of Timer2 disables PWM on pins 3 & 11).
Tidied up inefficiencies since the last version. 

int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM;                   // used to hold the pulse rate
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS 

void loop(){
  sendDataToProcessing('S', Signal);     // send Processing the raw Pulse Sensor data
  if (QS == true){                       // Quantified Self flag is true when arduino finds a heartbeat
        fadeRate = 255;                  // Set 'fadeRate' Variable to 255 to fade LED with pulse
        sendDataToProcessing('B',BPM);   // send heart rate with a 'B' prefix
        sendDataToProcessing('Q',IBI);   // send time between beats with a 'Q' prefix
        QS = false;                      // reset the Quantified Self flag for next time    
  delay(20);                             //  take a break

void ledFadeToBeat(){
    fadeRate -= 15;                         //  set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!
    analogWrite(fadePin,fadeRate);          //  fade LED

void sendDataToProcessing(char symbol, int data ){
    Serial.print(symbol);                // symbol prefix tells Processing what type of data is coming
    Serial.println(data);                // the data to send culminating in a carriage return

Custom parts and enclosures

Mechanical components
estimated prices in EGP


1shield and motors
a simple diagram on how to control motors using 1shield
1 ucwvypyzdq
bluetooth and motors
in this diagram showing the circuit of hc05 bluetooth module and motors connection
2 mcntpqecm3
SD card and wall-e sound
using sd card to play wav audio files of wall-e
3 auvccxuc96


Similar projects you might like

LEGO Wall-E with Arduino

Project tutorial by monsterbacke

  • 122 respects

Voice Controlled Robot using your Smart Phone

Project tutorial by Ahmed Yassin

  • 13 respects

Control your RoboArm with your Smartphone

Project in progress by Team Zone Team

  • 33 respects

Arduino can hear and understand your voice with 1Sheeld !

Project tutorial by Alessandro Didonna

  • 11 respects

An Arduino-Powered Easter Egg Printer

Project showcase by ELEKS

  • 83 respects

smart robot

Project in progress by Arduino Arab

  • 1 comment
  • 10 respects
Add projectSign up / Login