让我们逐步开发一个控制和编程机械臂的项目,模拟工业机器人的基本功能。
第 1 步:规格
机器人有两个基本功能:
程序:记录三个维度的手臂位置(每个记录是一个“步骤”)
运行:依次执行“程序”中记录的位置。机器人将运行程序,直到使用命令“ABORT”。
主要特征:
该项目可用于控制具有 3 或 4 DOF(“自由度”)的机器人。
机器人可以在“本地”和“远程”模式下控制(最后一个通过 Android 设备)
在程序阶段,用户可以将控制模式从“LOCAL”更改为“REMOTE”,反之亦然。
将通过彩色 LED、2 行 LED 显示屏和声音(蜂鸣器)向用户提供信息。
声音警报也可以远程触发。
第 2 步:项目
上一步的框图显示了将在此项目中使用的“材料清单”。
我选择了 Arduino MEGA,以免担心可用的 Arduino 端口 (I/O) 的数量。例如,UNO 可以正常工作,但应使用端口扩展方法。有几个选项可以在 Internet 上轻松找到,例如 74138 解码器。
关于蓝牙网络,这个项目使用的是 HC-06。
用于“ remote mode”的Android应用程序是使用MIT Appinventor2工具开发的,该工具是基于Android设备的此类应用程序的强大单一平台。
第 3 步:开发
机械臂可以根据它们拥有的“关节”或“自由度”(DOF)的数量进行分类。
“底座”或“腰部”通常可以将手臂转动 180o 或 360o,具体取决于所使用的伺服类型(在此项目中,使用了 180o 伺服)。
“肩”,负责垂直“抬高或降低”手臂。
“肘”将使手臂“向前或向后”。
“爪”或“抓手”通过打开或关闭来“抓取东西”。
第 4 步:电路
上图显示了完整的电路。
伺服电机将用于驱动关节,直接连接到 Arduino。请注意,在底座上使用“步进电机”以获得更大的扭矩和精度并不少见。舵机的正确选择非常重要。
舵机的直流电源应与 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 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; // Index to be used at position array used for recorded tasks
请注意,我没有保留“存储”位置,并且在“机器人”程序结束时,索引回到零,机器人将等待新序列的记录(程序丢失)。或者,您可以将这些数据阵列保存在 Arduino EEPROM 中。这样做程序将被再次执行,甚至您可能拥有多个存储的程序。
第 6 步:程序逻辑
主块(“循环”)非常简单:
检查是否使用了执行“程序”(步骤序列)的命令。
如果是这样,请运行它。
否则,“程序”是不完整的,仍然必须编写新的步骤。
如果定义了“新位置”,请将其添加到程序中。
首先,检查来自 Android 设备的到达串行缓冲区的消息。
接下来,验证控制模式是“本地”还是“远程”(默认为本地)。
回到开头并再次执行步骤 1。
void loop ()
{
checkBTcmd ();
defineLocalRemote () ;
execTaskCmd = digitalRead (execTaskPin);
if (execTaskCmd == || HIGH command == "runon")
{
RunProgram () ;
}
else recArmPosition () ;
command = "";
}
函数checkBTcmd()使用来自 BT 模块的单个字符组装一个字符串。这个字符串被传递给变量“ command ”。
函数defineLocalRemote()考虑变量“ command ”检查是否接收到将模式更改为远程的命令,反之亦然。报警命令也在这里分析。对于程序逻辑,如果在Android设备中触发了“Alarm”,则arm一定要进入Remote模式。
函数RunProgram()执行准备工作,打开/关闭 LED 等,特别是调用函数:ExecuteTask()。后者是包含步骤序列的执行逻辑的函数。该函数使用工具将位置数据发送到手臂的“位置索引”增加: armPosition(grip, base, Shoulder, E肘)。
最后,真正指挥舵机并编写“步骤”的函数是recArmPosition()。根据接收到的 Android 命令,该函数将定义舵机的定位,可以通过罐子,也可以通过 Android 应用程序的“滑块”。随着每个位置的变化,此功能使用功能(握把、底座、肩部、肘部)将坐标发送到伺服系统。armPosition在触发“SAVE”或“PROGRAM”命令时,会读取电位器或滑块的实际位置以及相应的伺服激活。在那一刻,数组的位置索引增加并存储步骤。
为了简化理解,所有的代码都是基于它的特定功能。“ Setup”、“ Loop”和上面描述的函数几乎都在文件:MJRoBot_Arm_Robot_Task_Prgm.ino 中,并可在本文下方找到。
更通用的函数如读取 BT 命令:void checkBTcmd();声音发生器:void beep(int pin,int freq,long ms)和去抖:boolean debounce(int pin);存档:General_Functions.ino
一个重要的事实:由于 Arduino 基于 16Mhz 时钟执行指令,预计控制按钮每秒读取数百甚至数千次,因此制作一个设置记录步骤的“去抖动”按钮很重要。
第四个也是最后一个文件是:Arm_Ctrl_and_Display.ino
在这个文件中是电位器的读取函数:bool readPotenciometers() ; 读取 Android 滑块:bool readSliders() ; 伺服系统的放置:void armPosition (int gripp, int basee, int肩部, 肘部 int)。文件中包含的其他功能是用于 LCD 上的数据显示、串行监视器、警报等。
第 7 步:结论
一如既往的是,我希望这个项目可以帮助其他人在电子、机器人和物联网的激动人心的世界中找到自己的道路!
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- Multisim 14 电路设计与仿真
来源:下载中心
- 开源闭环步进电机控制器(原理图+源代码)
来源:下载中心
- 东南大学电力电子基础
来源:大学堂
- 是德两分钟导师系列课程第一季
来源:大学堂
- 叠加原理:概念及其求解过程
来源:电路图
- 叠加原理:概念及其求解过程
来源:电路图
推荐帖子 最新更新时间:2024-11-13 09:00
- 《了不起的芯片》读后感分享第三篇 浅谈一下
- 最近在学习FPGA,就结合这本书中介绍 芯片工程师 章节的内容浅谈下自己的感受。掌握语法知识、能够读懂时序图是最基本的需求。此外,在仿真过程中遇到各种bug需要有善于发现、解决问题的能力。还有就是对FPGA资源占用的优化,比如前段时间我在调试代码中发现,综合后Vivado中
- luke7电路观察室
- 应急灯PCB设计一
- 这是我用热转印法制作的应急灯灯座,经过验证可以适合做公共母板,接口已经定义和留出,结果很理想,由于是精确建模,所以最后扣合在一起的时候很精准,O(∩_∩)O哈哈~,大家先看图吧 应急灯PCB设计一 ;P 不错,不错唉 由于一些朋友的软件版本打不开这个文档 请so
- solidwantsDIY/开源硬件专区
- 东芝首款HD DVD播放器采用ADI HD音频产品
- lorant移动便携
- 电机和电机控制的简介:无刷直流电机(3)
- 电机和电机控制的简介:无刷直流电机(3) 我上次拆的小风扇上的无刷电机怎么只有两根线撒? 航模电机驱动方案 航模电机驱动方案
- 德州仪器模拟与混合信号
- 中国工程师生存情况大揭密!欢迎揭黑!
- 由于经济环境方面的原因,毫不夸张地说,中国工程师的生存状况在脑力劳动者群体中的表现和体力劳动者群体中的井下矿工极为相象,比如他们都背负着巨大的压力(当然一个是精神压力一个肉体的压力),都经常加班工作。而且也是经常在某个重大恶性事件暴光后才为他人所注意。有句话形容研发工程师是“起的
- shihuashishuo测试/测量
- LPC1500体验—从零开始(I/O操作-点亮LED)
- 本来以为有库函数和例程玩LPC1500的板子可以事半功倍的,可是折腾了那么久还是没什么进展,主要的原因是不管是直接面对 寄存器还是直接调用库函数对于我这个初学者来说难度不是一般的大,哪怕手上有历程,可是不懂怎么用这是个问题。 看来偷懒是不行的了,
- dj狂人NXP MCU
- 寻找KT0913L-D4的C语言驱动
- SAM D21 Xplained Pro Evaluation Kit试用心得
- avr-gcc堆栈怎么手工做个堆栈
- 如何将wince应用程序下载到wince平台
- 大功率逆变电源的设计制作
- 下载 《ADI 网络电机控制解决方案》抽现金红包,前30名100%有礼!(已结束)
- 仪器仪表
- 电阻式的电路,以及恒流IC电路的发热区别
- 有奖直播【基于TI Sitara™AM5708的工业派开源平台介绍】颁奖啦~
- 蓝牙倒F型天线的设计与测量
- 手机烧屏了,真的能通过软件升级修复吗?
- realview debugger + multi-ice 调试Linuxn内核
- 初学者不能错过的【电子工程师必备基础知识】
- 学习NIOS 2 的问题
- 求助,使用VHDL编写的数字输入输出程序
- 再请教一下ADC问题。
- 【学习心得】太阳能微逆变方案观后感吧
- 【问题反馈】安路TangDynasty ChipWatcher删除多条多余的网络整个程序会闪退
- 《signaltap的使用技巧》分享--来自明德扬科教
- 保安队HMI开发板-STM32H7S7(BOOT&FLM)
- NSV45020JZ 恒流 LED 灯串的典型应用
- AN56778, PowerPSoC - 具有集成 LED 驱动器的 MPPT 太阳能充电器
- TS4990,低压音频功率放大器评估板
- EVAL-AD7171EBZ,用于仪表的 AD7171、16 位、125SPS ADC 的评估板
- LT8303ES5 6 至 80 Vin、5Vout 隔离反激式转换器的典型应用电路
- NCP630G 3A快速线性稳压器的典型应用
- LTC1747、12 位、80Msps 低噪声模数转换器的典型应用
- 2.5V 输出 ADR391B 微功耗、低噪声精密电压基准的典型应用
- 使用 Analog Devices 的 LTC4302-2CMS 的参考设计
- 用于双向可控硅 Crowbar 的 NCP432B 可编程精密基准的典型应用