[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
https://www.arduino.cc/en/uploads/Main/ArduinoMicro_Pinout3.png
踏板的按钮式 DFRobot 的数字按钮.三根线,一个给电一个接地,一个读数字信号,简单好用.
模块链接=> https://www.dfrobot.com.cn/goods-78.html
https://www.dfrobot.com.cn/images/201404/thumb_img/78_thumb_P_1398245571495.jpg
三轴是基础xyz三轴加速度传感器, GY-61-adxl335.
五个口, 一个给电一个接地, XYZ输出模拟信号各一个.
EM: 这个片是隔壁桌小伙伴送我们的,非常感谢!
文档参考: http://www.analog.com/media/en/t ... -sheets/ADXL335.pdf
http://img.dxcdn.com/productimages/sku_225179_1.jpg
## 翻页按钮
单独的按钮翻页功能非常简单,只要在数字口读按钮的信号然后发控制指令即可.记得消抖.
我把按钮接到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);
}
```
大家可以根据自己的挥手习惯来调整参数.
下面是演示视频:
http://v.youku.com/v_show/id_XMTM4MTQyNjAyMA==.html
http://player.youku.com/player.php/sid/XMTM4MTQyNjAyMA==/v.swf
视频里使用的版本:
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,欢迎交流 : )
棒棒哒!!!作品现场有看到,非常赞!如果要报名nabi黑客马拉松的话要备注下,管理员才能看到喔! niu B a :)我是来点赞的—— 创意无极限 路过………………{:5_175:} 控制方式还有很大的改进空间,加油! 需要挥手这么快没问题吗{:5_176:}
页:
[1]