在人工短缺的大背景下,机械手正在大显身手,得到越来越多的应用。今天我们就通过一个便宜的机械手套件来了解其控制的基本原理及电路。我们将试验用Arduino Nano加PCA9685伺服控制器同时控制5个伺服电机

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

本文作者:加拿大DroneBotWorkShop 翻译整理:DIY百事

目录

1 简介
2 DFRobot 5 DOF 机械臂套件
3 5 自由度
4 机械臂部分
5 机械臂组装
6 组装夹具
6.1所需零件
6.2组装说明
7 组装底座电机安装座
7.1所需零件
7.2组装说明
8 组装双U型支架
8.1所需零件
8.2组装说明
9 组装带支架的弯头电机安装座
9.1所需零件
9.2组装说明
10 组装腕式电机支架和夹持器支架
10.1所需零件
10.2组装说明
11 安装底座电机
11.1所需零件
11.2组装说明
12 连接底座到双 U 型支架
12.1所需零件
12.2组装说明
13 安装弯头电机
13.1所需零件
13.2组装说明
14 将双 U 型支架连接到带支架的弯头安装座
14.1所需零件
14.2组装说明
15 安装手腕电机
15.1所需零件
15.2组装说明
16 将带支架的弯头安装座连接到手腕马达安装座
16.1所需零件
16.2组装说明
17 安装夹爪
17.1所需零件
17.2组装说明
18 Arduino 控制器
18.1 Arduino Nano
18.2控制器接线
18.3 Arduino 代码
19 测试机械臂
20 展开机械臂

让我们先看看我们将要构建什么。

DFRobot 5 DOF 机械臂套件

该DFRobot 5自由度机械手臂套件包括所有的伺服电机,支架,紧固件和其他硬件,你可以用它建立一个小而强大的机械臂及夹持机构。

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

手臂的支架和支撑件由黑色阳极氧化铝制成,它提供强大的支撑。

手臂由 5 个伺服电机提供动力,都是标准尺寸:

  • 两个 15Kg/cm 舵机用于底座和肘部
  • 一个 5.5 Kg/cm 手腕舵机
  • 两个 4 Kg/cm 伺服器用于夹持机构

舵机、支架和硬件包装在带有识别标签的单独塑料袋中。除伺服电机外,夹具机构均已组装。

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

DFRobot 5 DOF 机械臂套件的完整零件清单如下所示:

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

组装臂所需的唯一工具是十字螺丝刀和一套钳子。

5 个自由度

与大多数机械臂一样,DFRobot 套件被宣传为“5 DOF”或 5 自由度机械臂。术语“自由度”究竟是什么意思?

事实证明,这可能意味着不同的事情,具体取决于您所在的领域。

如果您是一名航空工程师,那么对您来说,自由度可能由经典的三个维度和物体可以移动的方向表示:

  • 前进与后退 Forwards & Backwards
  • 上下 Up & Down
  • 左右 Left & Right
  • 上述三个方向为轴的转动

然而,在机器人技术中,“自由度”或 DOF 通常被认为表示机构具有的可移动关节的数量。对于机器人手臂,这通常意味着手臂拥有的电机数量。

我们的机械臂有 5 个电机,因此被宣传为“5 DOF”机械臂。

机械臂部分

伺服电机各自为机械臂的不同部分提供动力,下面的描述中将用为它们提供动力的部分的名称来表示。

我将手臂部分命名为与人类手臂上的等效部分大致对应,这是我们大多数人应该熟悉的参考点。在某些情况下(在抓手周围),人类手臂上没有相应的部分,所以我尽可能描述性地命名这些部分。

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

各部分如下:

  • 底座–机器人手臂的底座,对应于人的肩膀。底座固定到位,至少现在是这样。
  • 肘部–手臂上的第一部分。就像人的肘部一样,它允许手臂弯曲。
  • 手腕–手臂上的第二部分。它允许更好地定位夹具组件。
  • 关节–允许夹具向任一方向旋转 90 度。人的手和手臂没有这样的关节,旋转一只手是用手臂上的几块不同的肌肉来完成的。
  • 夹爪 – 夹具机构本身,操作起来很像台钳或钳子。

在操作中,手臂的底座需要牢固地固定在坚固的表面上。手臂能够承受很大的扭矩和动量,因此需要可靠固定。

机械臂组装

DFRobot 5 DOF 机械臂套件是许多 5 DOF 机械臂的典型代表,因此您可能拥有与之类似的套件。您还可以使用DFRobot 网站上的部件将这个手臂或它的自定义版本拼凑起来。

机器人手臂的组装将按以下顺序进行:

  1. 组装夹爪
  2. 组装底座电机安装座
  3. 组装双 U 型支架
  4. 用支架组装肘部电机安装座
  5. 使用夹持器安装座组装腕式电机安装座
  6. 安装底座电机
  7. 将底座连接到双 U 型支架
  8. 安装肘部电机
  9. 将双 U 型支架连接到带支架的弯头安装座
  10. 安装手腕电机
  11. 将带支架的肘部安装座连接到手腕马达安装座
  12. 安装夹爪
  13. 接线和测试!

以下是每个步骤的详细信息:

组装夹爪所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧
arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧组装说明

  • 将两个舵机都设置为 0 度位置(完全逆时针)
  • 拿起夹具并将其与其中一台电机成 90 度角
  • 将伺服轴插入夹具组件背面,与齿轮啮合。
  • 测试对齐是否正确
  • 插入并拧紧臂安装螺钉以将夹具固定回电机轴
  • 手动操作夹爪直到它们处于完全打开位置。注意不要超过这个范围。
  • 将伺服电机插入钳口下方的位置,与齿轮啮合。
  • 测试对齐是否正确
  • 插入并拧紧臂安装螺钉以将夹爪机构固定到电机轴上。
  • 测试两个伺服电机以验证夹具是否正常运行。

组装底座电机安装座所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧组装说明

  • 放置舵机安装支架,使舵机安装在前面,带有两个孔的平板在后面。
  • 将人员轴承套件中的螺钉插入伺服支架背面左侧的孔中,螺钉头朝向伺服电机的一侧。
  • 将人员轴承套件中的轴承插入伺服支架外侧的螺钉上。确保轴承的斜面部分与伺服支架齐平。
  • 在轴承顶部插入锁紧垫圈。
  • 将螺母拧到螺钉上。
  • 拧紧螺钉和锁紧螺母。
  • 确认在拧紧螺钉后轴承仍能自由旋转。

组装双 U 型支架所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

组装说明

  • 将两个 U 型支架对齐,使短节相互压紧,并对齐安装孔。如果您有像我这样预先钻好的安装孔,您需要确保它们以相同的方式排列,否则方向无关紧要。
  • 使用袋子中的 4 个螺钉和螺母将支架固定在一起。确保将它们牢牢固定。

用支架组装弯头电机安装座所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧组装说明

  • 放置舵机安装支架,使舵机安装在前面,带有两个孔的平板在后面。
  • 将人员轴承套件中的螺钉插入伺服支架背面左侧的孔中,螺钉头朝向伺服电机的一侧。
  • 将人员轴承套件中的轴承插入伺服支架外侧的螺钉上。确保轴承的斜面部分与伺服支架齐平。
  • 在轴承顶部插入锁紧垫圈。
  • 将螺母拧到螺钉上。
  • 拧紧螺钉和锁紧螺母。
  • 确认在拧紧螺钉后轴承仍能自由旋转。
  • 将 L 型支架短边上的安装孔与 U 型支架短平底上的安装孔对齐。L 型支架应与 U 型支架成直角,详情请参见插图。
  • 使用 L 型支架随附的螺钉将 L 型支架固定到 U 型支架上。螺钉头应位于 L 型支架一侧。
  • 将 L 型支架长边的安装孔与舵机安装支架右下方的安装孔对齐。
  • 使用袋子中的 4 个螺钉和螺母将 L 型支架固定到伺服安装支架上。螺钉头应位于 L 型支架一侧。

使用夹持器安装座组装腕式电机安装座所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧组装说明

  • 放一个舵机安装支架,舵机安装在前,两个孔的平板在后。
  • 将人员轴承套件中的螺钉插入伺服支架右后侧的孔中,螺钉头面向伺服电机的一侧(请注意,这是之前电机安装装配说明中使用的相反侧)。
  • 将人员轴承套件中的轴承插入伺服支架外侧的螺钉上。确保轴承的斜面部分与伺服支架齐平。
  • 在轴承顶部插入锁紧垫圈。
  • 将螺母拧到螺钉上。
  • 拧紧螺钉和锁紧螺母。
  • 确认在拧紧螺钉后轴承仍能自由旋转。
  • 将第二个伺服安装支架下方的第二个伺服安装支架成直角对齐,以便第二个伺服的轴位于组件的右侧。对齐安装孔,有关详细信息,请参见插图。
  • 用袋子中的 4 个螺钉和螺母固定两个伺服安装支架。螺丝头应面向底部伺服支架。牢固地拧紧。

安装底座电机所需零件

组装说明

  • 将电机旋转到 0 度位置(完全逆时针)。
  • 安装电机时轴与背面轴承对齐,使用随伺服支架提供的 4 个螺钉和螺母将电机紧固。
  • 将臂放在电机轴上,暂时留在原处。
    其它小部件装配不再详述

您现在已经完成了手臂的机械组装。

重置和运行所有伺服电机以确保一切正常工作并正确对齐是一个好主意。如有必要,通过卸下将伺服臂固定到框架的 4 个螺钉来调整连接点的位置,并根据需要重新定位。

现在让我们组装一个简单的控制器并让手臂完成它的步伐!

Arduino控制器

我将 PCA9685 16 通道 PWM 控制器直接安装到我的机械臂上,以便我可以使用 I2C 总线控制所有电机。

虽然我现在对机器人手臂有很好的计划,但我只需要一个简单的控制器来调整所有五个伺服电机的位置。我是围绕 Arduino Nano 来设计的。

Arduino Nano

我的 Arduino 项目通常基于 Arduino Uno,它是一种流行且廉价的微控制器板,具有大量输入和输出。但有时它不符合要求。这次就是。

我想构建一个具有 5 个电位器的控制器,分别控制每个电机。然后它会通过 I2C 总线将信息发送到 PCA9685 以控制伺服系统。我还希望它能够轻松升级为使用 6 个电位计用于 6 DOF 臂(基本上是我的 5 DOF 臂,底部带有转盘)。

Arduino Uno 有 6 个模拟输入,因此乍一看似乎非常适合这项工作。但是有一个问题!在此设计中有两个模拟输入不能用。

Arduino Uno 上的模拟输入 A4 和 A5 作为 I2C 总线上的 SDA(数据)和 SCL(时钟)线执行双重任务。即使您的 Uno 具有单独的 SDA 和 SCL 引脚,它们也只是在内部连接到 A4 和 A5。

因此,如果您使用 I2C,那么您就不能使用模拟引脚 A4 和 A5,它们是共用的。

而Arduino Nano 有八个模拟输入,比 Uno 多两个。因此,即使 Nano 用引脚 A4 和 A5 作I2C通讯,它仍然有足够的剩余模拟输入来完成这项工作。

即使我最终添加了第六个电位器!

Nano 在大多数方面与 Uno 一样易于使用,尤其是当您将其安装到无焊面包板上或使用适配器插座时。请记住将 Arduino IDE 中的开发板类型更改为“Arduino Nano”,否则在编译代码时会出现错误。

为控制器接线

我们简易型机械臂控制器的接线非常简单,尤其是当我们使用 PCA9685 进行伺服连接时。

为了减少任何混乱,我在两个图表上显示了接线。这与我将 PCA9685 直接安装在手臂上的安排相匹配。如果您希望将 PCA9685 安装在用于 Arduino Nano 的同一块板或面包板上,这取决于您。

我喜欢直接安装在手臂上的 PCA9685,因为我认为它可以减少接线并避免延长任何伺服电机电缆。而且我还打算在我的手臂上安装其他 I2C 设备,因此为所有这些设备设置一个 I2C 连接是有意义的。

arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧arduino舵机控制程序(arduino蓝牙模块控制舵机)-风君小屋帮我吧

我们接线图的“Arduino 部分”有 Nano 和 5 个电位器。控制器一侧接地,另一侧从 Arduino Nano 获得 5 伏电压。

每个电位计的输出连接到 Arduino Nano 上的模拟输入,如下所示:

  • 底座Base – A0
  • 肘部Elbow – A1
  • 手腕Wrist – A2
  • 关节Grip Pivot – A3
  • 夹爪Grip Jaws – A6

请注意,A4 和 A5 用于 I2C 连接。

现在让我们转到连接的 PCA9685 一侧。

I2C 连接到 PCA9685 末端的一个连接器,任一连接器都可以工作。

然后,您需要将 5 个(或 6 个)伺服电机连接到该模块。确保以正确的方式连接。

最后,您将需要一个具有足够电流来驱动五个伺服电机的电源。6 伏 2 安电源将是理想的选择。电源直接连接到 PCA9685 模块上的连接器。

一旦你把它全部连接起来,就该编写一些代码了!

Arduino代码

此处提供了简单机械臂控制器的代码。

该草图使用了 Adafruit PWM 库,您需要将其安装到 Arduino IDE 中。只需在库管理器中搜索“Adafruit PWM”,它应该是第一个结果。

如果您需要安装库的帮助或想了解有关此库和 PCA9685 的更多信息,请查看我关于使用伺服电机的文章。

/*
  Basic Robot Arm Controller
  robot-arm-control-basic.ino
  Controls 5 DOF Robot Arm, uses Arduino Nano and PCA9685 PWM Controller
  Uses Adafruit PWM library
  Uses 5 potentiometers for input (can be modified for 6)
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/
 
// Include Wire Library for I2C Communications
#include 
 
// Include Adafruit PWM Library
#include 
 
#define MIN_PULSE_WIDTH       650
#define MAX_PULSE_WIDTH       2350
#define FREQUENCY             50
 
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 
// Define Potentiometer Inputs
 
int controlBase = A0;
int controlElbow = A1;
int controlWrist = A2;
int controlPivot = A3;
int controlJaws = A6;
 
// Define Motor Outputs on PCA9685 board
 
int motorBase = 0;
int motorElbow = 1;
int motorWrist = 2;
int motorPivot = 3;
int motorJaws = 4;
 
// Define Motor position variables
int mtrDegreeBase;
int mtrDegreeElbow;
int mtrDegreeWrist;
int mtrDegreePivot;
int mtrDegreeJaws;
 
void setup()
{
  // Setup PWM Controller object
  pwm.begin();
  pwm.setPWMFreq(FREQUENCY);
}
 
// Function to move motor to specific position
void moveMotorDeg(int moveDegree, int motorOut)
{
  int pulse_wide, pulse_width;
 
  // Convert to pulse width
  pulse_wide = map(moveDegree, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
  pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
  
  //Control Motor
  pwm.setPWM(motorOut, 0, pulse_width);
}
 
// Function to convert potentiometer position into servo angle
int getDegree(int controlIn)
{
  int potVal,srvDegree;
  
  // Read values from potentiometer
  potVal = analogRead(controlIn);
  
  // Calculate angle in degrees
  srvDegree = map(potVal, 0, 1023, 0, 180);
  
  // Return angle in degrees
  return srvDegree;
  
}
 
void loop() {
 
  //Control Base Motor
  
  // Get desired position
  mtrDegreeBase = getDegree(controlBase);
  // Move motor
  moveMotorDeg(mtrDegreeBase,motorBase);
  
  
  //Control Elbow Motor
  
  // Get desired position
  mtrDegreeElbow = getDegree(controlElbow);
  // Move motor
  moveMotorDeg(mtrDegreeElbow,motorElbow);
  
  
  //Control Wrist Motor
  
  // Get desired position
  mtrDegreeWrist = getDegree(controlWrist);
  // Move motor
  moveMotorDeg(mtrDegreeWrist,motorWrist);
  
  
  //Control Pivot Motor
  
  // Get desired position
  mtrDegreePivot = getDegree(controlPivot);
  // Move motor
  moveMotorDeg(mtrDegreePivot,motorPivot);
  
  
  //Control Jaws Motor
  
  // Get desired position
  mtrDegreeJaws = getDegree(controlJaws);
  // Move motor
  moveMotorDeg(mtrDegreeJaws,motorJaws);
 
 
  // Add short delay
  delay(20);
 
}

该代码包括 Adafruit PWM 库和 Wire 库,这对于通过 I2C 总线进行通信至关重要。

为 PWM 控制器定义了一些常数,PWM 信号的最小和最大脉冲宽度以及信号的频率。代码中的值将适用于 DF Robot 5 DOF 机器人手臂套件随附的电机。

接下来定义了许多变量:

  • “control”变量,代表电位计所连接的模拟端口。
  • “motor” 变量代表 PCA9685 板上 PWM 输出。
  • mtrDegree ”变量表示您希望电机轴定位到的角度(从 0 到 180)。

在设置中,我们只初始化 PWM 对象并将 PWM 振荡器的频率设置为 50 Hz,这是模拟伺服电机的标准。

然后我们定义两个函数:

  • moveMotorDeg – 此函数将电机名称和位置(以度为单位)作为输入。然后它将请求的电机移动到该位置。
  • getDegree – 此函数将电位计名称作为输入并以度数输出位置。

由于我们定义了两个函数,循环非常简单。这确实是相同的程序重复五次,每个电机一次。

电位计位置是使用getDegree函数确定的。然后将此信息传递给moveMotorDeg函数以将相应的电机移动到所需位置。

在为每个电机执行此例程后,会产生短暂的延迟,然后循环重新开始。结果是伺服电机响应电位计位置而移动。

测试机械臂

将所有东西连接起来并提供合适的电源,然后准备测试您的手臂。

确保将手臂牢固地固定在有足够质量支撑它的底座上。当你第一次给手臂加电时,不要让你的手和手指挡住你的手,舵机会立即移动到位,它们不会因为你的手指而停下来!

手臂很结实,能够举起合理的重量。如果您使用过像 MeArm 这样的小型实验臂,那么您会发现这是一个显著的改进。

抓手特别有用,它实际上能够以可重复的方式拾取小物件。

花几个小时把玩一下你的新机械手臂,这让人上瘾!

展开机械臂

这样我们完成了手臂的构建,但还可以做些后续的事情。这实际上只是 DFRobot 5 DOF 机械臂项目的开始,至少对我来说是这样。

我已经在我的下一批实验中安装了一个传感器。这是一个 MPU5060 陀螺仪和高度计设备,我安装在手臂手腕上以测量位置。它们用 I2C通讯,因此接口很简单。

摄像头、距离传感器、限位传感器、力敏电阻器——对于像这样的坚固机器人手臂可以连接的东西,天空是无限的。

所以我可以保证你会在车间看到更多的手臂。将此文章和视频视为系列的一部分。

我希望这篇文章能激励你建造一个像这样的机械臂。DFRobot 套件价格低廉,并且包含一些可以使用很长时间的高质量部件。

我很想听听你的机械臂设计。请在下面的评论中告诉我您的创作以及您在制作手臂时可能遇到的任何问题。