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

2017-04-012.3万
AI 快速预览详细 收起
本文介绍了如何使用DFRobot的SEN0187颜色识别挥手传感器模块和Arduino Leonardo制作一个手势鼠标。通过简单的接线和编程,实现上下左右手势控制鼠标移动,靠近和远离触发鼠标点击。项目中使用的唯一参数是range,用于控制鼠标每次位移的距离。此外,还探讨了如何通过结合超声波传感器来提高手势控制的精度。
@luna

    话说有一次我在网上看到了一篇文章,介绍google的黑科技——基于60GHz的手势传感器
手势传感器试用+【手势鼠标】图1

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

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

总之就是吼厉害就对了

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

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

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

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

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

    接线如下表所示:

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。。。)此外靠近传感器会触发鼠标左键,远离传感器则会触发鼠标右键。
    但这样做的缺点也很明显,那就是你每次挥手控制的鼠标位移都是固定的,假如屏幕上有一个小按钮,而鼠标一次位移的距离太大,容易跳过头;太小,你挥手的次数就会明显增加。

    就像这样。。。

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

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

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

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

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

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

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

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

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


下载附件Gesture_Mouse主程序.rar

下载附件APDS-9960模块硬件使用指南和数据手册.zip

下载附件Hardware.zip

下载附件Libraries.zip


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

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

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(12)
Nicky
Nicky
你好,想问下 你这个传感去和Leonardo开发板接一起后,开发板是怎么和电脑连一起的呢? 一根USB线吗 我最近也在做类似的东西,想用在讲解PPT时使用。 还有其他问题比如怎么把数据模拟成鼠标 想请教您。方便叫下我扣2538858422 谢谢
dbc0301
dbc0301
作者
回复Nicky
还真是用USB直接连的,Leonardo的板子本身就有模拟键鼠的功能,只要用上官方的键鼠库,BadUSB都能做出来。
当然,假如你有另外一块Arduino板子和两个无线通讯模块,你甚至可以做一个无线鼠标或无线键盘。
ssssssss
ssssssss
库文件有吗
gada888
gada888
支持
DFrJP85mfPX
DFrJP85mfPX
感谢分享
DFrJP85mfPX
DFrJP85mfPX
为啥我下载不了。。
emilia
emilia
感谢分享。。。
叶耀雷
叶耀雷

叶耀雷
叶耀雷
我编译的时候,mouse出错了,求楼主解答
叶耀雷
叶耀雷回复dbc0301
在代码里加#include
也不好使
dbc0301
dbc0301
作者
回复叶耀雷
有没有图,你是不是没装库文件。
cccc00000000
cccc00000000
这个手势传感器不便宜啊
nicho
nicho
手势传感器加上超声波,棒!!! 这个组合不错~~
dbc0301
dbc0301
作者
回复nicho
嗯,就是操作太繁琐了,下次改进666
dbc0301
dbc0301
作者
顺便把板凳也抢了。:lol
dbc0301
dbc0301
作者
趁没人,抢个沙发。
- 没有更多了 -