top of page

Gesture Controlled Door using servo Motor

Updated: Dec 29, 2022

Here to Control the Car doors using APDS-9960 Gesture sensor using servo and send data to Android application through Bluetooth HC-0 5 for graphic image on door opening/closing.



Circuit Diagram:


For Programmed ardunio Uno & Price: 

Components required:

Arduino uno: 1 no

APDS-9960 - 1 no

Servo SG90 OR MG995- 3 nos

Bluetooth HC-05- 1 no

LCD 20X4, I2c- 1no


APDS-9960:

This is the SparkFun RGB and Gesture Sensor, a small breakout board with a built in APDS-9960 sensor that offers ambient light and color measuring, proximity detection, and touchless gesture sensing. With this RGB and Gesture Sensor you will be able to control a computer, microcontroller, robot, and more with a simple swipe of your hand! This is, in fact, the same sensor that the Samsung Galaxy S5 uses and is probably one of the best gesture sensors on the market for the price.

The APDS-9960 is a serious little piece of hardware with built in UV and IR blocking filters, four separate diodes sensitive to different directions, and an I2C compatible interface. For your convenience we have broken out the following pins:

  • VL (optional power to IR LED),

  • GND (Ground),

  • VCC (power to APDS-9960 sensor),

  • SDA (I2C data),

  • SCL (I2C clock), and

  • INT (interrupt).

Each APDS-9960 also has a detection range of 4 to 8 inches (10 to 20 cm).


Servo motor:

A servo motor is an electric device used for precise control of angular rotation. It is used in applications that demand precise control over motion, like in case of control of a robotic arm.

The rotation angle of the servo motor is controlled by applying a PWM signal to it.

By varying the width of the PWM signal, we can change the rotation angle and direction of the motor.

Wire Configuration:

  • Brown - Ground wire connected to the ground of system

  • Red - Powers the motor typically +5V is used

  • Orange - PWM signal is given in through this wire to drive the motor


Bluetooth HC-05:

HC-05 is a Bluetooth module which is designed for wireless comunication. This module can be used in a master or slave configuration. Bluetooth serial modules allow all serial enabled devices to communicate with each other using Bluetooth.

It has 6 pins,

1. Key/EN: It is used to bring Bluetooth module in AT commands mode. If Key/EN pin is set to high, then this module will work in command mode. Otherwise by default it is in data mode. The default baud rate of HC-05 in command mode is 38400bps and 9600 in data mode.

HC-05 module has two modes,

1. Data mode: Exchange of data between devices.

2. Command mode: It uses AT commands which are used to change setting of HC-05. To send these commands to module serial (USART) port is used.

2. VCC: Connect 5 V or 3.3 V to this Pin.

3. GND: Ground Pin of module.

4. TXD: Transmit Serial data (wirelessly received data by Bluetooth module transmitted out serially on TXD pin)

5. RXD: Receive data serially (received data will be transmitted wirelessly by Bluetooth module).

6. State: It tells whether module is connected or not.

HC-05 module Information

  • HC-05 has red LED which indicates connection status, whether the Bluetooth is connected or not. Before connecting to HC-05 module this red LED blinks continuously in a periodic manner. When it gets connected to any other Bluetooth device, its blinking slows down to two seconds.

  • This module works on 3.3 V. We can connect 5V supply voltage as well since the module has on board 5 to 3.3 V regulator.

  • As HC-05 Bluetooth module has 3.3 V level for RX/TX and microcontroller can detect 3.3 V level, so, no need to shift transmit level of HC-05 module. But we need to shift the transmit voltage level from microcontroller to RX of HC-05 module.

HC-05 Default Settings

  • Default Bluetooth Name: “HC-05”

  • Default Password: 1234 or 0000

  • Default Communication: Slave

  • Default Mode: Data Mode

  • Data Mode Baud Rate: 9600, 8, N, 1

  • Command Mode Baud Rate: 38400, 8, N, 1

  • Default firmware: LINVOR


Arduino Code:

#include <Wire.h>

#include <SparkFun_APDS9960.h>


// Pins

#define APDS9960_INT 2 // Needs to be an interrupt pin


// Constants


// Global Variables

SparkFun_APDS9960 apds = SparkFun_APDS9960();

int isr_flag = 0;


#include <Servo.h>


Servo RoofSERVO1; // create servo object to control a servo

Servo SideSERVO2; // create servo object to control a servo

Servo RearSERVO3; // create servo object to control a servo

// twelve servo objects can be created on most boards


int pos = 0; // variable to store the servo


#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);


void setup() {


// Set interrupt pin as input

pinMode(APDS9960_INT, INPUT);


// Initialize Serial port

Serial.begin(9600);

Serial.println();

Serial.println(F("--------------------------------"));

Serial.println(F("SparkFun APDS-9960 - GestureTest"));

Serial.println(F("--------------------------------"));

// Initialize interrupt service routine

attachInterrupt(0, interruptRoutine, FALLING);


// Initialize APDS-9960 (configure I2C and initial values)

if ( apds.init() ) {

Serial.println(F("APDS-9960 initialization complete"));

} else {

Serial.println(F("Something went wrong during APDS-9960 init!"));

}

// Start running the APDS-9960 gesture sensor engine

if ( apds.enableGestureSensor(true) ) {

Serial.println(F("Gesture sensor is now running"));

} else {

Serial.println(F("Something went wrong during gesture sensor init!"));

}

RoofSERVO1.attach(9);

SideSERVO2.attach(10);

RearSERVO3.attach(11);

lcd.init(); // initialize the lcd

// Print a message to the LCD.

lcd.backlight();

lcd.setCursor(0,0);

lcd.print(" GESTURE CONTROLLED ");

lcd.setCursor(0,1);

lcd.print("DOOR OPENING & CLOSE");

lcd.setCursor(0,2);

lcd.print("USING SERVO MOTOR , ");

lcd.setCursor(0,3);

lcd.print("BLUETOOTH & ANDROID ");

delay (3000);

lcd.clear();

}


void loop() {

lcd.backlight();

lcd.setCursor(0,0);

lcd.print("GESTURE DOOR CONTROL");

if( isr_flag == 1 ) {

detachInterrupt(0);

handleGesture();

isr_flag = 0;

attachInterrupt(0, interruptRoutine, FALLING);

}

}


void interruptRoutine() {

isr_flag = 1;

}


void handleGesture() {

if ( apds.isGestureAvailable() ) {

switch ( apds.readGesture() ) {

case DIR_UP:

Serial.println("10");

//

for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

// in steps of 1 degree

RoofSERVO1.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}


lcd.setCursor(0,1);

lcd.print("S1: TOP ROOF OPENED ");

//

break;

case DIR_DOWN:

Serial.println("20");

//

for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

RoofSERVO1.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}

lcd.setCursor(0,1);

lcd.print("S1: TOP ROOF CLOSED ");

//


break;

case DIR_LEFT:

Serial.println("30");

//

for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

// in steps of 1 degree

SideSERVO2.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}

lcd.setCursor(0,2);

lcd.print("S2: SIDE DOOR CLOSED");

//

break;

case DIR_RIGHT:

Serial.println("40");

//

for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

SideSERVO2.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}

lcd.setCursor(0,2);

lcd.print("S2: SIDE DOOR OPENED");

//

break;

case DIR_NEAR:

Serial.println("50");

//

for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

// in steps of 1 degree

RearSERVO3.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}

lcd.setCursor(0,3);

lcd.print("S3: REAR DOOR CLOSED");

//

break;

case DIR_FAR:

Serial.println("60");

//

for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

RearSERVO3.write(pos); // tell servo to go to position in variable 'pos'

delay(15); // waits 15ms for the servo to reach the position

}

lcd.setCursor(0,3);

lcd.print("S3: REAR DOOR OPENED");

//


break;

default:

Serial.println("100");

}

}

}


Android application:







Download .aia file


136 views0 comments
bottom of page