12165浏览
查看: 12165|回复: 1

[项目] 手势控制小车

[复制链接]
本帖最后由 蛋蛋 于 2014-7-22 15:32 编辑

   手势控制小车
     随着科技的发展,人与计算机的交互活动越来越成为人们日常生活的一个重要组成部分,特别是视觉计算机的发展,使计算机能“看懂”用户的动作。其中手势识别是实现新一代人机交互不可缺少的一项关键技术。众周所知,手势识别是一项复杂的技术,包括运动建模、运动分析、模式识别等机器学习技术。能否通过Arduino控制器与传感器简单的识别说手势的方向呢,为此小白做了一些尝试。
    手势方向有多种,如手势从左到右、从右到左、从上到下、从下到上等。为此手势方向的识别成为了本次尝试的重点和难点。
    在经过一番思考之后,想了一种比较简单的手势识别思路,即通过两个传感器检测到手的时间顺序来识别手势方向。
    然后通过两个控制器来实现手势控制小车;其中一个是手势控制端;另外一个是小车控制端。
    手势控制端将识别出来的手势方向通过蓝牙传输给小车控制端;小车控制端也需要添加一个蓝牙,用以接受手势控制端发过来的指令。
    第一步:基本功能
          手势从下到上,小车前进;手势从下到上,小车后退;手势从左到右,小车小车左转;手势从右到左,小车右转。
     第二步:蓝牙配置
       两块蓝牙之间要实现通信,我们先要给其配置。
      本次实验选用的蓝牙模块,波特率均为9600,可以暂时不用配置;记得编写代码的时候波特率写为9600。
      在两块蓝牙模块建立连接时,最重要的一个配置就是必须有蓝牙模块是主角色,另一个蓝牙模块设置为从角色;具体配置如下所示。
      我们先将蓝牙模块额的AT模式开关拨到ON这一端,然后将其插在USB Serial to 串口上,在连接的时候注意引脚。
QQ截图20140722134408.png
      接下来我们使用AT指令来配置蓝牙模块。
      首先打开Arduino IDE 自带的串口监视器,选择波特率为38400选择换行和回车模式”(Both NL&CR)
    QQ截图20140722132307.png
      然后输入AT(小写也可以),点击发送,会输出OK。
       QQ截图20140722132513.png
       QQ截图20140722132806.png
      接下来我们需要配置蓝牙的角色,我们将这块蓝牙设置为主角色,设置命令为:AT+ROLE=1;点击发送,会返回OK。
      QQ截图20140722132835.png
       QQ截图20140722132846.png
     查询蓝牙模块角色,可以使用AT+ROLE?,会返回该角色的类型。
       QQ截图20140722132902.png
    蓝牙配置完之后,将其AT模式的开关拨到2.
       接下来配置另外一块蓝牙,配置方法同上,但是有一点不同,就是蓝牙角色,这块蓝牙的角色要设置为从角色 AT+ROLE=0。
      到此为止,蓝牙配置已经完成,然后将其分别插到Romeo控制器的蓝牙端口。

    第三步:硬件搭建
          所需器材:Romeo控制器(2);数字防跌落传感器(4);蓝牙(2);锂电池;USB数据线;USB Serial to 串口MiniQ小车
          (1)将一块Romeo控制器安装到小车上面,并将其电机线分别接在电机接线柱1和2上面,蓝牙模块插到控制器上。
       g25786.png
       (2)将四个数字防跌落传感器分别接在另外一个Romeo控制器的数字口上面,暂时接在数字口8,9,10,11上面;另外一个块蓝牙模块也插到控制器上。
  
         g56600.png
       第四步:编写程序
手势识别控制端程序:
  1. int k=0;
  2. void setup() {
  3.   // put your setup code here, to run once:
  4.   for(int i=8;i<11;i++)
  5.     pinMode(i,INPUT);
  6.     Serial.begin(9600);
  7. }
  8. void loop() {
  9.   // put your main code here, to run repeatedly:
  10.   if(!digitalRead(8))//手势从上到下,小车前进
  11.   {
  12.     while(k<30)
  13.     {
  14.       k++;
  15.       delay(30);
  16.       if(!digitalRead(9)&&k<30)
  17.       {
  18.         Serial.println("w");
  19.         k=0;
  20.         break;
  21.       }
  22.       if(k==30)
  23.       {
  24.         k=0;
  25.         break;
  26.       }
  27.     }
  28.   }
  29. if(!digitalRead(9))//手势从下到上,小车后退
  30.   {
  31.     while(k<30)
  32.     {
  33.       k++;
  34.       delay(30);
  35.       if(!digitalRead(8)&&k<30)
  36.       {
  37.         Serial.println("s");
  38.         k=0;
  39.         break;
  40.       }
  41.       if(k==30)
  42.       {
  43.         k=0;
  44.         break;
  45.       }
  46.     }
  47.   }
  48.    if(!digitalRead(10))//手势从左到右,小车左转
  49.   {
  50.     while(k<30)
  51.     {
  52.       k++;
  53.       delay(30);
  54.       if(!digitalRead(11)&&k<30)
  55.       {
  56.         Serial.println("a");
  57.         k=0;
  58.         break;
  59.       }
  60.       if(k==30)
  61.       {
  62.         k=0;
  63.         break;
  64.       }
  65.     }
  66.   }
  67.    if(!digitalRead(11))//手势从右到左,小车右转
  68.   {
  69.     while(k<30)
  70.     {
  71.       k++;
  72.       delay(30);
  73.       if(!digitalRead(10)&&k<30)
  74.       {
  75.         Serial.println("d");
  76.         k=0;
  77.         break;
  78.       }
  79.       if(k==30)
  80.       {
  81.         k=0;
  82.         break;
  83.       }
  84.     }
  85.   }
  86. }
复制代码
小车控制端程序:
  1. int E1 = 5;     //M1 Speed Control
  2. int E2 = 6;     //M2 Speed Control
  3. int M1 = 4;    //M1 Direction Control
  4. int M2 = 7;    //M1 Direction Control
  5. void stop(void)                    //Stop
  6. {
  7.   digitalWrite(E1,LOW);   
  8.   digitalWrite(E2,LOW);      
  9. }   
  10. void advance(char a,char b)          //Move forward
  11. {
  12.   analogWrite (E1,a);      //PWM Speed Control
  13.   digitalWrite(M1,HIGH);   
  14.   analogWrite (E2,b);   
  15.   digitalWrite(M2,HIGH);
  16. }  
  17. void back_off (char a,char b)          //Move backward
  18. {
  19.   analogWrite (E1,a);
  20.   digitalWrite(M1,LOW);   
  21.   analogWrite (E2,b);   
  22.   digitalWrite(M2,LOW);
  23. }
  24. void turn_L (char a,char b)             //Turn Left
  25. {
  26.   analogWrite (E1,a);
  27.   digitalWrite(M1,LOW);   
  28.   analogWrite (E2,b);   
  29.   digitalWrite(M2,HIGH);
  30. }
  31. void turn_R (char a,char b)             //Turn Right
  32. {
  33.   analogWrite (E1,a);
  34.   digitalWrite(M1,HIGH);   
  35.   analogWrite (E2,b);   
  36.   digitalWrite(M2,LOW);
  37. }
  38. void setup() {
  39.   // put your setup code here, to run once:
  40.   for(int i=4;i<8;i++)
  41.   pinMode(i,OUTPUT);
  42.   Serial.begin(9600);
  43.   }
  44. void loop() {
  45.   // put your main code here, to run repeatedly:
  46.   if(Serial.available()){
  47.     char val = Serial.read();
  48.     Serial.println(val);
  49.      if(val != -1)
  50.     {
  51.       switch(val)
  52.       {
  53.       case 'w'://Move Forward
  54.         advance (255,255);   //move forward in max speed
  55.         break;
  56.       case 's'://Move Backward
  57.         back_off (255,255);   //move back in max speed
  58.         break;
  59.       case 'a'://Turn Left
  60.         turn_L (255,255);
  61.         break;      
  62.       case 'd'://Turn Right
  63.         turn_R (255,255);
  64.         break;
  65.       case 'z':
  66.         break;
  67. }
  68.     }
  69. }
  70. }
复制代码
   
第五步:下载程序,观察现象
      怎么样?你的手势有没有控制了你的小车?



   

   










中庸  见习技师

发表于 2015-5-13 17:01:02

楼主,为什么要用2块控制器?还要用蓝牙通讯?不太理解!
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

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

mail