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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(1)

本文作者:加拿大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 Nano18.2控制器接线18.3 Arduino 代码19 测试机械臂20 展开机械臂

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

DFRobot 5 DOF 机械臂套件

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(2)

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

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

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(3)

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(4)

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

5 个自由度

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

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

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

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

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

机械臂部分

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

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(5)

各部分如下:

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

机械臂组装

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

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

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

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

组装夹爪所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)(6)arduino舵机控制程序(arduino蓝牙模块控制舵机)(7)

组装说明

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(8)

组装说明

组装双 U 型支架所需零件

arduino舵机控制程序(arduino蓝牙模块控制舵机)(9)

组装说明

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(10)

组装说明

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(11)

组装说明

安装底座电机所需零件

组装说明

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

重置和运行所有伺服电机以确保一切正常工作并正确对齐是一个好主意。如有必要,通过卸下将伺服臂固定到框架的 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蓝牙模块控制舵机)(12)

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

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

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

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

arduino舵机控制程序(arduino蓝牙模块控制舵机)(13)

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  http://dronebotworkshop.com*/ // Include Wire Library for I2C Communications#include <Wire.h> // Include Adafruit PWM Library#include <Adafruit_PWMServoDriver.h> #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 variablesint 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 positionvoid 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 angleint 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 套件价格低廉,并且包含一些可以使用很长时间的高质量部件。

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