用Arduino驱动开源MOVEO大型机械手臂

网友投稿 2019-10-21 13:53

在开始介绍手臂控制前,先认识一下 MOVEO 手臂的动力来源「步进马达」。由于传统马达,无法得知马达转动的位置状况,因此无法应用在机械手臂上;步进马达顾名思义,便是将传统马达改为一步步前进的马达,每次动作只会转动一点角度(通常为 1.8 度),但由于它本身没有回馈讯号,所以如果过载(负载太大),就会造成步进马达失步,也就是会与我们预期的位置不一样,因此它并非最常用在机械手臂的马达,会将它应用在 MOVEO 是由于它符合需求且价格实惠。

https://cdn.china-scratch.com/timg/191023/1353493254-0.jpg

步进马达内部构造

步进马达驱动器

通常使用步进马达都会搭配使用步进马达驱动器(Driver),这么做不只是因为懒得将两相线圈交替输出,以达到一步一步动作,而是大部分的驱动器都能将这一个步骤再细分为多个微步。以常见的 A4988 步进马达驱动 IC 为例,就能将每 1 步再细分成 16 个微步,以达到更高的分辨率,虽然加上驱动器不一定会更精准,但能使运作上更顺畅;除此之外使用驱动器的优点还有很多,像是输出电流、节省布线等。详细请看下图步进马达驱动器运作原理。

https://cdn.china-scratch.com/timg/191023/13534953W-1.jpg

https://cdn.china-scratch.com/timg/191023/135350F00-2.jpg

步进马达驱动器 TB6560 的接线图(图片来源:ROBOKITS INDIA)

在开始控制马达前,要注意运作电流(Running Current),如下图。依照笔者的实务经验,可以将 Running Current 设定为一颗马达额定电流的 80%为原则,以调整适当的电流。虽然电流越大可以让马达产生越大的扭力,但同时也容易造成马达过热,若不慎超过马达额定,就可能会造成马达不可逆的损伤。

https://cdn.china-scratch.com/timg/191023/1353503926-3.jpg

单颗步进马达控制

不同马达驱动器的控制方式不一定相同,但几乎都大同小异,不过使用前建议还是要看一下使用手册。以 MOVEO 手臂所建议使用的 TB6560 而言,每只接脚的功能如下图:

https://cdn.china-scratch.com/timg/191023/13535060M-4.jpg

看不懂英文也没关系,可以直接试试程序。我们使用的主板是 Arduino Mega2560,首先必须先到 Arduino 官网下载新的 IDE(如下图所示),点选你的计算机系统,它便会引导你安装,以 Windows 来说,点选 Windows Installer 这个选项,即可下载安装档进行安装。

https://cdn.china-scratch.com/timg/191023/1353515340-5.jpg

完成后开启 Arduino IDE 出现如下图的窗口就代表安装成功了。

https://cdn.china-scratch.com/timg/191023/13535114V-6.jpg

Arduino IDE 安装完成后,请选择我们的开发版Mega2560,输入下图的程序代码(单一马达控制),点选上传就可以看到 X 轴来回转动了喔!(注意:在步进马达激磁前,记得将手臂复归到原点的位置,让每一轴箭头都对齐即可,手臂便会呈现直立一直线的状态。)

https://cdn.china-scratch.com/timg/191023/1353511200-7.jpg

了解运作的基础后,我们来介绍一个专门拿来做步进马达控制的链接库,叫做 AccelStepper:library for Arduino,它整合了我们做马达控制会用到的功能,像是加速度、定位、多颗同时控制等,如下图程序(单一马达 acc 控制),一样让 X 轴来回转动。

https://www.airspayce.com/mikem/arduino/AccelStepper/

https://cdn.china-scratch.com/timg/191023/1353511N2-8.jpg

多颗步进马达控制

用 AccelStepper 来做多颗步进马达控制,会很轻松,它有另一个链接库叫 MultiStepper,是运用 AccelStepper 延伸拿来做多颗步进马达控制的,直接输入下图程序试试看吧!

https://www.airspayce.com/mikem/arduino/AccelStepper/classMultiStepper.html

https://cdn.china-scratch.com/timg/191023/1353524N0-9.jpg

https://cdn.china-scratch.com/timg/191023/1353521036-10.jpg

Main.h中的设定组态参考

https://cdn.china-scratch.com/timg/191023/1353521S0-11.jpg

Main.h中的设定组态参考

https://cdn.china-scratch.com/timg/191023/1353523306-12.jpg

RobotControl_acc.ino

输入完程序打开监控窗口(右上角类似放大镜的按钮),会看到下图接口(监控窗口),用串行传输的方式与微处理机做沟通,调整窗口下发输入设定及通讯协议,与下图设定一样后,试着输入"30 0 0 0 0"如下图(输入位置),就可以让手臂X轴转动至30度角,到达指定位置后会在出现"======MoveFinish====="的字样如下图(移动完成),告诉我们手臂已经到达指令位置,可以再输入下一个位置以此类推来控制每一轴。

https://cdn.china-scratch.com/timg/191023/13535242W-13.jpg

https://cdn.china-scratch.com/timg/191023/1353522129-14.jpg

输入位置

https://cdn.china-scratch.com/timg/191023/1353533336-15.jpg

移动完成

手臂控制

当然每次都要打数字来移动实在很麻烦,所以可以自行撰写一个GUI的接口来帮助我们试机,以python来说,可以使用pyserial这个链接库,来代替Arduino IDE的监控窗口与微处理机沟通的角色,

https://pythonhosted.org/pyserial/

设计出下图的接口化程序,也可以拿国外类似程序来修改如图(AsgardGUI)

https://cdn.china-scratch.com/timg/191023/135353I11-16.jpg

https://cdn.china-scratch.com/timg/191023/1353534E5-17.jpg

就这样调整到我们要的位置,自动执行就可以完成手臂控制了,细心的读者可能会发现,为甚么在做手臂控制都用角度来操作呢?除了比较直观之外,也是为了方便坐标的运算,在做比较复杂的控制时就会用到,相关控制原理如下图。

https://cdn.china-scratch.com/timg/191023/1353544215-18.jpg

小结

进行这此就完成我们的手臂控制啦!Moveo官方也有自己的手臂控制的程序,地址在Github repo中的FIRMWARE文件夹。

https://github.com/BCN3D/BCN3D-Moveo

是由Marlin(经常用于3DP的韧体)做修改完成的,但还有许多参数需要适当的修改才能运用,如果不是很熟悉可能会要花更多的时间。

https://github.com/MarlinFirmware/Marlin

此外也有一些第三方韧体可以做选择,如grbl-Mega-5X相对在设定上有简单许多,

https://github.com/fra589/grbl-Mega-5X

或是对ROS有兴趣的读者也可以尝试Moveo with ROS来做研究。

https://www.jesseweisberg.com/moveo-with-ros

希望大家可以一起享受到机械手臂的乐趣,并且玩出自己的心得!

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com