Search
Close this search box.

Hand Gesture Controlled Robot using Arduino

In this project, we have designed a simple Hand Gesture Controlled Robot using Arduino. This Hand Gesture Controlled Robot is based on Arduino Nano, MPU6050, RF Transmitter-Receiver Pair and L293D Motor Driver.

Hand Gesture Controlled Robot using Arduino

Even though the title says it as a Hand Gestured Controlled Robot, technically this robot is controlled by the tilt of the hand. 

Before proceeding with the project, take a look at this GETTING STARTED WITH ARDUINO AND MPU6050.  

Preface

A Robot is an electro-mechanical system that is operated by a computer program. Robots can be autonomous or semi-autonomous. An autonomous robot is not controlled by human and acts on its own decision by sensing its environment.

Majority of the industrial robots are autonomous as they are required to operate at high speed and with great accuracy. But some applications require semi-autonomous or human controlled robots.

Some of the most commonly used control systems are voice recognition, tactile or touch controlled and motion controlled.

One of the frequently implemented motion controlled robot is a Hand Gesture Controlled Robot. In this project, a hand gesture controlled robot is developed using MPU6050, which is a 3-axis Accelerometer and 3-axis Gyroscope sensor and the controller part is Arduino Nano.

Instead of using a remote control with buttons or a joystick, the gestures of the hand are used to control the motion of the robot.

The project is based on wireless communication, where the data from the hand gestures is transmitted to the robot over RF link (RF Transmitter – Receiver pair).

The project is divided into transmitter and receiver section. The circuit diagram and components are explained separately for both transmitter and receiver sections.

Hand Gesture Controlled Robot Image 1
Hand Gesture Controlled Robot Image 2
Hand Gesture Controlled Robot Image 3

Principle of Hand Gesture Controlled Robot

In order to understand the principle of operation of Hand Gesture Controlled Robot, let us divide the project into three parts.

The first part is getting data from the MPU6050 Accelerometer Gyro Sensor by the Arduino. The Arduino continuously acquires data from the MPU6050 and based on the predefined parameters, it sends a data to the RF Transmitter.

The second part of the project is the Wireless Communication between the RF Transmitter and RF Receiver. The RF Transmitter, upon receiving data from Arduino (through the Encoder IC), transmits it through the RF Communication to the RF Receiver.

Finally, the third part of the project is decoding the Data received by the RF Receiver and sending appropriate signals to the Motor Driver IC, which will activate the Wheel Motors of the Robot.          

Block Diagram of Hand Gesture Controlled Robot

The following images show the simple block diagram of Hand Gesture Controlled Robot for both Transmitter and Receiver Parts.

Transmitter Block Diagram

Hand Gesture Controlled Robot Image 4

Receiver Block Diagram

Hand Gesture Controlled Robot Image 5

Circuit Diagram of the Transmitter Section

The following image shows the circuit diagram of the Transmitter part of the Hand Gesture Controlled Robot project.Hand Gesture Controlled Robot Image 11

Components for Transmitter Section

  • Arduino Nano
  • 434MHz RF Transmitter
  • HT-12E Encoder IC
  • MPU6050 Accelerometer/Gyroscope Sensor
  • 750KΩ Resistor

Circuit Diagram of the Receiver Section

 

Hand Gesture Controlled Robot Image 10

Components for Receiver Section

  • L293D Motor Driver IC
  • HT-12D Decoder IC
  • 434 MHz RF Receiver
  • 33KΩ Resistor
  • 330Ω Resistor
  • LED
  • 4 Geared Motors with Wheels
  • Robot Chassis

Component Description

MPU6050

The MPU6050 is one of the most commonly used Sensor Modules by hobbyists and enthusiasts. It consists of Accelerometer and Gyroscope on the same IC and provides 6 Degrees of Freedom (3-axis of Accelerometer and 3-axis of Gyroscope).

Hand Gesture Controlled Robot Image 12

RF Transmitter and Receiver Modules

The communication between transmitter and receiver is using RF modules. A 434 MHz transmitter and receiver pair are used in this project.

HT-12E

It is an encoder IC that converts the 4-bit parallel data into serial data in order to transmit over RF link.

HT-12D

It is a decoder IC that converts the serial data received by the RF Receiver into 4-bit parallel data. This parallel data can be used to drive the motors.

RF Link with Encoder and Decoder

Circuit Design of Hand Gesture Controlled Robot

Transmitter Section

The transmitter section of the robot consists of Arduino Nano board, MPU6050 Sensor, HT-12E Encoder IC and an RF Transmitter. The communication between Arduino and MPU6050 Sensor takes place through I2C Interface. Hence, the SCL and SDA pins of the MPU6050 Sensor are connected to A5 and A4 pins of the Arduino Nano.

Additionally, we will be using the interrupt pin of the MPU6050 and hence, it is connected to D2 of Arduino Nano.  

HT-12E is an encoder IC that is often associated with RF Transmitter module. It converts the 12-bit parallel data to serial data. The 12-bit data is divided into address and data bits. A0 to A7 (Pin 1 to Pin8) are the address bits and they are used for secure transmission of the data. These pins can be either left open or connected to ground (Vss). In this circuit, Pin 1 to Pin 9 (A0 – A7 and Vss) of HT-12E are connected to ground.

Pins 10 to 13 (AD8, AD9, AD10 and AD11) are the data pins of HT-12E. They receive the 4 word parallel data from external source like a microcontroller (Arduino Nano in this case). They are connected to the pins D12, D11, D10 and D9 of Arduino Nano respectively.

TE’ is the transmission enable pin and it is an active low pin. The data is transmitted as long as the TE’ is low. Hence, Pin 14 (TE’) is also connected to ground.

The encoder IC has an internal oscillator circuit between the pins 16 and 15 (OSC1 and OSC2). A 750KΩ resistor is connected between these pins to enable the oscillator. Dout (Pin 17) is the serial data out pin. It is connected to the data in pin of the RF Transmitter.

Both Arduino Nano and MPU6050 have 3.3V Regulator. Hence, all the VCC pins are connected to a regulated 5V Supply.

Hand Gesture Controlled Robot Image 6

Receiver Section

The receiver section of the robot consists of an RF Receiver, HT-12D Decoder IC, L293D Motor Driver IC and a robot chassis with four motors connected to wheels.

HT-12D is the decoder IC that is often associated with RF Receiver. It converts the serial data received by the RF link into parallel data. A0 to A7 (Pin 1 to Pin 8) are the address pins and must be matched with the address pins of the encoder.

Since the address pins of encoder (HT-12E) are grounded, the address pins of decoder must also be grounded. Hence, pins 1 to 9 (A0 – A7 and Vss) are connected to ground. The serial data from the RF Receiver is given to Din (Pin 14) of the decoder IC.

HT-12D has an internal oscillator and an external resistor of 33KΩ is connected between OSC1 and OSC2 (Pins 16 and 15). Pin 17 (VT) indicates a valid transmission of data and this pin will be high when a valid data is present on the data pins. An LED in series with a 330Ω resistor is connected to this pin to indicate a valid data transmission.

Pins 10 to 13 (D8, D9, D10 and D11) of HT-12D are the parallel data out pins. They are connected to the input pins of the L293D motor driver IC (Pins 2, 7, 10 and 15 respectively).

L293D motor driver IC is used to provide the necessary current (for both forward and reverse directions) to the motors. Pins 1 and 9 are the enable pins and are connected to VCC (+5v) along with Pin 16 (which is the logic supply). Pins 3 – 6 and 11 – 14 are the outputs and are connected to the four motors.

Pin 8 is the Motor Supply Pin and is connected to a separate power supply. Hence, you will need two batteries in the Receiver Section; one for the Circuit and one for the motors. 

Hand Gesture Controlled Robot Image 7

 

Working of Hand Gesture Controlled Robot

In this project, a mobile robot that is controlled by the gestures made by the hand, is designed. The working of the robot is explained here.

As mentioned earlier, the gesture controlled robot is a wireless operated robot and has two parts: Transmitter and Receiver. When the robot is powered on, the transmitter part, which consists of Arduino, MPU6050, Encoder and RF Transmitter, will continuously monitor the MPU6050 sensor.

This data is captured by the Arduino, which then transmits a corresponding data to the Encoder, based on the orientation of the MPU6050 Sensor. The parallel data received by the encoder is converted into serial data and this serial data is transmitted by the RF Transmitter.

At the receiver section, the RF Receiver receives the serial data and transmits it to the Decoder IC. The Decoder will convert the serial data to parallel data and this parallel data is given to the motor driver IC. Based on the data, the movement of the motors, and hence the movement of the robot is defined. 

 

Applications

  • Wireless controlled robots are very useful in many applications like remote surveillance, military etc.
  • Hand gesture controlled robot can be used by physically challenged in wheelchairs.
  • Hand gesture controlled industrial grade robotic arms can be developed.

So far you came to know about Hand Gesture Controlled Robot that completely moves according to moments of your hand (sign of input to the device). If you are looking for a similar low-budget device then Robot vacuum cleaners best suit you as it has a greater functionality in cleaning your home.

For more information about vacuum cleaners, read Top 14 Affordable Robot Vacuum Cleaners in 2018

36 Responses

  1. Hey I tried this project, but the accelerometer does not give constant readings for a particular gesture…and for two different gestures the readings are similar…. is there a solution for this?

      1. int GNDPin=A4; //Set Analog pin 4 as GND
        int VccPin=A5; //Set Analog pin 5 as VCC
        int xPin=A3; //X axis input
        int yPin=A2; //Y axis input
        int zPin=A1; //Z axis input(not used)
        int Q1=10,Q2=11,Q3=12,Q4=13; //Output pins to be connected to 10, 11, 12, 13 of Decoder IC
        long x; //Variabe for storing X coordinates
        long y; //Variabe for storing Y coordinates
        long z; //Variabe for storing Z coordinates
        void setup()
        {
        Serial.begin(9600);
        pinMode(Q1,OUTPUT);
        pinMode(Q2,OUTPUT);
        pinMode(Q3,OUTPUT);
        pinMode(Q4,OUTPUT);
        pinMode(GNDPin, OUTPUT);
        pinMode(VccPin, OUTPUT);
        digitalWrite(GNDPin, LOW); //Set A4 pin LOW
        digitalWrite(VccPin, HIGH); //Set A5 pin HIGH
        }
        void loop()
        {
        x = analogRead(xPin); //Reads X coordinates
        y = analogRead(yPin); //Reads Y coordinates
        z = analogRead(zPin); //Reads Z coordinates (Not Used)
        if(x400) // Change the value for adjusting sensitivity
        backward();
        else if(y>400) // Change the value for adjusting sensitivity
        right();
        else if(y<340) // Change the value for adjusting sensitivity
        left();
        else
        stop_();
        }
        void stop_()
        {
        Serial.println("");
        Serial.println("STOP");
        digitalWrite(Q1,LOW);
        digitalWrite(Q2,LOW);
        digitalWrite(Q3,LOW);
        digitalWrite(Q4,LOW);
        }
        void forward()
        {
        Serial.println("");
        Serial.println("Forward");
        digitalWrite(Q1,HIGH);
        digitalWrite(Q2,LOW);
        digitalWrite(Q3,HIGH);
        digitalWrite(Q4,LOW);
        }
        void backward()
        {
        Serial.println("");
        Serial.println("Backward");
        digitalWrite(Q1,LOW);
        digitalWrite(Q2,HIGH);
        digitalWrite(Q3,LOW);
        digitalWrite(Q4,HIGH);
        }
        void left()
        {
        Serial.println("");
        Serial.println("Left");
        digitalWrite(Q1,LOW);
        digitalWrite(Q2,HIGH);
        digitalWrite(Q3,HIGH);
        digitalWrite(Q4,LOW);
        }
        void right()
        {
        Serial.println("");
        Serial.println("Right");
        digitalWrite(Q1,HIGH);
        digitalWrite(Q2,LOW);
        digitalWrite(Q3,LOW);
        digitalWrite(Q4,HIGH);
        }

        1. What about i2c programming….

          This project code is completely wrong. i think you have done it with adxl335.

          According to circuit given only two pins were connected to arduino from mpu6050.

          You have declared 3 pins for x y and z axis. how is it possible.

          If possible update the working code with mpu6050

          1. Yes this code is completely wrong. It was written with a ADXL335 dont use this code. You will have to write your own code, or just incorporate another arduino into the reciver section!!! STAY AWAY hopefully someone can upload a working code

  2. Interestering,
    I will use the Raspberry Pi Zero or even the RPi3 to add WiFi and further processing.
    Camera etc. The Arduino is a bit restricted.

  3. i was getting some reading at receiver section and at transmitter section the voltage was right………but unable to move the bot. what might be reason…/?

  4. Thank you for sharing this wonderful iot project idea which i been looking for. I will pass this to my friends who is been looking for and i will connect them here directly to feedback you when they are in w.i.p. You keep it up

  5. Can anyone tell me how to make this car without using HT12D, HT12E IC and Using two Arduinos.

  6. I am a student. So what is overall cost of this project??? Any changes that can lead to affordable costs.
    Greatly interested in making it…..

  7. hi…itried itin proteus but I can’t find the MPU6050..
    do u have alibrary on it?

    or can you send me the software simulation

  8. I am currently developing the project about controlling the ABB IRB120 robot by using Kinect Xbox360. Anyone have the ideas on the coding parts?

Leave a Reply

Your email address will not be published. Required fields are marked *