查看: 5394|回复: 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 的数字按钮.三根线,一个给电一个接地,一个读数字信号,简单好用.
模块链接=> http://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 读到加速度的模拟量之后,我们做了一组实验来构建模型.

acc

acc

从数据里可以清楚看出,如果只做左右移动的手势识别,检测 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一点的手环.

vector

vector


现场时间有限,目前只是做了 Demo,我在这里抛砖引玉,大家感兴趣可以往上加高阶功能.

特别感谢:
     Hack Shanghai
     上海纽约大学
     DFRobot
     队友小伙伴

2015-11-09
     Focus

微信 18817311035,欢迎交流 : )

Juice  管理员 来自手机

发表于 2015-11-9 11:41:07

棒棒哒!!!作品现场有看到,非常赞!如果要报名nabi黑客马拉松的话要备注下,管理员才能看到喔!
回复 支持 反对

使用道具 举报

dsweiliang  版主

发表于 2015-11-9 23:07:34

niu B a
回复 支持 反对

使用道具 举报

刹那ZF清英  中级技师

发表于 2015-12-15 09:01:00

:)我是来点赞的——
回复 支持 反对

使用道具 举报

qing1987  见习技师

发表于 2016-1-5 10:39:42

创意无极限
回复 支持 反对

使用道具 举报

Geemi  版主

发表于 2016-1-11 14:43:17

路过………………
回复 支持 反对

使用道具 举报

西海岸总督  学徒 来自手机

发表于 2016-1-17 00:06:15

控制方式还有很大的改进空间,加油!
回复 支持 反对

使用道具 举报

HMark  初级技师

发表于 2016-8-1 13:32:08

需要挥手这么快没问题吗
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

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

mail