szjuliet 发表于 2019-9-7 00:48:53

手势识别带触摸传感器试用1:手势识别功能

本帖最后由 szjuliet 于 2019-9-8 09:43 编辑

手势识别带触摸传感器试用1:手势识别功能

手势识别带触摸传感器试用2:触摸功能


器材:
虚谷号教育版
虚谷号扩展板(购买链接:https://www.dfrobot.com.cn/goods-1953.html)
手势带触摸传感器(购买链接:https://www.dfrobot.com.cn/goods-1994.html)

视频:
https://v.qq.com/x/page/o0923gz6xy0.html


传感器wiki:https://www.dfrobot.com.cn/goods-1994.html

一、开箱

感谢发货的小姐姐,知道我们干活辛苦,将不能吃不能玩的泡沫块换成了小零食,简直太贴心了,周末从早到晚整整监考两天,只能今晚加班干活,零食派上大用场了。



二、在UNO上测试

[*]将传感器接到UNO上

手势识别传感器为串口设备,而普通Arduino只有一个硬件串口,所以使用软串口来配合传感器使用
接线图:

(图片来源:DF)


[*]引脚说明:


绿色信号线接11号引脚,蓝色信号线RXD接10号引脚,黑色信号线接GND,红色信号线接VCC


(图片来源:DF)


[*]编写代码:


将需要的库文件复制到Arduino的库目录下,在arduino IDE中打开示例文件simpleGuester,或直接复制下面的代码:
/*
* file simpleGesture.ino
*
* @ https://github.com/DFRobot/DFRobot_Gesture_Touch
*
* example for DFRobot Gesture&Touch sensor
*
* sensor event will print on your serial monitor
*
* for esp32, rx_pin = D5, tx_pin = D6
*
* Copyright   (http://www.dfrobot.com), 2016
* Copyright   GNU Lesser General Public License
*
* versionV1.0
* date2018-10-19
*/

#include "DFRobot_Gesture_Touch.h"

#ifdef __AVR__
#include "SoftwareSerial.h"
SoftwareSerial    mySerial(10, 11);         // example for uno, use software serial
#elif defined ESP_PLATFORM
#include "HardwareSerial.h"
HardwareSerial    mySerial(1);
#endif

DFRobot_Gesture_Touch   DFGT(&mySerial);    // init sensor object, request write and read function

void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
delay(2000);
while(mySerial.available())// flush serial buffer
    mySerial.read();
Serial.println("gesture&touch sensor test");

DFGT.setGestureDistance(20);             // suggest default value
// DFGT.enableFunction(DFGT_FUN_ALL);       // enable all functions
// DFGT.disableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT);    // disable function test
// DFGT.disableFunction(DFGT_FUN_TOUCH1 | DFGT_FUN_TOUCH2);    // disable function test
// DFGT.enableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT);   // enable function test
// DFGT.setSleep(4);                        // set auto sleep time out, in sleep mode, put something
}

void loop()
{
int8_t    rslt = DFGT.getAnEvent();// get an event that data saved in serial buffer
if(rslt != DF_ERR) {
    // DFGT.setSleep(DFGT_SLEEP_DISABLE);// disable auto sleep
    switch(rslt) {
      case DFGT_EVT_BACK: {
      Serial.println("get event back");
      } break;
      case DFGT_EVT_FORWARD: {
      Serial.println("get event forward");
      } break;
      case DFGT_EVT_RIGHT: {
      Serial.println("get event right");
      } break;
      case DFGT_EVT_LEFT: {
      Serial.println("get event left");
      } break;
      case DFGT_EVT_PULLUP: {
      Serial.println("get event pull up");
      } break;
      case DFGT_EVT_PULLDOWN: {
      Serial.println("get event pull down");
      } break;
      case DFGT_EVT_PULLREMOVE: {
      Serial.println("get event pull and remove");
      } break;
      case DFGT_EVT_TOUCH1: {
      Serial.println("get event touch1");
      } break;
      case DFGT_EVT_TOUCH2: {
      Serial.println("get event touch2");
      } break;
      case DFGT_EVT_TOUCH3: {
      Serial.println("get event touch3");
      } break;
      case DFGT_EVT_TOUCH4: {
      Serial.println("get event touch4");
      } break;
      case DFGT_EVT_TOUCH5: {
      Serial.println("get event touch5");
      } break;
    }
}
}

程序上传后进行测试,很快就在串口监视器显示结果(截图写文字时把上下写反了):


刚开始对手势不太熟练,测试结果总是觉得不对,试过几次发现是需要技巧的:
首先传感器按下面的方向放置,手势的方向如图所示;其次手势的动作要迅速,太慢不行。
另外还有一点非常重要,进行上下动作时手不要发生水平的位移;进行水平移动时,手不要发生垂直方向的位移。否则传感器就容易判断出错:到底是前后左右还是上下。

调整好传感器并以迅速的手势挥动,识别的结果基本就全部与预期动作一致了。


一共支持7种动作:向右、向左、向后、向前、下压pull down、上拉pull up及上拉下压后手松开pull and remove

三、在虚谷号上测试:


[*]在串口监视器返回识别结果:
接线方法与UNO一样。


将需要的库文件复制到虚谷号vvboard-->Arduino-->02.lib目录下(可以使用U盘方式直接复制,或使用主机模式在浏览器中下载到目录),在arduino IDE中打开示例文件simpleGuester,或直接复制前面的代码。

将代码上传到虚谷号,成功后打开串口监视器,稍等片刻就会输出识别结果:


在虚谷号上识别的结果感觉不如UNO上的好,反映要慢一些。


[*]使用虚谷号扩展板的OLED显示识别结果
示例程序只能在串口监视器上显示返回结果,虚谷号扩展板自带了一块OLED屏,我们可以将显示结果输出到OLED屏上


四、程序代码
/*
* file simpleGesture.ino
*
* @ https://github.com/DFRobot/DFRobot_Gesture_Touch
*
* example for DFRobot Gesture&Touch sensor
*
* sensor event will print on your serial monitor
*
* for esp32, rx_pin = D5, tx_pin = D6
*
* Copyright   (http://www.dfrobot.com), 2016
* Copyright   GNU Lesser General Public License
*
* versionV1.0
* date2018-10-19
*/

#include "DFRobot_Gesture_Touch.h"
#include <Adafruit_NeoPixel.h>
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);// I2C / TWI

char* gesture;

#ifdef __AVR__
#include "SoftwareSerial.h"
SoftwareSerial    mySerial(10, 11);         // example for uno, use software serial
#elif defined ESP_PLATFORM
#include "HardwareSerial.h"
HardwareSerial    mySerial(1);
#endif

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

DFRobot_Gesture_Touch   DFGT(&mySerial);    // init sensor object, request write and read function


void draw(char* gesture) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
// call procedure from base class, http://arduino.cc/en/Serial/Print
u8g.print(gesture);
}

void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
delay(500);
while(mySerial.available())// flush serial buffer
    mySerial.read();
Serial.println("gesture&touch sensor test");

strip.begin();
strip.show(); // Initialize all pixels to 'off'

DFGT.setGestureDistance(20);             // suggest default value
// DFGT.enableFunction(DFGT_FUN_ALL);       // enable all functions
// DFGT.disableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT);    // disable function test
// DFGT.enableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT);   // enable function test
// DFGT.setSleep(4);                        // set auto sleep time out, in sleep mode, somethingapproach will weak it up
}

void loop()
{
    u8g.firstPage();
do {
    draw(gesture);
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(500);

int8_t    rslt = DFGT.getAnEvent();// get an event that data saved in serial buffer
if(rslt != DF_ERR) {
    // DFGT.setSleep(DFGT_SLEEP_DISABLE);// disable auto sleep
    switch(rslt) {
      case DFGT_EVT_BACK: {
      Serial.println("get event back");
      gesture = "back";
      draw(gesture);
      } break;
      case DFGT_EVT_FORWARD: {
      Serial.println("get event forward");
      gesture = "forward";
      draw(gesture);      
      } break;
      case DFGT_EVT_RIGHT: {
      Serial.println("get event right");
      gesture = "right";
      draw(gesture);      
      } break;
      case DFGT_EVT_LEFT: {
      Serial.println("get event left");
      gesture = "left";
      draw(gesture);      
      } break;
      case DFGT_EVT_PULLUP: {
      Serial.println("get event pull up");
      gesture = "pull up";
      draw(gesture);      
      } break;
      case DFGT_EVT_PULLDOWN: {
      Serial.println("get event pull down");
      gesture = "pull down";
      draw(gesture);      
      } break;
      case DFGT_EVT_PULLREMOVE: {
      Serial.println("get event pull and remove");
      gesture = "pull and remove";
      draw(gesture);      
      } break;
      case DFGT_EVT_TOUCH1: {
      Serial.println("get event touch1");
      gesture = "touch1";
      draw(gesture);
      } break;
      case DFGT_EVT_TOUCH2: {
      Serial.println("get event touch2");
      gesture = "touch2";
      draw(gesture);
      } break;
      case DFGT_EVT_TOUCH3: {
      Serial.println("get event touch3");
      gesture = "touch3";
      draw(gesture);
      } break;
      case DFGT_EVT_TOUCH4: {
      Serial.println("get event touch4");
      gesture = "touch4";
      draw(gesture);
      } break;
      case DFGT_EVT_TOUCH5: {
      Serial.println("get event touch5");      
      gesture = "touch5";
      draw(gesture);
      } break;
    }
}
}


试用感受:
要让手势识别传感器按自己的设想动作效果并不容易,如果用在项目中可能会有误操作,需要使用者多次练习:手势动作要迅速;进行上下动作时手不要发生水平的位移;进行水平移动时,手不要发生垂直方向的位移。
刚开始测试时,各个手势都还能识别,但是试用到后来,向左的手势无论如何也识别不出来。过了一天再重新上电又能够识别了。稳定性还是有待改进。
总结:手势识别准确率不高,现实应用意义不大。接下来进行触摸功能的测试。


木子姐姐 发表于 2019-9-11 10:26:56

我看到了眼熟的零食

szjuliet 发表于 2019-9-11 20:15:36

木子姐姐 发表于 2019-9-11 10:26
我看到了眼熟的零食

已经到肚子里了,渣渣都不剩

zhang5B 发表于 2020-7-22 13:09:50

为啥都是显示只有一条和乱码

szjuliet 发表于 2020-7-22 21:20:22

zhang5B 发表于 2020-7-22 13:09
为啥都是显示只有一条和乱码

你看一下程序里波特率的设置是不是和你的串口监视器一样。你的串口监视器波特率是9600,程序里的设置也必须是9600。
页: [1]
查看完整版本: 手势识别带触摸传感器试用1:手势识别功能