2

Gesture Sensor (APDS9960) interface with SK40C+PIC16F877A

Introduction:

Hi everyone !! Since we have received suggestion from user on how to integrate the Gesture sensor with PIC, we have come out with this tutorial. In this tutorial, we are using the SK40C with PIC16F877A to read the hands gesture and lastly display on LCD.

Covered in this tutorial:

  • Material required (Hardware and software)
  • Additional information about the gesture sensor
  • Circuit diagram of Gesture sensor interface with SK40C
  • Code overview 
  • Demonstration video

If you have further inquiry about this tutorial, please post it in our technical forum as we seldom check the comment section in tutorial site.

Hardware Required:

Gesture sensor  SK40C
PIC16f877A

Logic converter

 

 

Voltage Regulator 3.3V Jumper
UIC00B LCD

Software required:

  • MPLABX IDE
  • XC8 Compiler

Additional information:

The APDS-9960 is a hardware built in with UV and IR blocking filters, four separate diodes sensitive to different directions, and an I2C compatible interface. It 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).

Interface and control are accomplished through an I2C-bus serial compatible interface (standard or fast mode) to a set of registers that provide access to device control functions and output data. The devices support the 7-bit I2C-bus addressing protocol. The device supports a single slave address of 0×39 Hex using 7-bit addressing protocol.

DESCRIPTION GESTURE DETECTION

Gesture detection utilizes four directional photodiodes to sense reflected IR energy (sourced by the integrated LED) to convert physical motion information (i.e. velocity, direction and distance) to a digital information. The architecture of the gesture engine features automatic activation (based on Proximity engine results), ambient light subtraction, cross-talk cancellation, dual 8-bit data converters, power saving inter-conversion delay, 32-dataset FIFO, and interrupt driven I2C communication. The gesture engine accommodates a wide range of mobile device gesturing requirements: simple UP-DOWN-RIGHT-LEFT gestures or more complex gestures can be accurately sensed. Power consumption and noise are minimized with adjustable IR LED timing.(APDS9960 Datasheet,p1)

Circuit diagram:

2

CAUTION!!!You must use 3.3V! If you try to use a 5V power supply or 5V I2C communications, you risk damaging the APDS-9960. If you are using a 5V signal, then you need to have some kind of level shifting/logic converter.

So we need 3.3V voltage regulator to get 3.3V output. You can refer to the datasheet of this voltage regulator for connection.

And for I2C communications pins we used logic converter to convert 5V signal to 3.3V signal.

I2C pin for PIC16F877A:

I2C pin SCL SDA
PIC16F877A RC3 RC4

 

This sensor also interrupt driven I2C communication. An interrupt is generated based on the number of gesture “datasets” results placed in the FIFO.For PIC16F877A interrupt pin is at RB0.

pic16f877A

You also can refer to datasheet here.

Code overview:

Here we will only discuss the important part. You can download the full sample code here.

This sample code is for Gesture Test to read hand gesture / swiping and display on LCD. To understand more about the operation of this gesture sensor you can refer to this datasheet from page 14 to 17.

1) Setup for interrupt and I2C in Main function

TRISB = 0b00000001; //RB0 as input(interrupt)
TRISC = 0b00011000; //RC3 and RC4 as input (I2C communication)

scl and sda

// Initialize interrupt service routine

INTF = 0; // Reset the external interrupt flag
INTE = 1; // Enable external interrupts from
PEIE = 1;// Enable peripheral interrupt
GIE = 1; // Global interrupt enable

INTERRUPT REGISTER
OPTION_REG = 0; // Enable Internal Pull-ups and Interrupt on falling edge

RISING OR FALLING EDGE

2) Interrupt function.

INTERRUPT FUNCTION

If INTF = 1, means that there is interrupt occur at RB0. Disable the interrupt pin. INTE=0 so that it will not interfere if there is interrupt when main function is running . Set the handleGestureFlag=1; clear the interrupt flag, INTF = 0; enable the interrupt pin again to allow next interrupt to occur.

3) While loop in main() function.

main

This function will check when the handleGestureFlag = 1 or interrupt flag from interrupt function. if there is interrupt, it will run handleGesture() function.

4)handleGesture() function

void handleGesture()
{
if (isGestureAvailable())
{
switch (readGesture())
{
case DIR_UP:
lcd_clear();
lcd_home();
lcd_putstr(“up”);
__delay_ms(1000);
break;
case DIR_DOWN:
lcd_clear();
lcd_home();
lcd_putstr(“down”);
__delay_ms(1000);
break;
case DIR_LEFT:
lcd_clear();
lcd_home();
lcd_putstr(“left”);
__delay_ms(1000);
break;
case DIR_RIGHT:
lcd_clear();
lcd_home();
lcd_putstr(“right”);
__delay_ms(1000);
break;
case DIR_NEAR:
lcd_clear();
lcd_home();
lcd_putstr(“near”);
__delay_ms(1000);
break;
case DIR_FAR:
lcd_clear();
lcd_home();
lcd_putstr(“far”);
__delay_ms(1000);
break;
default:
lcd_clear();
lcd_home();
lcd_putstr(“NONE”);
__delay_ms(1000);
}
lcd_clear();
}
}

Supported Gestures

Here is a list of the currently supported gestures. Make sure each gesture begins outside of the range of the sensor, moves into the range of the sensor, and ends outside the range of the sensor.

Gesture Description

UP A swipe from the bottom of the board to the top and out of range of the sensor. Make sure that your wrist/arm is not in the sensor’s range at the end of the swipe!
DOWN A swipe from the top of the board to the bottom and out of range of the sensor.
LEFT  A swipe from the right side of the board to the left and out of range of the sensor.
RIGHT A swipe from the left side of the board to the right and out of range of the sensor.
NEAR Object (e.g. hand) starts far above the sensor, moves close to the sensor, hovers for at least 1 second, and moves out of range of the sensor.
FAR Object starts near the sensor, hovers for at least 1 second, and then moves up above and out of range of the sensor.
NONE The sensor could not correctly guess the gesture being performed.

 

Video:

References:

Attachment:

Buy

Leave a Reply

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