12223| 7
|
[项目] [Hack 上海] Tinter手势控制 |
本帖最后由 cbd_focus 于 2015-11-9 17:05 编辑 这个小工具是参加上海纽约大学举办的"Hack上海" 活动时现场制作的. 我们组原本计划做3D 打印巧克力,机器出了点儿问题,所以临时赶制了这个小工具,丑陋之处欢迎吐槽 : ) 工具的使用场景是这样的: 1.当我们边吃薯片边看漫画,手指上沾满油渍也不方便控制键鼠的时候,能不能有一个踏板,脚一踏就翻页! 2.在放映ppt/Keynote 的时候, 能不能通过演讲者的手势来控制播放流程. 考虑到需要在比赛所剩不多的时间里迅速完成这个工具,我们选用的是 Arduino micro 做中控,DFRobot 的按钮模块和一个基本的三轴加速度模块. 选 arduino micro 的原因是它板载 USB接口而且支持虚拟串口,也有基本的数字和模拟口. 文档参考: https://www.arduino.cc/en/Main/ArduinoBoardMicro?setlang=cn 踏板的按钮式 DFRobot 的数字按钮.三根线,一个给电一个接地,一个读数字信号,简单好用. 模块链接=> https://www.dfrobot.com.cn/goods-78.html 三轴是基础xyz三轴加速度传感器, GY-61-adxl335. 五个口, 一个给电一个接地, XYZ输出模拟信号各一个. EM: 这个片是隔壁桌小伙伴送我们的,非常感谢! 文档参考: http://www.analog.com/media/en/t ... -sheets/ADXL335.pdf ## 翻页按钮 单独的按钮翻页功能非常简单,只要在数字口读按钮的信号然后发控制指令即可.记得消抖. 我把按钮接到9号数字口上了. ``` #include <Keyboard.h> int mBtn = 9; int btnMsg = digitalRead(mBtn); void setup() { pinMode(mBtn,INPUT); Keyboard.begin(); } void loop() { btnMsg = digitalRead(mBtn); if(btnMsg == HIGH){ Serial.println("HIGH_Begin"); if(btnMsg == HIGH){ Keyboard.print(" "); delay(500); }else{ Serial.println("LOW"); delay(2000); } //btnMsg = digitalRead(mBtn); } } ``` 可以打开一个多页的PDF 文件来试一下效果. ## 手势识别: 从 XYZ 读到加速度的模拟量之后,我们做了一组实验来构建模型. 从数据里可以清楚看出,如果只做左右移动的手势识别,检测 Y 值足矣. ``` #include <Mouse.h> int xPin = 1; int yPin = 2; int zPin = 3; int x=0; int y=0; int z=0; int xDelta =0; int yDelta =0; int zDelta =0; void setup() { // put your setup code here, to run once: Serial.begin(9600); Mouse.begin(); } int yBegin=0; int yUp =0; int yDown= 0; void loop() { yBegin = analogRead(yPin); Serial.println(y); delay(100); yDelta = analogRead(yPin) -yBegin; yUp = analogRead(yPin); if(yDelta > 80){//go right delay(400); yDelta = analogRead(yPin) -yUp ; if(yDelta < -30){ //right click Mouse.click(MOUSE_RIGHT); Serial.println("MOUSE_RIGHT"); //y = analogRead(yPin); delay(200); } }else if(yDelta < -80){//go left delay(400); yDelta = analogRead(yPin) -yDown ; if(yDelta > 30){ //left click Mouse.click(MOUSE_LEFT); Serial.println("MOUSE_LEFT"); //y = analogRead(yPin); delay(200); } } y = analogRead(yPin); } ``` 大家可以根据自己的挥手习惯来调整参数. 下面是演示视频: 视频里使用的版本: ps: 视频里的漫画网站是我写的, http://lookmanhua.com 欢迎吐槽 :) ``` #include <Keyboard.h> #include <Mouse.h> int mBtn = 9; int btnMsg = digitalRead(mBtn); int xPin = 1; int yPin = 2; int zPin = 3; int x=0; int y=0; int z=0; int xDelta =0; int yDelta =0; int zDelta =0; void setup() { // put your setup code here, to run once: Serial.begin(9600); Mouse.begin(); pinMode(mBtn,INPUT); Keyboard.begin(); } int yBegin=0; int yUp =0; int yDown= 0; void loop() { yBegin = analogRead(yPin); Serial.println(y); delay(100); yDelta = analogRead(yPin) -yBegin; yUp = analogRead(yPin); if(yDelta > 60){//go right delay(400); yDelta = analogRead(yPin) -yUp ; if(yDelta < -25){ //right click Mouse.click(MOUSE_RIGHT); Serial.println("MOUSE_RIGHT"); //y = analogRead(yPin); delay(200); } }else if(yDelta < -80){//go left delay(400); yDelta = analogRead(yPin) -yDown ; if(yDelta > 30){ //left click Mouse.click(MOUSE_LEFT); Serial.println("MOUSE_LEFT"); //y = analogRead(yPin); delay(200); } } y = analogRead(yPin); /*---丑陋的分割线----*/ btnMsg = digitalRead(mBtn); if(btnMsg == HIGH){ Serial.println("HIGH_Begin"); if(btnMsg == HIGH){ Keyboard.print(" "); delay(500); }else{ Serial.println("LOW"); delay(2000); } //btnMsg = digitalRead(mBtn); } } ``` 我的改进想法是这样的: 把读到的xyz作为一个向量整体来处理,挥动手臂,捕捉向量变化轨迹,然后再识别向量的模式. 再进价一点希望是可以让用户 DIY 手势然后自动识别模型匹配模型. 再进阶一点是加上陀螺仪,读取更详细的手势信息. 有工业设计背景同学可以把它做成cool一点的手环. 现场时间有限,目前只是做了 Demo,我在这里抛砖引玉,大家感兴趣可以往上加高阶功能. 特别感谢: Hack Shanghai 上海纽约大学 DFRobot 队友小伙伴 2015-11-09 Focus 微信 18817311035,欢迎交流 : ) |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed