本地和远程可编程机械臂
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 4 |
应用和在线服务
| ||||
|
关于这个项目
本教程的目的是分步开发一个机器人手臂的控制和编程项目,模拟工业机器人的基本功能。
第 1 步:规格
机器人有两个基本功能:
- 计划 :三个维度记录手臂位置(每条记录是一个“步”)
- 运行 :依次执行“程序”中记录的位置。机器人将运行程序,直到使用命令“ABORT”。
主要特点:
- 该项目可用于控制具有 3 或 4 DOF(“自由度”)的机器人。
- 可以在“LOCAL”和“REMOTE”模式下控制机器人(最后一个通过 Android 设备)
- 在程序阶段,用户可以将控制模式从“本地”更改为“远程”,反之亦然。
- 将通过彩色 LED、2 行 LED 显示屏和声音(蜂鸣器)向用户提供信息。
- 还可以远程触发声音警报。
第 2 步: 项目
上一步的框图显示了将在该项目中使用的“物料清单”。
我选择了 Arduino MEGA,以免担心可用 Arduino 端口 (I/O) 的数量。例如,UNO 可以正常工作,但应使用端口扩展方法。在 Internet 上可以轻松找到多种选项,例如 74138 解码器。
在这里,第一个原型正在“本地模式”下编程。
蓝牙网络使用HC-06。
用于“远程模式
”的 Android 应用 ”,是使用 MIT Appinventor2 工具开发的,该工具是基于 Android 设备的此类应用的强大单一平台。该应用可在 Google 商店免费下载:MJRoBot Arduino Robot Arm Control。
下面的视频可以让您了解远程编程的最终项目应该是什么:
第 3 步:项目开发 图>
机械臂可以根据它们拥有的“关节”或“自由度”(DOF)的数量进行分类。
- “基地 ", 或 "腰部 ",通常可以将手臂转动 180o 或 360o,具体取决于所使用的伺服类型(在本项目中,使用了 180o 伺服)。
- “肩膀 ", 负责垂直“升高或降低”手臂。
- “肘部 " 将使手臂“向前或向后”。
- “爪子 " 或 "夹持器 “通过打开或关闭来“抓取东西”。
第 4 步: 电路
伺服电机将用于驱动关节,直接连接到 Arduino。请注意,在底座上使用“步进电机”以获得更大的扭矩和精度并不少见。舵机的正确选择非常重要(有便宜的中国舵机,结构很差,例如MG995,不幸的是我的SanSmart 3DOF AARM附带的舵机)。但是对于这个项目的提议工作正常。
舵机的直流电源应与 Arduino 和其他组件分开。 5 或 6V 的外部电源应该可以正常工作(检查伺服器的数据表以验证正确的电压范围)。通常的做法是在 VCC 和 GND 之间使用 470uF 电容器,以最大限度地减少伺服器内部直流电机产生的噪声。请务必连接所有“接地”(外部电源与 Arduino GND 引脚)。
如果伺服系统出现问题并且振动很大,请根据代码的“延迟”进行调整。在接收新命令之前,伺服系统有时间到达某个点是很重要的。同样值得检查一下伺服是数字的还是模拟的,就好像它们在机械上相似,数字的工作频率为 300Hz,而模拟的频率为 50Hz。标准 Arduino 库“Servo.h
" 是为模拟舵机开发的,如有必要,可以进行修改,以便更好地与数字舵机配合使用。
上图为完整电路。
第 5 步: 代码
项目并不复杂,但变数很多。最谨慎的做法是明确定义它们并将注释留在一个唯一的文件中:
ArmDefine.h
该文件还应设置最小、最大和初始伺服角度。本教程中包含的代码,有两组参数,用于我在项目中测试的机械臂(当然只能使用一组常量):
// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87#define midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 #define maxElbw 0 midGrip 100#define midBase 90#define midShou 90#define midElbw 0 */
每种类型的手臂都有一组不同的参数,找到适合自己的手臂很重要。我的建议是,最初电位器(电位器)保持在中点,PWM 输出的映射设置为默认值:Max =255
, Min =0
和 Mid =126
( "#defines
" 以上。然后,开始改变电位器(一个接一个)并在串行监视器(或 LCD)中跟踪手臂正常工作的最小值和最大值应该是什么。这些将是用于测试的最终值设置(在 ArmDefine.h 中更改我的原始值)
.
为了“记录”机器人应该玩的坐标集(或步数),我将使用数据数组:
int GripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // 用于记录任务的位置数组的索引
请注意,我没有保留“存储”位置,并且在“机器人”程序结束时,索引回到零,机器人将等待新序列的记录(程序丢失)。或者,您可以将这些数据数组保存在 Arduino EEPROM 中,例如。这样做,程序将被再次执行,甚至您可能有多个存储的程序。
第 6 步: 程序逻辑
主要块(“循环”)真的很简单:
检查是否使用了执行“程序”(步骤序列)的命令。
- 如果是,请运行它。
- 否则,“程序”是不完整的,仍然必须编写新的步骤。
- 如果定义了“新职位”,请将其添加到程序中。
- 首先,检查从 Android 设备到达串行缓冲区的消息。
- 接下来,验证控制模式是“本地”还是“远程”(默认为本地)。
- 回到开头并再次执行第 1 步。
void loop(){ checkBTcmd();定义本地远程(); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| HIGH command =="runon") { RunProgram (); } else recArmPosition();命令 ="";}
函数 checkBTcmd() 使用来自 BT 模块的单个字符组合一个字符串。这个字符串被传递给变量“command ”.
函数 defineLocalRemote() 考虑变量“command 》 检查是否接收到一个改变模式为远程的命令,反之亦然。报警命令也在这里分析。对于程序逻辑,如果在Android设备中触发了“报警”,则手臂必须转到远程模式。
函数 RunProgram() 执行准备工作,打开/关闭 LED 等,尤其是调用函数:ExecuteTask() .后者是包含步骤序列执行逻辑的函数。该函数增加了“positionIndex " 使用工具将位置数据一一发送到手臂:armPosition(grip, base,肩膀,肘部) .
最后,真正控制舵机并写入“步骤”的函数是 recArmPosition() .根据接收到的 Android 命令,此函数将定义可以通过锅或通过 Android 应用程序的“滑块”的舵机的定位。随着每个位置的变化,此函数使用 armPosition
将坐标发送到舵机 功能(握把、底座、肩部、肘部)。在触发“保存”或“程序”命令时,会读取电位器或滑块的实际位置并相应激活伺服系统。此时,数组的位置索引递增并存储步骤。
为便于理解,所有代码均基于其特定功能。 “设置
", "循环
" 并且上述功能几乎都在文件中:MJRoBot_Arm_Robot_Task_Prgm.ino
更通用的函数如读取 BT 命令:void checkBTcmd() ;声音发生器:空蜂鸣声(int pin,int freq,long ms) 和去抖动:布尔去抖动(int pin) ;存档:General_Functions.ino
一个重要的事实:由于 Arduino 基于 16Mhz 的时钟执行指令,预计控制按钮每秒读取数百甚至数千次,因此制作一个“去抖动”按钮来设置记录步骤很重要.
第四个也是最后一个文件是:Arm_Ctrl_and_Display.ino
在这个文件中是电位计的读数函数:bool readPotenciometers() ;读取 Android 滑块:bool readSliders() ;舵机的放置:void armPosition(int grip,int basee,int肩膀,肘部 int) .文件中包含的其他功能是用于在 LCD 上显示数据、串行监视器、警报等。
该视频显示了通过 Android 应用程序远程编程的机械臂 4DOF“meArm” .
可以在 GITHUB 找到该项目的完整源代码:
https://github.com/Mjrovai/MJRoBot-Programmed-Arm
或在这里:
F49C85FIL8CVX0P.ino FC4OQJNIL8CVX1C.h FBYPQAMIL8CVX1D.ino F2SBAXVIL8CVX1E.ino
第 7 步:结论
一如既往,我希望这个项目可以帮助其他人在激动人心的电子、机器人和物联网世界中找到自己的出路!更多项目请访问我的博客:MJRoBot.org
来自世界南方的问候!我们下个教程见!
谢谢
马塞洛
代码
- 代码片段 #1
- 代码片段#2
- 代码片段 #3
代码片段 #1Arduino
// MeArm 4-DOF#define minGrip 15 #define minBase 0 #define minShou 60 #define minElbw 60 #define maxGrip 45 #define maxBase 170#define maxShou 180 #define maxElbw 150 #define midGrip 30#define midBase 87#定义midShou 138#define midElbw 100/* SS 3-DOF#define minGrip 75 #define minBase 5 #define minShou 5 #define minElbw 0 #define maxGrip 125 #define maxBase 150#define maxShou 155 #define maxElbw 0 #define midGrip 100定义midBase 90#define midShou 90#define midElbw 0 */
代码片段 #2Arduino
int GripPosition[100];int basePosition[100];int shouPosition[100];int elbwPosition[100];int positionIndex =0; // 用于记录任务的位置数组的索引
代码片段 #3Arduino
void loop(){ checkBTcmd();定义本地远程(); execTaskCmd =digitalRead (execTaskPin); if (execTaskCmd ==|| HIGH command =="runon") { RunProgram (); } else recArmPosition();命令 ="";}
Github
https://github.com/Mjrovai/MJRoBot-Programmed-Armhttps://github.com/Mjrovai/MJRoBot-Programmed-Arm示意图
机械臂
https://github.com/Mjrovai/MJRoBot-Programmed-Arm/blob/master/Arm_Robot_Task_Program_Man_BT_16_fev_16/Arm%20Robot%20Diagram.png制造工艺