Arduino gesture sensor tutorial

details

In this tutorial, Author will hook up a gesture sensor to a dizmo. Author is going to use an Arduino and WebSockets.

complete

Parts needed

Code

#include <SPI.h>
    #include <Wire.h>
    #include <Ethernet.h>
    #include <SparkFun_APDS9960.h>

    // Enabe debug tracing to Serial port.
    #define DEBUG true
    #define STATICIP false

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

    // Here we define a maximum framelength to 64 bytes. Default is 256.
    #define MAX_FRAME_LENGTH 64

    #include <WebSocket.h>

    byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x91, 0x8C };

    #if STATICIP
    byte ip[] = {10,0,1,100};
    #endif

    // Create a Websocket server
    WebSocketServer wsServer;

    void onConnect(WebSocket &socket) {
    Serial.println("onConnect called");
    }

    // You must have at least one function with the following signature.
    // It will be called by the server when a data frame is received.
    void onData(WebSocket &socket, char* dataString, byte frameLength) {

    #ifdef DEBUG
    Serial.print("Got data: ");
    Serial.write((unsigned char*)dataString, frameLength);
    Serial.println();
    #endif

    // Just echo back data for fun.
    socket.send(dataString, strlen(dataString));
    }

    void onDisconnect(WebSocket &socket) {
    Serial.println("onDisconnect called");
    }


    // Global Variables
    SparkFun_APDS9960 apds = SparkFun_APDS9960();
    int isr_flag = 0;



    void setup() {
    #ifdef DEBUG  
    Serial.begin(9600);
    #endif

    #if STATICIP
    Ethernet.begin(mac, ip);
    #else
    if (Ethernet.begin(mac) == 0) {
    #if DEBUG
    Serial.println("Unable to set server IP address using DHCP");
    #endif
    for(;;)
    ;
    }
    #if DEBUG
    // report the dhcp IP address:
    Serial.println(Ethernet.localIP());
    #endif
    #endif

    wsServer.registerConnectCallback(&onConnect);
    wsServer.registerDataCallback(&onData);
    wsServer.registerDisconnectCallback(&onDisconnect);
    wsServer.begin();

    delay(100); // Give Ethernet time to get ready


    // Set interrupt pin as input
    pinMode(APDS9960_INT, INPUT);

    // 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!"));
    }

    }

    void interruptRoutine() {
    isr_flag = 1;
    }

    String handleGesture() {
    String gesture;
    gesture="NONE  ";

    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
    case DIR_UP:
    Serial.println("UP   ");
    gesture="UP";
    break;
    case DIR_DOWN:
    Serial.println("DOWN");
    gesture="DOWN ";
    break;
    case DIR_LEFT:
    Serial.println("LEFT");
    gesture="LEFT ";
    break;
    case DIR_RIGHT:
    Serial.println("RIGHT");
    gesture="RIGHT";
    break;
    case DIR_NEAR:
    Serial.println("NEAR");
    gesture="NEAR  ";
    break;
    case DIR_FAR:
    Serial.println("FAR");
    gesture="FAR  ";
    break;
    default:
    Serial.println("NONE");
    gesture="NONE ";
    }
    }

    return gesture;

    }

    String rv;
    char gest[6];

    void loop() {
    // Should be called for each loop.
    wsServer.listen();

    // Do other stuff here, but don't hang or cause long delays.
      delay(100);

      if( isr_flag == 1 ) {
        detachInterrupt(0);
        rv=handleGesture();
        isr_flag = 0;
        attachInterrupt(0, interruptRoutine, FALLING);

      if (rv!="NONE ") {

        if (wsServer.connectionCount() > 0) {
          rv.toCharArray(gest, 6);
          wsServer.send(gest, 6);
        }

      } 

      }

    }

Result

If hold your finger a few centimeters above the sensor and move it left or right .. You should see the sensed gesture in this project

gestures

For more detailed information, refer to this url.

https://www.dizmo.com/arduino-gesture-sensor-tutorial/

Source : https://www.dizmo.com/arduino-gesture-sensor-tutorial/

 

In this tutorial, Author will hook up a gesture sensor to a dizmo. Author is going to use an Arduino and WebSockets.

complete

Parts needed

Code

#include <SPI.h>
    #include <Wire.h>
    #include <Ethernet.h>
    #include <SparkFun_APDS9960.h>

    // Enabe debug tracing to Serial port.
    #define DEBUG true
    #define STATICIP false

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

    // Here we define a maximum framelength to 64 bytes. Default is 256.
    #define MAX_FRAME_LENGTH 64

    #include <WebSocket.h>

    byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x91, 0x8C };

    #if STATICIP
    byte ip[] = {10,0,1,100};
    #endif

    // Create a Websocket server
    WebSocketServer wsServer;

    void onConnect(WebSocket &socket) {
    Serial.println("onConnect called");
    }

    // You must have at least one function with the following signature.
    // It will be called by the server when a data frame is received.
    void onData(WebSocket &socket, char* dataString, byte frameLength) {

    #ifdef DEBUG
    Serial.print("Got data: ");
    Serial.write((unsigned char*)dataString, frameLength);
    Serial.println();
    #endif

    // Just echo back data for fun.
    socket.send(dataString, strlen(dataString));
    }

    void onDisconnect(WebSocket &socket) {
    Serial.println("onDisconnect called");
    }


    // Global Variables
    SparkFun_APDS9960 apds = SparkFun_APDS9960();
    int isr_flag = 0;



    void setup() {
    #ifdef DEBUG  
    Serial.begin(9600);
    #endif

    #if STATICIP
    Ethernet.begin(mac, ip);
    #else
    if (Ethernet.begin(mac) == 0) {
    #if DEBUG
    Serial.println("Unable to set server IP address using DHCP");
    #endif
    for(;;)
    ;
    }
    #if DEBUG
    // report the dhcp IP address:
    Serial.println(Ethernet.localIP());
    #endif
    #endif

    wsServer.registerConnectCallback(&onConnect);
    wsServer.registerDataCallback(&onData);
    wsServer.registerDisconnectCallback(&onDisconnect);
    wsServer.begin();

    delay(100); // Give Ethernet time to get ready


    // Set interrupt pin as input
    pinMode(APDS9960_INT, INPUT);

    // 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!"));
    }

    }

    void interruptRoutine() {
    isr_flag = 1;
    }

    String handleGesture() {
    String gesture;
    gesture="NONE  ";

    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
    case DIR_UP:
    Serial.println("UP   ");
    gesture="UP";
    break;
    case DIR_DOWN:
    Serial.println("DOWN");
    gesture="DOWN ";
    break;
    case DIR_LEFT:
    Serial.println("LEFT");
    gesture="LEFT ";
    break;
    case DIR_RIGHT:
    Serial.println("RIGHT");
    gesture="RIGHT";
    break;
    case DIR_NEAR:
    Serial.println("NEAR");
    gesture="NEAR  ";
    break;
    case DIR_FAR:
    Serial.println("FAR");
    gesture="FAR  ";
    break;
    default:
    Serial.println("NONE");
    gesture="NONE ";
    }
    }

    return gesture;

    }

    String rv;
    char gest[6];

    void loop() {
    // Should be called for each loop.
    wsServer.listen();

    // Do other stuff here, but don't hang or cause long delays.
      delay(100);

      if( isr_flag == 1 ) {
        detachInterrupt(0);
        rv=handleGesture();
        isr_flag = 0;
        attachInterrupt(0, interruptRoutine, FALLING);

      if (rv!="NONE ") {

        if (wsServer.connectionCount() > 0) {
          rv.toCharArray(gest, 6);
          wsServer.send(gest, 6);
        }

      } 

      }

    }

Result

If hold your finger a few centimeters above the sensor and move it left or right .. You should see the sensed gesture in this project

gestures

For more detailed information, refer to this url.

https://www.dizmo.com/arduino-gesture-sensor-tutorial/

Source : https://www.dizmo.com/arduino-gesture-sensor-tutorial/

 

COMMENTS

Please Login to comment
  Subscribe  
Notify of