LED Controlled by 3D Gesture Sensor

About the project

I tried controlling the display of flexible LED matrix with 3D gesture sensor.

Project info

Difficulty: Moderate

Platforms: ArduinoDFRobot

Estimated time: 1 hour

Items used in this project

Hardware components

3D Gesture Sensor (Mini) For Arduino 3D Gesture Sensor (Mini) For Arduino x 1
DFRobot DFRobot x 1
Genuino Uno Rev3 Genuino Uno Rev3 x 1

Software apps and online services

Arduino IDE Arduino IDE

Story

I tried controlling the display of flexible LED matrix with 3D gesture sensor.

Configuration

Display the eye on the LED matrix and move with the 3D gesture sensor.

Flexible 8x8 RGB LED Matrix

It has a 8x8 full color LED (NeoPixel) and soft by flexible board. The Arduino library for Neopixels is located in the following.

https://github.com/adafruit/Adafruit_NeoPixel

Please refer below for product details.

https://www.dfrobot.com/wiki/index.php/Gravity:_Flexible_8x8_RGB_LED_Matrix_SKU:_DFR0461

3D Gesture Sensor

Five electrodes are arranged in the up, down, left, right and middle. Gesture is sensed by changes in electrostatic capacitance of electrodes due to hand approach.

The Arduino library for the 3D Gesture Sensor is located in the following.

https://github.com/DFRobot/DFRobot_Gesture

This gesture sensor detects clockwise/counterclockwise rotation and movement directions (up, down, left, right) using program example "_3D_Gesture_Test.ino".

Please refer below for product details.

https://www.dfrobot.com/wiki/index.php/3D_Gesture_Sensor_Mini_SKU:_SEN0202

Arduino Programming

Display the eyeball on the LED matrix, move the eyes right and left with the left and right sensing of the gesture sensor, open and close the eyelids by vertical sensing. The pupil faces the front in clockwise or counterclockwise sensing.

LED Array:

Code:

#include <Adafruit_NeoPixel.h> 
#include <DFRobot_Gesture.h> 
#include <Wire.h> 
int sensePin= A1; 
unsigned char cmd; 
DFRobot_Gesture myGesture; 
#define DIN A0 
Adafruit_NeoPixel led = Adafruit_NeoPixel(64, DIN, NEO_GRB + NEO_KHZ800); 
int LR = 5; 
int eyelid = 0; 
int whiteNum = 52; 
int blackNum = 20; 
int pupilNum = 12; 
//white eye 
int whiteLED[52] = { 2,  3,  4,  5,  9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,   
                         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 58, 59, 60, 61}; 
//black eye 
int blackLED[11][20] = {{50, 51, 52, 53, 58, 61, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             {42, 43, 44, 45, 49, 50, 53, 54, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             {34, 35, 36, 37, 41, 42, 45, 46, 49, 54, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             {26, 27, 28, 29, 33, 34, 37, 38, 41, 46, 54, 49, 58, 61, 61, 64, 64, 64, 64, 64}, 
                             {18, 19, 20, 21, 25, 26, 29, 30, 33, 38, 41, 46, 49, 50, 53, 54, 58, 59, 60, 61}, 
                             {10, 11, 12, 13, 17, 18, 21, 22, 25, 30, 33, 38, 41, 42, 45, 46, 50, 51, 52, 53}, 
                             { 2,  3,  4,  5,  9, 10, 13, 14, 17, 22, 25, 30, 33, 34, 37, 38, 42, 43, 44, 45}, 
                             { 2,  5,  9, 14, 17, 22, 25, 26, 29, 30, 34, 35, 36, 37, 64, 64, 64, 64, 64, 64}, 
                             { 9, 14, 17, 18, 21, 22, 26, 27, 28, 29, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             { 9, 10, 13, 14, 18, 19, 20, 21, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             { 2,  5, 10, 11, 12, 13, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}}; 
//pupil 
int pupilLED[11][12] = {{59, 60, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, 
                             {51, 52, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64}, 
                             {43, 44, 50, 51, 52, 53, 58, 59, 60, 61, 64, 64}, 
                             {35, 36, 42, 43, 44, 45, 50, 51, 52, 53, 59, 60}, 
                             {27, 28, 34, 35, 36, 37, 42, 43, 44, 45, 51, 52}, 
                             {19, 20, 26, 27, 28, 29, 34, 35, 36, 37, 43, 44}, 
                             {11, 12, 18, 19, 20, 21, 26, 27, 28, 29, 35, 36}, 
                             { 3,  4, 10, 11, 12, 13, 18, 19, 20, 21, 27, 28}, 
                             { 2,  3,  4,  5, 10, 11, 12, 13, 19, 20, 64, 64}, 
                             { 2,  3,  4,  5, 11, 12, 64, 64, 64, 64, 64, 64}, 
                             { 3,  4, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}}; 
//eyelid 
int eyelidNum[8] = {0,4,8,14,20,28,36,44}; 
int eyelidLED[56] = {23, 24, 39, 40, 22, 25, 38, 41,  9, 21, 26, 37, 42, 54, 10, 20, 27, 36, 43, 53,  5, 11,  
                    19, 28, 35, 44, 52, 58,  4, 12, 18, 29, 34, 45, 51, 59,  3, 13, 17, 30, 33, 46, 50, 60}; 
void setup(){ 
 Wire.begin();        // join i2c bus (address optional for master) 
 Serial.begin(115200);  // start serial for output 
 pinMode(sensePin, INPUT); 
 led.begin(); 
 led.setBrightness(100); //LED brightness 0-255  
 blink(LR, eyelid); 
} 
void loop(){ 
 if(digitalRead(sensePin)==0){   
   myGesture.I2C1_MasterRead(md.buf,26,0x42); //The address is:0x42 
   cmd = myGesture.mgcProcMsg();     //process the message 
   if(cmd != GI_NOGESTURE ){ 
     switch(cmd){ 
       case GI_FLICK_R: 
         Serial.println("RIGHT"); 
         //Move the eye right 
         for(int i = LR; i <= 10; i++){ 
           blink(i, eyelid); 
           delay(100); 
         } 
         LR = 10; 
         break; 
       case GI_FLICK_L: 
         Serial.println("LEFT"); 
         //Move the eye left 
         for(int i = LR; i >= 0; i--){ 
           blink(i, eyelid); 
           delay(100); 
         } 
         LR = 0; 
         break; 
       case GI_FLICK_D: 
         Serial.println("DOWN"); 
         //Eyelid close 
         for(int i = eyelid; eyelid <= 8; eyelid++){ 
           blink(LR, eyelid); 
           delay(100); 
         } 
         eyelid = 8; 
         break; 
       case GI_FLICK_U: 
         Serial.println("UP"); 
         //Eyelid open 
         for(int i = eyelid; eyelid >= 0; eyelid--){ 
           blink(LR, eyelid); 
           delay(100); 
         } 
         eyelid = 0; 
         break; 
       case GI_AIRWHEEL_CW://Clockwise in circles 
         Serial.println("CW"); 
         //Return eye to the front 
         Return(); 
         break; 
       case GI_AIRWHEEL_CCW://Counterclockwise circles 
         Serial.println("CCW"); 
         //Return eye to the front 
         Return(); 
         break; 
       default: break; 
       } 
     } 
   } 
} 
void blink( int LR, int eyelid) { 
 if (eyelid != 8){ 
   //white eye 
   for(uint16_t i=0; i<whiteNum; i++) { 
     led.setPixelColor(whiteLED[i], led.Color(66, 66, 66)); 
   } 
   //black eye 
   for(uint16_t i=0; i<blackNum; i++) { 
     led.setPixelColor(blackLED[LR][i], led.Color(0, 177, 55)); 
   } 
   //pupil 
   for(uint16_t i=0; i<pupilNum; i++) { 
     led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66)); 
   } 
   //eyelid 
   for(int i=0; i < eyelidNum[eyelid]; i++) { 
     led.setPixelColor(eyelidLED[i], 0); 
   } 
 } else if (eyelid == 8){ 
   led.clear(); 
 } 
 led.show(); 
} 
void Return() { 
 if(LR == 0){ 
   for(int i = LR; i <= 5; i++){ 
     blink(i, eyelid); 
     delay(100); 
   } 
 } 
 if(LR == 10){ 
   for(int i = LR; i >= 5; i--){ 
     blink(i, eyelid); 
     delay(100); 
   } 
 } 
 LR = 5; 
} 

Operation

Credits

Photo of electrouser918

electrouser918

We are family. hobby is D.I.Y!!

   

Leave your feedback...