luna 发表于 2017-7-4 18:00:36

3D手势遥控全向轮小车

作者:吴雷
在这里与大家介绍一款3D手势识别迷你传感器。DFRobot3D手势识别传感器是一款集成3D手势识别和运动跟踪为一体的交互式传感器,传感器可以在有效范围内识别手指的顺时针/逆时针转动方向和手指的运动方向等。传感器基于Microchip专利的GestIC®技术,采用电近场传感技术,包括了开发3D手势输入传感系统所有的块图,具有先进的3D信号处理单元,有效检测距离为0~10 cm。传感器可以应用于各类互动交互艺术产品,试想一下,挥一挥手,打开台灯,挥一挥手,打开音乐。一切尽在弹指间。         用3D手势识别迷你传感器做了一款手势识别控制全向小车,通过3D手势识别迷你传感器进行控制小车前进、后退、以及向左向右移动。通过使用3D打印机打印一个全向小车外壳和一个控制器外壳。
3D打印的小车和外壳:
全向小车图

控制器外壳图




需要的配件:Bluno V2.0主控板                            x2   Arduino四路电机驱动板                     x1   万向轮                                    x3电机支架                                       x33D手势识别迷你传感器                      x1   6V直流电机                                    x3            针排线                                       x2数字大按钮模块黄色(Arduino兼容)      x1   十字/一字两用螺丝刀                       x1      

如图



电路连接:3D手势接线: SCL->SCL,SDA->SDA,D0->D8,VCC->5V,GND->GND按钮:绿色->D9,红色->D10,黑色->D11电机扩展板:Vin -> PMR+      GND ->PMR-电机接线如图中方向,M1接口接前方的电机(机械人头的那个电机),M2接左侧电机线,M3接右侧的电机线




安装图:























手柄程序代码:
#include <DFRobot_Gesture.h>
#include <Wire.h>

#define Dio 8         //数字IO口
#define Con 9          //

unsigned int Mark = 0x00, Mark1 = 0x00, Mark2 = 0x00;
unsigned char cmd;

DFRobot_Gesture myGesture;

void Control_3D()
{
if (digitalRead(Dio) == 0)
{
    myGesture.I2C1_MasterRead(md.buf, 26, 0x42); //The address is:0x42
    cmd = myGesture.mgcProcMsg();   //process the message
    if (cmd != GI_NOGESTURE )
    {
      if (cmd == GI_FLICK_U)
      Mark1 = 0x10;

      else if (cmd == GI_FLICK_D)
      Mark1 = 0x20;

      else if (cmd == GI_FLICK_L)
      Mark1 = 0x30;

      else if (cmd == GI_FLICK_R)
      Mark1 = 0x40;

      else if (cmd == GI_AIRWHEEL_CW)
      Mark1 = 0x50;

      else if (cmd == GI_AIRWHEEL_CCW)
      Mark1 = 0x60;
    }
    if (digitalRead(Con) == HIGH)
      Mark2 = 0x01;
    else
    {
      Mark1 = 0x00;
      Mark2 = 0x00;
   }
}
}


void setup()
{
Serial.begin(115200);
pinMode(Dio, INPUT);
pinMode(Con, INPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(10, HIGH);//按键正极
digitalWrite(11, LOW);//按键负极
}

void loop()
{
Control_3D();
Mark = Mark1 + Mark2;
Serial.write(Mark);
delay(20);
}

小车程序代码://电机控制端口设置
const int EN1 = 3; //控制右侧电机速度
const int EN2 = 11; //控制左侧电机速度
const int EN3 = 5; //控制左侧电机速度

const int IN1 = 4; //控制右侧电机方向
const int IN2 = 12; //控制左侧电机方向
const int IN3 = 8; //控制左侧电机方向

const int UP = 1;
const int DOWN = 2;
const int LEFT = 3;
const int RIGHT = 4;
const int CW = 5;
const int CCW = 6;
unsigned int distance = 0;
unsigned int Data_Blu = 0;
unsigned int V = 0, VS = 0;
unsigned int Speed = 0;

//控制电机转动子函数
void Motor_Control(int M1_DIR, int M1_EN, int M2_DIR, int M2_EN, int M3_DIR, int M3_EN)
{
//////////M1////////////////////////
if (M1_DIR == 0) //M1电机的方向
    digitalWrite(IN1, HIGH); //置高,设置方向向前
else
    digitalWrite(IN1, LOW); //置低,设置方向向后
if (M1_EN == 0) //M1电机的速度
    analogWrite(EN1, LOW); //置低,停止
else
    analogWrite(EN1, M1_EN); //否则,就设置相应的数值
///////////M2//////////////////////
if (M2_DIR == 0) //M2电机的方向
    digitalWrite(IN2, HIGH); //置高,方向向前
else
    digitalWrite(IN2, LOW); //置低,方向向后
if (M2_EN == 0) //M2电机的速度
    analogWrite(EN2, LOW); //置低,停止
else
    analogWrite(EN2, M2_EN); //否则,就设置相应的数值
///////////M3//////////////////////
if (M3_DIR == 0) //M3电机的方向
    digitalWrite(IN3, HIGH); //置高,方向向前
else
    digitalWrite(IN3, LOW); //置低,方向向后
if (M3_EN == 0) //M3电机的速度
    analogWrite(EN3, LOW); //置低,停止
else
    analogWrite(EN3, M3_EN); //否则,就设置相应的数值
}

void setup()
{
Serial.begin(115200);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);
pinMode(EN3, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
}

void loop()
{

while(!Serial.available());
if (Serial.available())
{
    Data_Blu = Serial.read();
    VS = Data_Blu % 16;
    V = Data_Blu / 16;
}
if (VS != 0)
    Speed = 120;
else
    Speed = 0;
switch (V)
{
    case UP:
      Motor_Control(0, 0, 1, Speed, 1, Speed);
      break;

    case DOWN:
      Motor_Control(0, 0, 0, Speed, 0, Speed);
      break;

    case LEFT:
      Motor_Control(0, Speed, 0, Speed / 2, 1, Speed / 2);
      break;

    case RIGHT:
      Motor_Control(1, Speed, 1, Speed / 2, 0, Speed / 2);
      break;
      
    case CW:
      Motor_Control(1, Speed, 0, Speed, 1, Speed);
      break;

    case CCW:
      Motor_Control(0, Speed, 1, Speed, 0, Speed );
      break;
    default:
      Motor_Control(0, 0, 0, 0, 0, 0);
}

delay(1);
}



这样就做好了全向小车和控制器,接上电源就可以玩耍了将黄色按钮按下后,使用3D手势传感器,小车开始移动,松开黄色按钮后,小车停止移动。

hnyzcj 发表于 2017-7-5 06:29:01

上个视频,楼主

hnyzcj 发表于 2017-7-5 06:29:09

手柄呢/

hnyzcj 发表于 2017-7-5 06:30:54

ooo,手柄是那个3D传感器,刚理解错误了,哈哈哈

luna 发表于 2017-7-7 15:27:16

hnyzcj 发表于 2017-7-5 06:29
上个视频,楼主

视频拍好补上~

O_oYYQ 发表于 2017-7-7 16:08:47

{:5_197:}前排围观luna姐的作品

luna 发表于 2017-7-7 16:55:47

O_oYYQ 发表于 2017-7-7 16:08
前排围观luna姐的作品

不是我的哦~~我是帮发的,作者是吴雷(妹子)

ylweb 发表于 2018-8-6 18:43:53

感谢分享~~~~

20060606 发表于 2020-8-10 05:35:29

感谢分享

发表于 2022-4-17 09:42:55

hnyzcj 发表于 2017-7-5 06:30
ooo,手柄是那个3D传感器,刚理解错误了,哈哈哈

无意中把沙发板凳还有地板全占了

发表于 2022-4-17 09:44:14

luna 发表于 2017-7-7 16:55
不是我的哦~~我是帮发的,作者是吴雷(妹子)

不错,做的作品很好哦
页: [1]
查看完整版本: 3D手势遥控全向轮小车