亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY Arduino 机械臂——由手势控制

组件和用品

Arduino UNO
× 1
JLCPCB定制PCB
× 1
伺服电机,MG996R
× 6
5V 电池组
× 1
National Control Devices PCA9685 8 通道 8W 12V FET 驱动器比例阀带 I2C 接口的控制器
× 1
HC-05 蓝牙模块
× 2
SparkFun 步进电机驱动板 A4988
× 1
NEMA-17 步进电机
× 1
面包板(通用)
× 1
惯性测量单元 (IMU)(6 度自由度)
× 1
Arduino Nano R3
× 1
柔性传感器
× 1

必要的工具和机器

3D 打印机(通用)

关于这个项目

介绍由人类手势控制的 DIY 机械臂。

环太平洋、阿凡达和其他科幻电影等大片都暗示了与机器人协同的能力——在机器人的帮助下,你的动作可以得到增强。

如果我们能建造同样的工业机器人,但规模更小,会怎样?

这个项目是实现这一目标的尝试。

这是一个 Arduino 机械臂,可以通过手势进行编程甚至控制。

忠于钢铁侠的西装惯例,每次迭代都被称为马克。这个原型将被称为 MARK 1。我们可以期待更多的迭代来改进原来的机械臂。

在此处查看完整的 DIY 机械臂(由手势控制)教程

概览

在本教程中,我们将使用机器人手套构建一个由手势控制的六轴机器人。通过模仿自然的人类手势,例如捏合或向左旋转手腕,您将能够分别向左和向右打开/关闭或旋转机械臂。实际上,手动控制机械臂。

在原始文章中查找更多详细信息

MARK 1 特点:

  • 6 轴旋转
  • 便携
  • 用人类手势控制机器人
  • 可以预先编程以执行基本功能
  • 可以在一定范围内进行无线控制
  • 可承重 600g(最大负载 1kg)

零件清单

机械臂是完全可定制的。您可以购买自己的或 3D 打印自己的。如果您选择 3D 打印,不用担心。有一系列不同的机器人使用伺服电机,所以我们正在构建的理论仍然适用。

对于这个项目,这个原型(标记 1)将是 3D 打印的,因为它给了我更多的空间来创建自定义部件。

机械臂: Thingiverse 3D 打印机械臂(来源:Wonder Tiger):

  • 第 1 部分:夹持器部件
  • 第 2 部分:底座和转盘
  • 第 3 部分:机器人核心臂

您可以找到有关此版本的更多信息,以及上述零件中的螺钉类型。打印时间最长可达 40 小时。然而,这降低了购买机械臂的成本。

机器人手套 Robotic Glove.STL 文件(来源:Roman 13)

机器人手套是该项目的美学补充,但您也可以使用建造者手套来实现机器人手臂。

注意: 对于较大的手,以 105% 的比例打印

工作原理

总的来说,我们正在从机器人手套向伺服电机发送信号(通过蓝牙)。当接收到一个值时,伺服驱动器将向移动机械臂的特定伺服电机发送信号。

现在,如果我们添加多个舵机和更多传感器,我们就可以控制每个电机。 `

如果我们将机械臂视为一系列相互协调以执行功能的伺服电机,我们就可以创建一个由机器人手套控制的机械臂。

机器人手套的 Arduino 使用传感器与机器人手臂 Arduino 通信并发送数据以将伺服器移动到所需角度。

您可能想知道,机器人手套使用哪些传感器?

对于 MARK 1,我们将使用 Flex 传感器和加速度计 (MPU6050)

  • 柔性传感器 – 根据该塑料件的弯曲程度,电阻会发生变化,从而影响电流。然后使用此测量来检测手部运动的变化。
  • 加速度计 – 对于更自然的手势,加速度计可以检测手臂和手腕旋转的变化。

我们正在使用这些传感器来检测手势的变化。然后,我们可以将手势映射的特定值发送到机械臂,以通过蓝牙控制伺服电机。有了足够的手势,机械臂就活过来了!

机械臂映射

下面是手套发送给机械臂的值的映射表。这可以在原始文章中找到。每个都有一个键来表征其功能。 (P – 萍琪,L – 右等)

注意: 大写“F”(手指 表示伺服电机旋转的相反方向

零件组装

机械臂 – 组装

购买机械臂可能非常昂贵。为了将这个机械臂保持在预算范围内,3D 打印机械臂是最好的选择。

从长远来看,这有帮助,因为有许多可以定制的 3D 打印机械臂示例,例如,添加 LED,创建相机支架夹:

如前所述,机械臂是围绕 Thingyverse 上的机械臂建模的。我选择这个例子是因为它是一个优秀的设计,提供六轴,有据可查,并且具有强度/稳健性。您可以从零件列表中访问 Wonder Tiger 的机械臂。

您还可以找到我为机械臂相机支架制作的混音。我们将在未来的版本中更多地介绍这一点。但是,这些零件可能需要至少 40 个小时才能打印所有零件。

您还可以找到许多其他机械臂 3D 打印替代品。

介绍伺服电机和驱动器

鉴于机械臂理想情况下是一系列协调在一起的电机,理论上我们可以连接几个可以全部由 Arduino 供电的电机。在本项目中,我们将使用 PCA9685 伺服驱动器为 MG966R 伺服供电。

注意: 为每个电机供电时使用外部电源。 Arduino 无法提供足够的电源来控制所有电机。在这个项目中,使用了一个 5V、2200 mAh 的 RC 电池。

Arduino 图接线应如下所示:

NEMA-17 用于底座旋转

由于 Robotic 开始增加一些重量,而 MG966R 伺服电机的功率不足以旋转底部的机械臂。要旋转机械臂,需要使用比伺服电机更坚固的电机

可以使用步进电机 (NEMA-17),因为它具有精度和高扭矩,可帮助机械臂无缝旋转以进行手势控制。

NEMA-17和A4988 Driver si用于控制电机的方向,从下图可以看出:

最后,下图显示了完整机械臂的最终接线图组装。

电路组装

下面的接线图显示了所有电子部件的最终组装,以创建机械臂,包括蓝牙模块。我们将在下面介绍配对过程。

人体弯曲传感器

为了忠于机械臂的美学,您可以打印一个 3D 打印的外骨骼护手,用作您的机械手套。

但是,您可以使用标准的Builder's Glove 用于制作机器人手套的原型。这种“机器人手套外骨骼”的设计与机械臂的设计完美融合。

机器人手套由以下组件组成:

  • 柔性传感器 – 基于手指的弯曲,电流会发生变化,我们可以用它来向电机发送信号
  • 加速度计 (MPU6050 ) – 我们可以通过从 X、Y、Z 平面映射人体手势来控制电机
  • LED – 当人类手势控制发送到 Arduino 时,LED 将亮起
  • 蓝牙 (HC-05) 模块 – 向机械臂 HC-05 接收器发送数据
  • Arduino Nano – 微控制器将充当机器人手套的大脑

下图非常适合测试柔性传感器和加速度计。

重要提示: 机械臂的准确度将与机械手套控制的一样,因此值得正确使用。

配置蓝牙(主机和接收器)

Arduino 机械臂使用 HC-05 模块通过蓝牙进行通信。下面突出显示关键信息。

模块

配置

机械手套 HC-05 主机械臂 HC-05 奴隶

注意:

波特率设置为4800

Arduino 编程

您可以下载以下代码:

注意: 所有其他测试代码和最新版本都可以在 Arduino Robotic Arm Git Repo 上找到

机器人手臂编程

机械臂代码使用 HCPCA9685 库(用于伺服驱动程序)。通过这种方式,我们可以为多个伺服电机提供动力,全部由 Arduino 控制。在代码中,我们可以从添加这个库并声明伺服变量开始。

以下变量用于查找前一个/增量并获取Servo的当前位置。

* 包含 HCPCA9685 库 */
#include "HCPCA9685.h"
/* 设备/模块的 I2C 从地址。对于 HCMODU0097,默认 I2C 地址
为 0x40 */
#define I2CAdd 0x40
/* 创建库的实例 */
HCPCA9685 HCPCA9685(I2CAdd);
//电机初始停车位置
const intservo_joint_L_parking_pos =60;
//机器人伺服灵敏度-Intervals
intservo_joint_L_pos_increment =20;
//跟踪电机位置当前值
intservo_joint_L_parking_pos_i=servo_joint_L_parking_pos;
//伺服电机最小和最大角度
intservo_joint_L_min_pos =10;
intservo_joint_L_max_pos =180;

以4800波特率初始化串口,开始蓝牙通信

Serial.begin(4800); // 初始化蓝牙模块的默认通信速率 

在 loop() 部分,我们不断检查是否有任何数据来自机器人手套。如果为真,我们会将传入的数据存储在“状态”变量中。根据给定的字符,我们将使用它来移动电机。

以下部分概述了代码:

机械臂代码可以看作是一系列伺服电机协同工作来模拟人类运动。代码是一样的,Servo由基于Bluetooth值的Servo Driver驱动。

//定义伺服驱动器。 0x40 地址是默认的 I2C 地址。
#define I2CAdd 0x40
int response_time =5; //从机器人手套间隔接收值
//检查数据是否来自串口

if (Serial.available()> 0) {
state =Serial 。读(); // 从串口读取数据
Serial.print(state); // 打印出发送的值
//电机功能代码块
}

根据当前的“状态值”,伺服驱动器会向相应的电机发送信号。

例如,如果我们弯曲手指。值“f”将由机器人手套(通过蓝牙)发送,由此机器人手臂将读取此数据并触发功能以旋转相应的伺服电机。这个过程无限循环重复。

if (Serial.available()> 0) { // 检查数据是否来自串口
state =Serial.read(); // 从串口读取数据
Serial.print(state); // 打印出发送的值
//电机的命名参考文章/教程
//Move (Base Rotation) Stepper Motor Left
if (state ==' S') {
baseRotateLeft();
delay(response_time);
}
}

注意: 该代码实现了硬停止,以阻止电机超过其最大角度,这会导致电机齿轮脱落。

HCPCA9685.Servo(0,servo_joint_L_parking_pos_i); // 将通道 0 处的伺服电机驱动到所需角度。
//向下移动爪形电机
if (state =='f') {
if (servo_joint_3_parking_pos_i HCPCA9685.Servo(4,servo_joint_3_parking_pos_i);
delay(response_time);
Serial.println(servo_joint_3_parking_pos_i);
servo_joint_3_parking_pos_i =servo_joint_3_parking_3_servo_increment;>}
void baseRotateLeft() {
digitalWrite(stepPin, LOW); //根据HIGH, LOW
delayMicroseconds(stepDelay); //改变步进电机的速度
}

如果伺服电机的值小于最大转数,则继续旋转。如果已达到最大旋转 180 度,则停止。

servo_joint_3_parking_pos_i  

其中servo_joint_3_max_pos为电机最大位置。

注意: 该代码实现了硬停止以阻止电机超过其最大角度,这可能会导致电机齿轮脱落。

对柔性传感器进行编程

可以在 GitHub 上找到机械臂代码。如果您在该项目上工作,请将您自己的版本贡献给 Git Repo。这将有助于建立机械臂不同版本和功能的索引。

代码已经记录在案(也可在 Git 上获得)。但是,我们将介绍关键点:

我们将定义五个传感器:

//LED ON PIN 3
int pinkie_Data =A1;
int finger_Data =A2;
int thumb_Data =A3;
//const int MPU_addr =0x68;
const int MPU2 =0x69, MPU1 =0x68;

注意: 0x68和0x69代表2个MPU6050加速度计的I2C地址

//向机械臂发送值的频率
int response_time =1000;

以下代码概述了 Arduino 读取传感器值:

// 从 Flex Sensors 读取值到 Arduino
pinkie =analogRead(pinkie_Data);
finger =analogRead(finger_Data);
thumb =analogRead(thumb_Data);

读取加速度计的当前位置:

GetMpuValue1(MPU1);
GetMpuValue2(MPU2);

校准值:

以下代码校准以找到 Flex 传感器的上限和下限。要重新校准柔性手套,请按下 Arduino 上的重置按钮。

if (bool_caliberate ==false ) {
delay(1000);
thumb_high =(thumb * 1.15);
thumb_low =(thumb * 0.9);
finger_high =(finger * 1.03);
finger_low =(finger * 0.8);
pinkie_high =(pinkie * 1.06);
pinkie_low =(pinkie * 0.8);
bool_caliberate =true;
}

我们将根据校准不断检查当前值是否超过了定义的 flex 的上限或下限。如果柔性传感器高于或低于此值,数据将发送到机械臂,以沿特定方向移动特定伺服电机。

// 手指 1 - 爪弯曲/打开
if (finger>=finger_high) {
Serial.print("F");
delay(response_time);
}
if (finger <=finger_low) {
Serial.print("f");
delay(response_time);
}

机器人手臂编程

结果——回报

机械臂足够精确,可以移动物体。然而,它需要一些工作来移动复杂的物体,甚至与“百万年”人类在灵巧上的竞争……虽然花更多的时间在代码上,但机器人的精度可以达到 MARK 1i 的预期.虽然Arm可以改进,但可以显着改进。

如果你想改进代码,贡献给 Arduino 机械臂 Git 存储库 并锻炼你的手臂。让我们向其他人开放,以供其继续发展!

最后,我们还可以通过手势控制机器人并对机器人进行编程以自动执行基本任务。

后续步骤

这就是 MARK 1 人的全部!如果您喜欢这个项目,请考虑支持我的 Patreon 页面。

代码

  • 代码片段 #1
  • 代码片段 #3
  • 代码片段 #4
  • 代码片段 #5
  • 代码片段 #7
  • 代码片段 #11
  • 代码片段 #12
代码片段 #1纯文本
* 包含 HCPCA9685 库 */#include "HCPCA9685.h"/* 设备/模块的 I2C 从地址。对于HCMODU0097,默认I2C地址为0x40 */#define I2CAdd 0x40/* Create an instance of the library */HCPCA9685 HCPCA9685(I2CAdd);//电机初始停放位置intservo_joint_L_parking_pos =60;//机器人舵机度数灵敏度 - Intervalsintservo_joint_L_pos_increment =20;//跟踪电机位置的当前值intservo_joint_L_parking_pos_i =servo_joint_L_parking_pos;//伺服电机的最小和最大角度intservo_joint_L_min_pos =10;intservo_joint_1_max_pos = 
代码片段 #3纯文本
//定义伺服驱动器。 0x40 地址是默认的 I2C 地址。#define I2CAdd 0x40 int response_time =5; //从机器人手套间隔接收值//检查数据是否来自串口 if (Serial.available()> 0) { state =Serial.read(); // 从串口读取数据 Serial.print(state); // 打印出发送的值 //Motor 功能代码块}
代码片段 #4纯文本
if (Serial.available()> 0) { // 检查数据是否来自串口 state =Serial.read(); // 从串口读取数据 Serial.print(state); // 打印出发送的值 //电机的命名参考文章/教程 //Move (Base Rotation) Stepper Motor Left if (state =='S') { baseRotateLeft();延迟(响应时间); }}
代码片段 #5纯文本
HCPCA9685.Servo(0,servo_joint_L_parking_pos_i); // 将通道 0 处的伺服电机驱动到所需角度。//向下移动爪形电机 if (state =='f') { if (servo_joint_3_parking_pos_i  
代码片段 #7纯文本
//LED ON PIN 3int pinkie_Data =A1;int finger_Data =A2;int thumb_Data =A3;//const int MPU_addr =0x68;const int MPU2 =0x69, MPU1 =0x68;
代码片段 #11纯文本
 if (bool_caliberate ==false ) { delay(1000);拇指_高 =(拇指 * 1.15);拇指_低 =(拇指 * 0.9);手指高=(手指* 1.03);手指_低=(手指* 0.8);小指_高 =(小指 * 1.06);小指_低 =(小指 * 0.8); bool_caliberate =true; }
代码片段 #12纯文本
 // 手指 1 - 爪弯曲/打开 if (finger>=finger_high) { Serial.print("F");延迟(响应时间); } if (finger <=finger_low) { Serial.print("f");延迟(响应时间); }
Github
http://github.com/EbenKouao/arduino-robot-armhttp://github.com/EbenKouao/arduino-robot-arm
Github
https://github.com/EbenKouao/arduino-robotic-armhttps://github.com/EbenKouao/arduino-robotic-arm

定制零件和外壳

物联网
https://www.thingiverse.com/thing:1748596thingiverse.com 上的 CAD 文件
物联网
https://www.thingiverse.com/thing:1750025thingiverse.com 上的 CAD 文件
物联网
https://www.thingiverse.com/thing:1838120thingiverse.com 上的 CAD 文件
物联网
https://www.thingiverse.com/thing:1982745thingiverse.com 上的 CAD 文件

示意图

机械臂 Git 存储库
https://github.com/EbenKouao/arduino-robot-arm

制造工艺

  1. 通过蓝牙控制的树莓派机器人
  2. 在家制作 DIY 作业书写机
  3. 使用 Raspberry Motor Shield 的 Android 控制玩具
  4. 带伺服电机的机器人避障
  5. 线跟随机器人
  6. Nunchuk 控制机械臂(使用 Arduino)
  7. 语音控制机器人
  8. 通过以太网控制的机械臂
  9. MobBob:由 Android 智能手机控制的 DIY Arduino 机器人
  10. Arduino 控制的钢琴机器人:PiBot
  11. Littlearm 2C:构建 3D 打印的 Arduino 机械臂
  12. 超酷室内导航机器人