arduino舵机控制程序实例 控制舵机的arduino程序



文章插图
arduino舵机控制程序实例 控制舵机的arduino程序

文章插图
在人工短缺的大背景下,机械手正在大显身手,得到越来越多的应用 。今天我们就通过一个便宜的机械手套件来了解其控制的基本原理及电路 。我们将试验用Arduino Nano加PCA9685伺服控制器同时控制5个伺服电机
本文作者:加拿大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自由度机械手臂套件包括所有的伺服电机,支架,紧固件和其他硬件,你可以用它建立一个小而强大的机械臂及夹持机构 。
手臂的支架和支撑件由黑色阳极氧化铝制成,它提供强大的支撑 。
手臂由 5 个伺服电机提供动力,都是标准尺寸:
两个 15Kg/cm 舵机用于底座和肘部一个 5.5 Kg/cm 手腕舵机两个 4 Kg/cm 伺服器用于夹持机构
舵机、支架和硬件包装在带有识别标签的单独塑料袋中 。除伺服电机外,夹具机构均已组装 。
DFRobot 5 DOF 机械臂套件的完整零件清单如下所示:
组装臂所需的唯一工具是十字螺丝刀和一套钳子 。
5 个自由度
与大多数机械臂一样,DFRobot 套件被宣传为“5 DOF”或 5 自由度机械臂 。术语“自由度”究竟是什么意思?
事实证明,这可能意味着不同的事情,具体取决于您所在的领域 。
如果您是一名航空工程师,那么对您来说,自由度可能由经典的三个维度和物体可以移动的方向表示:
前进与后退 Forwards & Backwards上下 Up & Down左右 Left & Right上述三个方向为轴的转动
然而,在机器人技术中,“自由度”或 DOF 通常被认为表示机构具有的可移动关节的数量 。对于机器人手臂,这通常意味着手臂拥有的电机数量 。
我们的机械臂有 5 个电机,因此被宣传为“5 DOF”机械臂 。
机械臂部分
伺服电机各自为机械臂的不同部分提供动力,下面的描述中将用为它们提供动力的部分的名称来表示 。
我将手臂部分命名为与人类手臂上的等效部分大致对应,这是我们大多数人应该熟悉的参考点 。在某些情况下(在抓手周围),人类手臂上没有相应的部分,所以我尽可能描述性地命名这些部分 。
各部分如下:
底座–机器人手臂的底座,对应于人的肩膀 。底座固定到位,至少现在是这样 。肘部–手臂上的第一部分 。就像人的肘部一样,它允许手臂弯曲 。手腕–手臂上的第二部分 。它允许更好地定位夹具组件 。关节–允许夹具向任一方向旋转 90 度 。人的手和手臂没有这样的关节,旋转一只手是用手臂上的几块不同的肌肉来完成的 。夹爪 – 夹具机构本身,操作起来很像台钳或钳子 。
在操作中,手臂的底座需要牢固地固定在坚固的表面上 。手臂能够承受很大的扭矩和动量,因此需要可靠固定 。
机械臂组装
DFRobot 5 DOF 机械臂套件是许多 5 DOF 机械臂的典型代表,因此您可能拥有与之类似的套件 。您还可以使用DFRobot 网站上的部件将这个手臂或它的自定义版本拼凑起来 。
机器人手臂的组装将按以下顺序进行:
组装夹爪组装底座电机安装座组装双 U 型支架用支架组装肘部电机安装座使用夹持器安装座组装腕式电机安装座安装底座电机将底座连接到双 U 型支架安装肘部电机将双 U 型支架连接到带支架的弯头安装座安装手腕电机将带支架的肘部安装座连接到手腕马达安装座安装夹爪接线和测试!
以下是每个步骤的详细信息:
组装夹爪所需零件
组装说明将两个舵机都设置为 0 度位置(完全逆时针)拿起夹具并将其与其中一台电机成 90 度角将伺服轴插入夹具组件背面,与齿轮啮合 。测试对齐是否正确插入并拧紧臂安装螺钉以将夹具固定回电机轴手动操作夹爪直到它们处于完全打开位置 。注意不要超过这个范围 。将伺服电机插入钳口下方的位置,与齿轮啮合 。测试对齐是否正确插入并拧紧臂安装螺钉以将夹爪机构固定到电机轴上 。测试两个伺服电机以验证夹具是否正常运行 。组装底座电机安装座所需零件
组装说明放置舵机安装支架,使舵机安装在前面,带有两个孔的平板在后面 。将人员轴承套件中的螺钉插入伺服支架背面左侧的孔中,螺钉头朝向伺服电机的一侧 。将人员轴承套件中的轴承插入伺服支架外侧的螺钉上 。确保轴承的斜面部分与伺服支架齐平 。在轴承顶部插入锁紧垫圈 。将螺母拧到螺钉上 。拧紧螺钉和锁紧螺母 。确认在拧紧螺钉后轴承仍能自由旋转 。组装双 U 型支架所需零件
组装说明
将两个 U 型支架对齐,使短节相互压紧,并对齐安装孔 。如果您有像我这样预先钻好的安装孔,您需要确保它们以相同的方式排列,否则方向无关紧要 。使用袋子中的 4 个螺钉和螺母将支架固定在一起 。确保将它们牢牢固定 。用支架组装弯头电机安装座所需零件
组装说明放置舵机安装支架,使舵机安装在前面,带有两个孔的平板在后面 。将人员轴承套件中的螺钉插入伺服支架背面左侧的孔中,螺钉头朝向伺服电机的一侧 。将人员轴承套件中的轴承插入伺服支架外侧的螺钉上 。确保轴承的斜面部分与伺服支架齐平 。在轴承顶部插入锁紧垫圈 。将螺母拧到螺钉上 。拧紧螺钉和锁紧螺母 。确认在拧紧螺钉后轴承仍能自由旋转 。将 L 型支架短边上的安装孔与 U 型支架短平底上的安装孔对齐 。L 型支架应与 U 型支架成直角,详情请参见插图 。使用 L 型支架随附的螺钉将 L 型支架固定到 U 型支架上 。螺钉头应位于 L 型支架一侧 。将 L 型支架长边的安装孔与舵机安装支架右下方的安装孔对齐 。使用袋子中的 4 个螺钉和螺母将 L 型支架固定到伺服安装支架上 。螺钉头应位于 L 型支架一侧 。使用夹持器安装座组装腕式电机安装座所需零件
组装说明放一个舵机安装支架,舵机安装在前,两个孔的平板在后 。将人员轴承套件中的螺钉插入伺服支架右后侧的孔中,螺钉头面向伺服电机的一侧(请注意,这是之前电机安装装配说明中使用的相反侧) 。将人员轴承套件中的轴承插入伺服支架外侧的螺钉上 。确保轴承的斜面部分与伺服支架齐平 。在轴承顶部插入锁紧垫圈 。将螺母拧到螺钉上 。拧紧螺钉和锁紧螺母 。确认在拧紧螺钉后轴承仍能自由旋转 。将第二个伺服安装支架下方的第二个伺服安装支架成直角对齐,以便第二个伺服的轴位于组件的右侧 。对齐安装孔,有关详细信息,请参见插图 。用袋子中的 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 部分”有 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 Controllerrobot-arm-control-basic.inoControls 5 DOF Robot Arm, uses Arduino Nano and PCA9685 PWM ControllerUses Adafruit PWM libraryUses 5 potentiometers for input (can be modified for 6)DroneBot Workshop 2018https://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 50Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();// Define Potentiometer Inputsint controlBase = A0;int controlElbow = A1;int controlWrist = A2;int controlPivot = A3;int controlJaws = A6;// Define Motor Outputs on PCA9685 boardint 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 objectpwm.begin();pwm.setPWMFreq(FREQUENCY);}// Function to move motor to specific positionvoid moveMotorDeg(int moveDegree, int motorOut){int pulse_wide, pulse_width;// Convert to pulse widthpulse_wide = map(moveDegree, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);//Control Motorpwm.setPWM(motorOut, 0, pulse_width);}// Function to convert potentiometer position into servo angleint getDegree(int controlIn){int potVal,srvDegree;// Read values from potentiometerpotVal = analogRead(controlIn);// Calculate angle in degreessrvDegree = map(potVal, 0, 1023, 0, 180);// Return angle in degreesreturn srvDegree;}void loop() {//Control Base Motor// Get desired positionmtrDegreeBase = getDegree(controlBase);// Move motormoveMotorDeg(mtrDegreeBase,motorBase);//Control Elbow Motor// Get desired positionmtrDegreeElbow = getDegree(controlElbow);// Move motormoveMotorDeg(mtrDegreeElbow,motorElbow);//Control Wrist Motor// Get desired positionmtrDegreeWrist = getDegree(controlWrist);// Move motormoveMotorDeg(mtrDegreeWrist,motorWrist);//Control Pivot Motor// Get desired positionmtrDegreePivot = getDegree(controlPivot);// Move motormoveMotorDeg(mtrDegreePivot,motorPivot);//Control Jaws Motor// Get desired positionmtrDegreeJaws = getDegree(controlJaws);// Move motormoveMotorDeg(mtrDegreeJaws,motorJaws);// Add short delaydelay(20);}该代码包括 Adafruit PWM 库和 Wire 库,这对于通过 I2C 总线进行通信至关重要 。
为 PWM 控制器定义了一些常数,PWM 信号的最小和最大脉冲宽度以及信号的频率 。代码中的值将适用于 DF Robot 5 DOF 机器人手臂套件随附的电机 。
接下来定义了许多变量:
“c