17405浏览
查看: 17405|回复: 16

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

[复制链接]
@luna

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

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

221014tqnj2q2tt8lv766o.gif

总之就是吼厉害就对了

    有一次正好在DFRobot上看到了手势传感器试用的事情,于是就有了做一个手势鼠标的念头。

IMG_20160823_163141.jpg

    这个传感器的功能很多,有手势识别、距离传感、颜色传感三种功能。这里只使用手势识别的功能,后来我本打算与距离传感的功能配合使用,结果发生了冲突。(P.S.我也不知道为什么,反正就是不能。。。)

材料清单
       1.颜色识别挥手传感器模块(SEN0187)
       2.Arduino Leonardo
       3.USB-A转USB-B数据线
       4.超声波传感器
       5.面包板(可选)

RGB_and_Gesture_Sensor_V0.1正面.png                    RGB_and_Gesture_Sensor_V0.1反面.png

    接线如下表所示:

Arduino Pin              APDS-9960 Board  Function
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弄混了。



[mw_shl_code=cpp,true]#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");
    }
  }
}[/mw_shl_code]



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

    就像这样。。。

1475838155652.gif

我也不知道图片为什么是歪的:P

好吧,有两种解决方案:
    1.把屏幕的图标都调成巨大。
    2.或者利用距离传感器,用挥手时的距离来控制位移的大小,来达到控制精度的目的。
后来的许多测试都表明这款传感器好像不支持同时使用检测手势和测距的功能。。。

于是我就上淘宝买了一个新的超声波传感器。装在之前的电路上,接线如下:

Arduino Pin              Ultrasonic Sensor
5V                             VCC
Trig                           D4
Echo                         D5
GND                         GND

IMG_20170401_215907.jpg

IMG_20170401_220214.jpg

把两个传感器像这样粘在一块就完成了

最后我把程序和一些资料放上来了。


Gesture_Mouse主程序.rar (2.12 KB, 下载次数: 195)

叶耀雷  见习技师

发表于 2017-11-5 19:13:31

AAAA.png 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

手势传感器加上超声波,棒!!!  这个组合不错~~
回复

使用道具 举报

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板子和两个无线通讯模块,你甚至可以做一个无线鼠标或无线键盘。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail