将向你展示如何构建机械手臂并使用手势和计算机视觉来控制它。下面有一个在开发阶段的机械手臂的演示视频。
展示开发中的手臂的演示视频:https://youtu.be/KwiwetZGv0s
如图所示,该过程首先用摄像头捕捉我的手及其标志。通过跟踪特定的界标,例如拇指和食指的指尖,可以确定这些界标的相对运动,并将其转化为伺服系统的运动。这是通过处理数据并将整数值发送到控制伺服电机的 Arduino 的 Python 脚本完成的。
操作流程:
相机 —> python 脚本 —> Arduino —> 伺服电机
此项目的项目列表
机械臂套件(仅限框架和伺服电机 (MG996)):
Arduino 板(加 USB 线)
跳线
电话充电器
PCA9685 伺服电机驱动器
笔记本电脑
抽吸泵套件:
继电器模块
使用的编程环境:
开发环境
PyCharm 编辑器
先决条件:
OpenCV 知识
youtube 上有教程:https://www.youtube.com/watch?v=WQeoO7MI0Bs&t=8774s
了解 C++ 和 Python
需要修改机械臂组件(用于我购买的套件),因为伺服电机在完全组装后无法移动机械臂,导致某些自由度 (DOF) 的损失,并取消了作为末端执行器的抓手。我选择改用抽吸泵机构。
对于这个项目,你可以只购买我使用的机械臂套件,或者只购买底盘并升级到更强大的伺服系统,以与完整的组件一起工作。第二种选择需要你使用本文作为指导,并进行修改以达到你想要的结果。
组装机械臂:
将 Arduino 代码加载到电路板上,并使用电路图连接伺服电机。
是时候组装机器人手臂了。在开始之前,确保按照此处所述(https://www.electroniclinic.com/pca9685-servo-driver-arduino-circuit-diagram-and-code/#google_vignette),通过下载并安装 HCPCA9685 库来加载 Arduino 代码。使用提供的电路图连接伺服电机,以确保它们处于所需位置。首先将手臂底部的伺服(旋转底座关节)连接到 PCA9865 的引脚 0,然后将手臂中的下一个伺服(肩关节)连接到引脚 3,依此类推,从左到右移动 PCA9685。最后,启动 Arduino 板并等待伺服电机到达其位置。
手臂关节
将滑轮放在伺服电机上并固定螺钉。
现在是时候组装机器人手臂的其他部分了。使用此处(https://automaticaddison.com/how-to-build-a-diy-aluminium-6-dof-robotic-arm-from-scratch/) 链接的视频作为指南,但你可以随意使用自己的方法来实现图像中描绘的姿势。如果在测试过程中遇到任何问题,例如关节不动,请检查伺服电机是否发热。如果天气很热,则该接头处可能存在装配问题,导致其无法正常工作。
图片显示机器人手臂处于原位。
组装手臂时供参考的附加图片
连接抽吸泵:
如下图所示连接软管,黑色箭头代表空气的连接和流动。
抽吸泵机构
将真空泵、继电器模块和电磁阀的负极端子连接到电源的负极端子。
将继电器模块的正极端子连接到电源的正极端子。
将继电器模块的信号线连接到 Arduino 板的数字引脚 3。
将真空泵的正极端子连接到继电器模块的常开 (NO) 端子。
将电磁阀的正极端子连接到继电器模块的常闭 (NC) 端子。
将继电器模块的公共端子连接到电源输入的正极端子。
Arduino代码:
设置和初始化库和变量。
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define USMIN 1000//600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
#define USMAX 2000//2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
uint16_t Pos1;
uint16_t Pos2;
uint16_t Pos3;
uint16_t Pos0;
int ang;
int ang2;
int ang3;
int ang0;
int X; //variable storing data from the index finger (landmark 8)
int Y; //variable storing data from the middle finger(landmark 12)
int Z; //variable storing data from the ring finger (landmark 16)
int J; //variable storing data from the bottom of the palm (landmark 0)
int K; //variable storing data from the thumb finger (landmark )
int L; //variable storing data from the thumb finger (landmark )
const int RELAY_PIN = 3; // auction pump relay pin
const int RELAY_PIN = 3;
“setup”部分在通电后运行一次并定