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手势传感器,小车开始移动,松开黄色按钮后,小车停止移动。
上个视频,楼主 手柄呢/ ooo,手柄是那个3D传感器,刚理解错误了,哈哈哈 hnyzcj 发表于 2017-7-5 06:29
上个视频,楼主
视频拍好补上~ {:5_197:}前排围观luna姐的作品 O_oYYQ 发表于 2017-7-7 16:08
前排围观luna姐的作品
不是我的哦~~我是帮发的,作者是吴雷(妹子) 感谢分享~~~~ 感谢分享 hnyzcj 发表于 2017-7-5 06:30
ooo,手柄是那个3D传感器,刚理解错误了,哈哈哈
无意中把沙发板凳还有地板全占了 luna 发表于 2017-7-7 16:55
不是我的哦~~我是帮发的,作者是吴雷(妹子)
不错,做的作品很好哦
页:
[1]