18329| 10
|
[项目] 3D手势遥控全向轮小车 |
作者:吴雷 在这里与大家介绍一款3D手势识别迷你传感器。DFRobot3D手势识别传感器是一款集成3D手势识别和运动跟踪为一体的交互式传感器,传感器可以在有效范围内识别手指的顺时针/逆时针转动方向和手指的运动方向等。传感器基于Microchip专利的GestIC®技术,采用电近场传感技术,包括了开发3D手势输入传感系统所有的块图,具有先进的3D信号处理单元,有效检测距离为0~10 cm。传感器可以应用于各类互动交互艺术产品,试想一下,挥一挥手,打开台灯,挥一挥手,打开音乐。一切尽在弹指间。 用3D手势识别迷你传感器做了一款手势识别控制全向小车,通过3D手势识别迷你传感器进行控制小车前进、后退、以及向左向右移动。通过使用3D打印机打印一个全向小车外壳和一个控制器外壳。 3D打印的小车和外壳: 全向小车图 控制器外壳图 需要的配件: 万向轮 x3 电机支架 x3 3D手势识别迷你传感器 x1 6V直流电机 x3 针排线 x2 十字/一字两用螺丝刀 x1 如图 电路连接: 3D手势接线: SCL->SCL,SDA->SDA,D0->D8,VCC->5V,GND->GND 按钮:绿色->D9,红色->D10,黑色->D11 电机扩展板:Vin -> PMR+ GND ->PMR- 电机接线如图中方向,M1接口接前方的电机(机械人头的那个电机),M2接左侧电机线,M3接右侧的电机线 安装图: 手柄程序代码: [mw_shl_code=applescript,true] #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); }[/mw_shl_code] 小车程序代码: [mw_shl_code=applescript,true]//电机控制端口设置 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); }[/mw_shl_code] 这样就做好了全向小车和控制器,接上电源就可以玩耍了 将黄色按钮按下后,使用3D手势传感器,小车开始移动,松开黄色按钮后,小车停止移动。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed