手势识别带触摸传感器试用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
我看到了眼熟的零食
已经到肚子里了,渣渣都不剩 为啥都是显示只有一条和乱码 zhang5B 发表于 2020-7-22 13:09
为啥都是显示只有一条和乱码
你看一下程序里波特率的设置是不是和你的串口监视器一样。你的串口监视器波特率是9600,程序里的设置也必须是9600。
页:
[1]