20246| 16
|
手势传感器试用+【手势鼠标】 |
@luna 话说有一次我在网上看到了一篇文章,介绍google的黑科技——基于60GHz的手势传感器 它能探测到手指最细微的动作,转化为数据控制平板、手表什么的。 总之就是吼厉害就对了 有一次正好在DFRobot上看到了手势传感器试用的事情,于是就有了做一个手势鼠标的念头。 这个传感器的功能很多,有手势识别、距离传感、颜色传感三种功能。这里只使用手势识别的功能,后来我本打算与距离传感的功能配合使用,结果发生了冲突。(P.S.我也不知道为什么,反正就是不能。。。) 材料清单: 1.颜色识别挥手传感器模块(SEN0187) 2.Arduino Leonardo 3.USB-A转USB-B数据线 4.超声波传感器 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。。。)此外靠近传感器会触发鼠标左键,远离传感器则会触发鼠标右键。 但这样做的缺点也很明显,那就是你每次挥手控制的鼠标位移都是固定的,假如屏幕上有一个小按钮,而鼠标一次位移的距离太大,容易跳过头;太小,你挥手的次数就会明显增加。 就像这样。。。 我也不知道图片为什么是歪的:P 好吧,有两种解决方案: 1.把屏幕的图标都调成巨大。 2.或者利用距离传感器,用挥手时的距离来控制位移的大小,来达到控制精度的目的。 后来的许多测试都表明这款传感器好像不支持同时使用检测手势和测距的功能。。。 于是我就上淘宝买了一个新的超声波传感器。装在之前的电路上,接线如下: Arduino Pin Ultrasonic Sensor 5V VCC Trig D4 Echo D5 GND GND 把两个传感器像这样粘在一块就完成了 最后我把程序和一些资料放上来了。 Gesture_Mouse主程序.rar APDS-9960模块硬件使用指南和数据手册.zip Hardware.zip Libraries.zip 这是我整理的SparkFun_APDS9960传感器库文件函数说明。P.S.资料全是英文的,看的头都大了,希望DF能多出点中文资料 SparkFun_APDS9960传感器库文件函数说明.rar 外壳的话等我有3D打印机以后再说。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed