dbc0301 发表于 2017-4-2 00:18:56

手势传感器试用+【手势鼠标】

@luna

    话说有一次我在网上看到了一篇文章,介绍google的黑科技——基于60GHz的手势传感器

    它能探测到手指最细微的动作,转化为数据控制平板、手表什么的。


总之就是吼厉害就对了{:5_179:}
    有一次正好在DFRobot上看到了手势传感器试用的事情,于是就有了做一个手势鼠标的念头。


    这个传感器的功能很多,有手势识别、距离传感、颜色传感三种功能。这里只使用手势识别的功能,后来我本打算与距离传感的功能配合使用,结果发生了冲突。(P.S.我也不知道为什么,反正就是不能。。。)
材料清单:       1.颜色识别挥手传感器模块(SEN0187)       2.Arduino Leonardo       3.USB-A转USB-B数据线       4.超声波传感器       5.面包板(可选)
                  

    接线如下表所示:
Arduino Pin            APDS-9960 BoardFunction
3.3V                        VCC                        Power
GND                         GND                     Ground
D2                            SDA                        I2C Data
D3                            SCL                         I2C Clock
D7                            INT                         Interrupt

P.S. 我用的是Leonardo,所以SDA和SCL要改成接D2和D3,中断引脚7的中断号是4,注意不要和UNO弄混了。


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

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

// Constants

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

int range = 10;

void setup() {

// Initialize Serial port
Serial.begin(9600);

Mouse.begin();

// Initialize interrupt service routine
attachInterrupt(4, 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 loop() {
if( isr_flag == 1 ) {
    handleGesture();
    isr_flag = 0;
}
}

void interruptRoutine() {
isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
      Mouse.move(0,-3*range,0);
      break;
      case DIR_DOWN:
      Mouse.move(0,3*range,0);
      break;
      case DIR_LEFT:
      Mouse.move(-4*range,0,0);
      break;
      case DIR_RIGHT:
      Mouse.move(4*range,0,0);
      break;
      case DIR_NEAR:
      Mouse.press(MOUSE_LEFT);
      delay(5);
      Mouse.release(MOUSE_LEFT);
      delay(1);
      break;
      case DIR_FAR:
      Mouse.press(MOUSE_RIGHT);
      delay(5);
      Mouse.release(MOUSE_RIGHT);
      delay(1);
      break;
      default:
      Serial.println("NONE");
    }
}
}



    其中的range是唯一参数。这样,接在电脑上后,只要你上下挥手,鼠标就会向上或向下移动30(即3*10)个像素;左右挥手,鼠标则会向左或向右移动40(即4*10)个像素(这样做是因为现在的显示器的显示比例大多为3:4。。。)此外靠近传感器会触发鼠标左键,远离传感器则会触发鼠标右键。
    但这样做的缺点也很明显,那就是你每次挥手控制的鼠标位移都是固定的,假如屏幕上有一个小按钮,而鼠标一次位移的距离太大,容易跳过头;太小,你挥手的次数就会明显增加。

    就像这样。。。


我也不知道图片为什么是歪的:P
好吧,有两种解决方案:    1.把屏幕的图标都调成巨大。    2.或者利用距离传感器,用挥手时的距离来控制位移的大小,来达到控制精度的目的。后来的许多测试都表明这款传感器好像不支持同时使用检测手势和测距的功能。。。
于是我就上淘宝买了一个新的超声波传感器。装在之前的电路上,接线如下:
Arduino Pin            Ultrasonic Sensor
5V                           VCC
Trig                           D4
Echo                         D5
GND                         GND





把两个传感器像这样粘在一块就完成了最后我把程序和一些资料放上来了。









    这是我整理的SparkFun_APDS9960传感器库文件函数说明。P.S.资料全是英文的,看的头都大了,希望DF能多出点中文资料{:5_190:}


    外壳的话等我有3D打印机以后再说。

叶耀雷 发表于 2017-11-5 19:13:31

C:\Users\Administrator\Desktop\AAAA.png

dbc0301 发表于 2017-4-2 00:19:35

趁没人,抢个沙发。

dbc0301 发表于 2017-4-2 00:20:02

顺便把板凳也抢了。:lol

nicho 发表于 2017-4-2 13:48:58

手势传感器加上超声波,棒!!!这个组合不错~~{:5_168:}

cccc00000000 发表于 2017-4-3 10:09:29

这个手势传感器不便宜啊

dbc0301 发表于 2017-4-4 19:24:34

nicho 发表于 2017-4-2 13:48
手势传感器加上超声波,棒!!!这个组合不错~~

嗯,就是操作太繁琐了,下次改进666

叶耀雷 发表于 2017-11-1 22:20:17

我编译的时候,mouse出错了,求楼主解答

dbc0301 发表于 2017-11-3 19:17:24

叶耀雷 发表于 2017-11-1 22:20
我编译的时候,mouse出错了,求楼主解答

有没有图,你是不是没装库文件。

叶耀雷 发表于 2017-11-5 19:15:15

dbc0301 发表于 2017-11-3 19:17
有没有图,你是不是没装库文件。

在代码里加#include <Mouse.h>
也不好使

emilia 发表于 2018-3-12 10:30:36

感谢分享。。。

DFrJP85mfPX 发表于 2018-8-30 10:52:44

为啥我下载不了。。

DFrJP85mfPX 发表于 2018-8-30 10:53:45

感谢分享

gada888 发表于 2018-8-30 13:10:39

叶耀雷 发表于 2017-11-5 19:13


支持

ssssssss 发表于 2018-9-13 11:21:58

库文件有吗

Nicky 发表于 2019-11-27 14:43:42

你好,想问下 你这个传感去和Leonardo开发板接一起后,开发板是怎么和电脑连一起的呢? 一根USB线吗 我最近也在做类似的东西,想用在讲解PPT时使用。 还有其他问题比如怎么把数据模拟成鼠标 想请教您。方便叫下我扣2538858422谢谢

dbc0301 发表于 2019-12-27 14:32:51

Nicky 发表于 2019-11-27 14:43
你好,想问下 你这个传感去和Leonardo开发板接一起后,开发板是怎么和电脑连一起的呢? 一根USB线吗 我最近 ...

还真是用USB直接连的,Leonardo的板子本身就有模拟键鼠的功能,只要用上官方的键鼠库,BadUSB都能做出来。
当然,假如你有另外一块Arduino板子和两个无线通讯模块,你甚至可以做一个无线鼠标或无线键盘。
页: [1]
查看完整版本: 手势传感器试用+【手势鼠标】