一、简介 本次项目主要使用Arduino Mega开发板和Arduino Mega传感器扩展板结合PAJ7620手势传感器对六个28BYJ-48步进电机进行控制。手势传感器可识别 向左、向右、向上、向下四个方向的手势。并配合手势旋转不同的角度。 二、材料清单1、1MEGA2560 R3 开发板
2、6步进电机
3、6按压装置
4、1手势识别模块
5、6亚克力板
6、6联轴器
7、1*MEGA2560专用扩展板 三、程序功能第1步:MEGA2560 R3 开发板通过MEGA2560专用扩展板控制6个步进电机,电机根据检测到的手势进行相应的旋转。检测到
向左手势第一次:6个步进电机顺时针旋转45°,如果检测到第二次向左手势,再次旋转45°,以此类推,每次检测到一次向左手势则顺时针旋转45°一次,直到电机顺时针旋转到90°位置。
向右手势第一次:6个步进电机逆时针旋转45°,如果检测到第二次向右手势,再次旋转45°,以此类推,每次检测到一次向右手势则逆时针旋转45°一次,直到电机逆时针旋转到-90°位置。
向上手势第一次:如果电机在-90°或者-45°位置,则6个步进电机顺时针旋转到0°位置,如果电机在0°或者45°位置,则6个步进电机顺时针旋转到90°位置。如果电机处于90°位置,则向上手势无效。
向下手势第一次:如果电机在90°或者45°位置,则6个步进电机逆时针旋转到0°位置,如果电机在0°或者-45°位置,则6个步进电逆时针旋转到-90°位置。如果电机处于-90°位置,则向下手势无效。
第2步:MEGA2560 R3 开发板通过手势识别模块,进行动作捕获。
当检测到向上手势时,向串口监视器发送”UP”字符;
当检测到向下手势时,向串口监视器发送”DOWM”字符;
当检测到向右手势时,向串口监视器发送”RIGHT”字符;
当检测到向左手势时,向串口监视器发送”LEFT”字符;
第3步:MEGA2560 R3 开发板通过类似于按压装置的机械原理,实现按压效果。最终实物不是采用此款。只是借用此原理。 四、程序代码以下展现的是代码的主要功能介绍:(包含有接线方法,以及Arduino使用教程) - /@@*
- 程序目的:
- 第1步:Arduino Mega2560通过Mega2560 R3专用传感器扩展板控制步进电机。
- 第2步:Mega2560通过与Mega2560 R3专用传感器扩展板连接的PAJ7620U2手势传感器识别手势(向左、向右、向上、向下)
- 第3步:Mega2560根据不同的手势,通过与Mega2560 R3专用传感器扩展板连接的ULN2003控制电机向不同的方向旋转一定的角度。
- 一、硬件材料
- 1*Arduino Mega2560开发板
- 1*Mega2560 R3专用传感器扩展板
- 6*步进电机
- 6*ULN2003步进电机驱动板
- 6*按压装置
- 1*手势识别模块(PAJ7620U2)
- 若干杜邦线
- 二、电路接线
- Mega2560 R3专用传感器扩展板 的 5V 接 PAJ7620U2 的 VCC
- Mega2560 R3专用传感器扩展板 的 GND 接 PAJ7620U2 的 GND
- Mega2560 R3专用传感器扩展板 的 21(SCL) 接 PAJ7620U2 的 SCL
- Mega2560 R3专用传感器扩展板 的 20(SDA) 接 PAJ7620U2 的 SDA
- 电机1
- Mega2560 R3专用传感器扩展板 的 4 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 5 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 6 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 7 接 ULN2003 的 In4
- 电机2
- Mega2560 R3专用传感器扩展板 的 8 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 9 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 10 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 11 接 ULN2003 的 In4
- 电机3
- Mega2560 R3专用传感器扩展板 的 14 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 15 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 16 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 17 接 ULN2003 的 In4
- 电机4
- Mega2560 R3专用传感器扩展板 的 22 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 23 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 24 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 25 接 ULN2003 的 In4
- 电机5
- Mega2560 R3专用传感器扩展板 的 26 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 27 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 28 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 29 接 ULN2003 的 In4
- 电机6
- Mega2560 R3专用传感器扩展板 的 30 接 ULN2003 的 In1
- Mega2560 R3专用传感器扩展板 的 31 接 ULN2003 的 In2
- Mega2560 R3专用传感器扩展板 的 32 接 ULN2003 的 In3
- Mega2560 R3专用传感器扩展板 的 33 接 ULN2003 的 In4
- Mega2560 R3专用传感器扩展板 的 所有引脚 接 Mega2560开发板 的 所有引脚
- 详见接线图
- 三、程序上传
- 第1步:打开Arduino软件,依次点击 -> 工具 -> 开发板选择"Arduino Mega2560 or Mega2560"
- 第2步:依次点击 -> 工具 -> 端口选择你自己电脑Arduino的COM口,一般是com3开始,如COM3,COM7
- 第3步:点击上传(Arduino软件左上角对勾旁边的图标)
- 四、程序原理
- 第1步:识别手势
- 第2步:根据手势,控制步进电机运动
- 五、预期效果
- 在手势传感器前(10-15cm范围),比出不同的手势,电机会向不同的方向旋转
- 向左手势,电机向左旋转45°
- 向右手势,电机向右旋转45°
- 向上手势,电机向左旋转90°
- 向下手势,电机向右旋转90°
- 六、可能的问题
- 1、接线不对
- 仔细核对接线图接线
- 2、添加库文件
- 打开 arduino IDE 在菜单栏找到【项目】->【加载库】->【添加。ZIP库】
- 在我们发您的文件夹中找到【3、程序代码】->【1、库文件】->找到压缩包进行添加即可
- 需要的库:
- PAJ7620 https://www.arduinolibraries.info/libraries/rev-eng-paj7620
- AccelStepper https://www.arduino.cc/reference/en/libraries/accelstepper/
- 如何安装库文件 https://www.arduino.cc/en/guide/libraries?setlang=cn
- 七、参考的资料
- Arduino教程
- https://space.bilibili.com/103589285/video?tid=0&page=4&keyword=&order=pubdate
- https://www.geek-workshop.com/thread-2719-1-1.html
- https://www.yiboard.com/forum-70-1.html
- 八、升级建议
- 暂无
- */
第一步:首先需要安装以下两个库文件,具体的安装方法参考以上第六步中的如何安装库文件。 - #include"paj7620.h"
- #include<accelstepper.h>
以下是代码的宏定义部分,确定电机的控制引脚以及手势传感器(PAJ7620)的指令 - #define turnLeft 0x0A //手势向左
- #define turnRight 0x0B //手势向右
- #define turnUp 0x0C //手势向上
- #define turnDown 0x0D //手势向下
- //电机步进方式定义
- #define fullStep 4 //全步进参数
- #define halfStep 8 //半步进参数
- //定义1号步进电机引脚
- #define motor1Pin1 4 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor1Pin2 5 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor1Pin3 6 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor1Pin4 7 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- //定义2号步进电机引脚
- #define motor2Pin1 8 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor2Pin2 9 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor2Pin3 10 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor2Pin4 11 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- //定义3号步进电机引脚
- #define motor3Pin1 14 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor3Pin2 15 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor3Pin3 16 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor3Pin4 17 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- //定义4号步进电机引脚
- #define motor4Pin1 22 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor4Pin2 23 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor4Pin3 24 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor4Pin4 25 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- //定义5号步进电机引脚
- #define motor5Pin1 26 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor5Pin2 27 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor5Pin3 28 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor5Pin4 29 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- //定义6号步进电机引脚
- #define motor6Pin1 30 //28BYJ48连接的ULN2003电机驱动板引脚 in1
- #define motor6Pin2 31 //28BYJ48连接的ULN2003电机驱动板引脚 in2
- #define motor6Pin3 32 //28BYJ48连接的ULN2003电机驱动板引脚 in3
- #define motor6Pin4 33 //28BYJ48连接的ULN2003电机驱动板引脚 in4
- uint8_t gestureState = 0; //手势状态(0x0A向左、0x0B向右)
以下是利用Arduino的步进电机驱动库AccelStepper初始化6个步进电机对应的引脚,这里fullStep我设置的是全步进的工作方式,根据实际情况也可以设置为半步进的工作方式。 - /@@*
- 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4
- 所有电机设置为全步进运行
- */
- AccelStepper stepper1(fullStep, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
- AccelStepper stepper2(fullStep, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);
- AccelStepper stepper3(fullStep, motor3Pin1, motor3Pin3, motor3Pin2, motor3Pin4);
- AccelStepper stepper4(fullStep, motor4Pin1, motor4Pin3, motor4Pin2, motor4Pin4);
- AccelStepper stepper5(fullStep, motor5Pin1, motor5Pin3, motor5Pin2, motor5Pin4);
- AccelStepper stepper6(fullStep, motor6Pin1, motor6Pin3, motor6Pin2, motor6Pin4);
初始化部分,主要设置电机的最大速度为800,加速度为80.设置硬串口波特率为9600,硬串口打印字符串”\nPAJ7620U2 TEST DEMO: Recognize 9 gestures.”,如果初始化手势传感器OK则打印“INIT OK”,否则则,打印“INIT ERROR,CODE:”。之后打印字符串“Please input your gestures:”,就可以开始输入手势,在输入手势时,不能远离手势传感器超过10cm,否则会无法识别。(由于系统限制我将它放在底部链接) 主函数的逻辑主要就是读取手势传感器的手势方向,然后根据相应的手势,返回对应的代码:
turnLeft 0x0A
turnRight 0x0B
turnUp 0x0C
turnDown 0x0D
获得相应的代码之后,再利用电机库当中的currentPosition()函数,获取当前电机的具体位置,再根据这个实际位置旋转相应的角度。具体逻辑关系见代码:(由于系统限制我将它放在底部链接) 以下这个函数是loop函数当中被调用的手势识别函数GestureRecognition();主要也是用于判断各种手势(向左、向右、向上、向下)。当然,这个手势模块还有其他手势可以判断,只不过,目前我只用到这几种,小伙伴可以自行探索一下。(由于系统限制我将它放在底部链接) 五、功能演示以下为成品的演示图,仅供参考
附件部分包括了整体代码和测试代码,还有相关的演示视频。(由于平台不支持上传视频我只贴个图片在这了。)
https://www.icxbk.com/download/detail/49408.html</accelstepper.h>
|