以六足机器人结构套件为基础_第1页
以六足机器人结构套件为基础_第2页
以六足机器人结构套件为基础_第3页
以六足机器人结构套件为基础_第4页
以六足机器人结构套件为基础_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要以六足机器人结构套件为基础,搭建移动测控平台,包括设计总体方案和各个模块实现方案,设计和制作伺服电机(即舵机)主控制板和传感器电路板,设计机器人行走方案并编程实现,实现超声波避障。采用细化的八步行走算法来实现行走控制,采用轴向舵机序号确定其他舵机运动方式和次序的方法进行行走方向的控制,这样完成了对 18 个舵机的控制任务,使得机器人能够比较协调、流畅地行走,并且可以控制其任意的行进方向。主控制板能够基本满足需要,但还需进一步改善其稳定性和可靠性,并增加功能组件如引导程序下载接口以及键盘等交互器件。进一步研究指南针和超声波模块在移动测控平台上有效利用,并开发图像处理及远程信息传输等技术,使六

2、足野外机器人测控平台有更广阔的应用空间。可应用于户外环境参数监测、特殊任务执行、家庭助理等领域。关键词:舵机 msp430 单片机 行走算法 超声波传感器AbstractSix feet robot is based on special robotic configuration including 18 servo-electro motors. My task is driving it to move, for I must first design the PCB, weld the PCB when it comes back, connect wires to the PCB a

3、nd programme. The robot at last moves smoothly, glidingly, in each direction I want it to, of its six. Before programming, arithmetic of eight-step is used to push the robot to go forward in one fixed direction. To make it generalization, I conclude the very arithmetic by which movements of every se

4、rvo-electromotor can be computed if the number of the direction servo-electromotor is given. The next task is that the robot can move in the direction which is judged as the best one after checking the environment by ultrasonic. Having a pair of eyes, the robot can see where the block is and where i

5、t can march over. The main controlling board is all right but it can be better if more steady and reliable, and if more functional parts is added as keyboards and the interface with Boot Strap Loader. It deserves to do further research at the moving measure-control plat of six feet robot on the use

6、of sensors as ultrasonic, compass modules. It is useful to develop the technologies of image management and remote info-transmission at the plat, too. The measure-control plat of six feet robot is widely used in measuring weather, doing special tasks, and as an assistant in house. Key word: servo-el

7、ectromotor msp430 stepped arithmetic ultrasonic sensor目录目录绪论绪论 .1 1第一章第一章机械结构改装及设计机械结构改装及设计.3 31.1原机械基础上的改装 .31.2设计加工的机械部分 .5第二章第二章电路板设计、制作与调试电路板设计、制作与调试.7 72.1总体设计 .72.2主板设计 .82.3传感器板设计 .102.4电机稳压电路设计 .142.5安装调试过程中的问题及解决 .16第三章第三章行走算法及程序细节行走算法及程序细节.19193.1编号、建表 .193.2行走动作算法及动作细化 .203.3PPM 产生程序及其他.2

8、9第四章第四章 传感器的使用传感器的使用 .37374.1 超声波传感器的试验.374.2系统流程 .39第五章第五章 总结总结 .41415.1未完成的工作 .415.2六足机器人应用前景探讨 .41结束语结束语 .4242致谢致谢 .4343参考文献参考文献 .4545绪论搭建六足野外机器人测控平台-这就是本人毕设的工作要求。首先要做的控制 18 个舵机,使机器人能够按照要求运动。在这个问题的解决上,可以说是完全想象的结果-想象着怎样安排细化动作的步骤,怎样利用摩擦力推动了机器人前进,就这样形成了六足机器人的八步行走算法。让机器人改变轴向从而改变前进方向的推导算法,是有价值的尝试,其结果也

9、是令人欣慰的。当然仅仅运动起来并不能成为一个测控平台,机器人必须具备对环境的感知和适应性。选用了超声波传感器和指南针传感器分别作为感知周边障碍和行进方向的检测器件。麻省理工学院的人工智能实验室的移动机器人小组做着和本人同类型的工作,但是他们的研究方法却和本人的大相径庭。他们对昆虫发生了浓厚的兴趣,他们认为这些弱小的动物群体在复杂而又危险的环境中能够得以生存是一个伟大的奇迹,而昆虫的大脑在世界上却是最小的,然而最小的大脑却让这些小虫子有如此大的能力,以至于让我们认为最先进的机器人都无地自容。他们联合其他的科研工作者提出了基于行为的机器人学。这一学科不但在学术界影响重大,而且被广泛应用于各种领域,

10、包括火星探测。研究方法很大程度上是客观条件所决定的。这些研究人员有足够的时间和财力来尝试验证,而本人的毕业设计时间只有区区两、三月,还要做电路设计、供电设计以及加工绝缘层、支架这样的琐事,而毕业经费也是几百元而已。值得欣慰的是想象力终究绽放出了花朵,机器人前进的姿态竟和海龟游水一样流畅,如果把其中的两条腿当作海龟的头部和尾部。还有一些可贵的设计思想,如用伺服电机带动传感器使传感器电路设计难度及安装难度大大降低。第一章 机械结构改装及设计1.1原机械基础上的改装 机器人机械骨架最初只有结构组件、电机(伺服电机)以及电机引线,硬件电路都是后来加上去的,软件也是自己编写的。机器人骨架做的相当完美,六

11、个方向轴中心对称,钢板质坚而韧,整个机体能承载比较大的重量。仔细检查,发现电机的安装精度不太理想,这势必给系统精度带来很大影响。此时,首先要做的是重新安装腿电机,因为其两端极限位置及中心位置比较容易标定,而臂电机和脚电机就不太容易重新安装。如图 1.1 所示腿电机的位置。 图 1.1 电机命名分类之所以给电机命名分类,主要是方便写行走步骤,详细内容请参考第三章。调整电机的方法是:先卸掉腿电机轴心固定螺钉(见图 1.2) ,然后用十字安装架调整电机轴心角度(见图 1.3) ,可利用直角尺、铅笔等工具保证精度。最后取掉十字安装架、固定好图 2.2 中所示螺钉。臂电机和脚电机的安装误差建议由软件来修

12、正。脚电机上的引线比较短,这里进行了加长,用排线增加长度,热缩管连接固定处。图 1.4 所示的上腿关节,白色塑料柱即为关节处,固定此处的螺钉松紧要合适,如果太松腿就会抖动得厉害,如果太紧,迈腿就会很艰难,迈腿的程度与电机输出量不符。图 1.2 调整电机(1)图 1.3 调整电机(2)图 1.4 上腿关节1.2设计加工的机械部分图 1.5 机械加工的部分如上图所示,机械加工的部分有:(1)在钢板的上面加上绝缘隔板可以防止尖尖的焊点划破钢板漆层造成短路;(2)铜柱用来支撑主控板和传感器支架,构成电路主体骨架。(3)传感器支架安装传感器电机,传感器随电机转动 180,前后各置一个超声波模块,可以检查

13、到周围 360范围情况。如图 1.6。图 1.6 传感器安装图第二章 电路板设计、制作与调试2.1总体设计采用双处理器,双层结构。下面图 2.1 为其总体结构图。图 2.1 六足机器人整体结构设计图下面对设计的主要特点作些说明,更详细的阐述参见以后的章节。(1)主控制板和传感器板分别有独立的控制器(用了 MSP430F149),这样的好处是传感器模块化,更容易移植到其他的系统中。使用 MSP430F149 的初衷是这款单片机有 10 个捕获/比较寄存器(8 个 PWM 输出) ,更容易对电机进行控制,并且有两个串行通讯端口,为以后与电脑连接做准备。(2)传感器采用超声波和指南针模块,其中,超声

14、波可以用来蔽障,而指南针采集到的方位数据不仅为机器人行走提供方向和目标信息,还能形成总体模拟闭环控制,对行走的性能,比如直线性有直接的益处。(3)主控制板和传感器板之间使用串行线连接通讯。两根通讯线(一收一发)加上电源线和地线,共四根线。(4)伺服电机驱动采用 PPM(脉冲比例调制)控制。控制端口直接由单片机端口引出。(5)电机供电为 6V 稳压供电,而 18 个伺服电机启动的瞬间所需电流将近3A,因此使用可以提供大电流的 LM2596 设计稳压电路。设计既可单电源供电,又可采用双电源。使用 18 节 1300mah 镍氢电池,6 串 3 并,达到:电压 7.2V,可提供最大 23.4W 功率

15、输出,并使用稳压电路至 6v 供给舵机,后使用 LM1117-33稳压至 3.3v 供给控制器;电源处抽头给传感器电路(稳至 5v)或者单独给主处理器及传感器电路供电。 2.2主板设计 主控制板在设计之初,就将通用性作为一个重要的目标考虑。六足机器人的主控板不仅可以提供六足的电机控制,还可以成为四足机器人、五自由度机械手的控制主板。MSP430F149 定时器的八个 PWM 输出对于六足机器人来说没有用处,但是对于使用 PPM 控制口较少的四足机器人(需要八个)和五自由度机械手(需要五个)来说可以直接利用定时器的这种功能,简化编程工作。下面图 2.2 为主控制器原理图。从图中可以看出设计的一些

16、特点:(1)PWM 输出口为:P1 口五个 P1.0-P1.4;P4 口 8 个 P4.0-P4.7;P6 口五个 P6.3-P6.7;P5 口一个 P5.0.(2)P5.5 有个拨动开关,增强了人机交互性,但是这个设计还可以改善,可以增加更多的拨动开关。(3)P5.4 口加了一个 LED,可以作为指示信号用。(4)所有 I/O 口(包括 PWM 输出口和没有用到的口)都接出来,备预留口。另外下图中没显示的特点有:VCC、VCC_33、GND 都引出足够的预留口,以供扩展电路功能用。(5)该开发板也可以作为通用单片机开发板用。图 2.2 主控制器接口图 下面看一下主板上供电设计,参考图 2.3

17、。(1)电机可以和主板控制器共电源,也可以单独供电,通过 J29 的通断可以决定。单独供电可以避免处理器受到众多电机形成的躁声干扰,推荐使用。不管采用哪种方式,对电机供电时,稳压到 6V 比较妥当。这个 6V 稳压电路没有设计到主控制板上,而是作为一个独立的模块设计出来的,下面将在 3.4 节详细说明。(2)主处理器和电机有没有上电,可以看发光二极管 D1、D3 有没有点亮。(3)对噪声的处理,加滤波器件。电源噪声会给电路造成危害,因此在各级电源的两端加 10uf 电容以滤波(图中 C1、C2、C7) ;电机干扰要避免,在电机电源线间接 0.1u 的电容可以有效去除(图中 C6、C8) ,并且

18、避免机器人中出现不接地的金属件,否则会充当天线的角色。 图 2.3 电源供电设计2.3传感器板设计六足机器人的传感器设计有其独特的地方,主要表现在它的形状为圆形,在设计之初,主要考虑的问题是:(1) 用什么传感器比较好? (2) 用几个传感器?如何分布?(3) 传感器结构是什么样比较合理?针对这几个问题,并考虑到市场情况和经济情况,主要有两种解决方案:方案一:采用以前惯用的光电(红外)传感器,这也是最初想到的方案。有发射管和接收管分开和一体的两种,但发射与接受一体的红外传感器对短距离测量效果佳(25mm 左右) ,不适合俨然庞然大物的六足机器人。采用发射和接收分开的红外传感器。这种传感器比较便

19、宜,红外发射管:0.5 元/个(优质 1.5 元/个) ;红外接收管:3.5-4.0 元/个。但是测量距离仍然比较近,用 38khz 波调制的方法,距离在 40cm 内,所以要尽量安装在钢板架边缘的位置,数量至少为 6个(只需要顶层水平面上的检测) ,安装在各小组电机的轴线上,为了提高测量精度,可以增加 6 个,在每两个相邻小组的中心线上。这么多传感器分开在蛮大面积的边缘,必须至少有 6 对收发传感器,6 个传感器小电路,连线的纷杂可想而知,连线多也会增加电路的不可靠性。方案二:采用超声波测距模块。该模块可以提供从 3cm-1.8m 精确的距离测量。模块是随机器人机件一起买来,价格较贵(百元左

20、右) ,而且现存量不多。在不可能“以数量求质量”的情形下,必须另辟蹊径。如果使用电机使其转动角度采集数据,情况会怎样?这个设想很巧妙,以前在做传感器电路的时候没有这样设计过,值得一试。用步进电机还是伺服电机?步进电机可以转过 360 度角,使用一个超声波模块即可。但是考察一下市场及技术资料,步进电机至少需要12v 供电电压,因整体供电设计在 7.2-9.6v 之间,必须设计升压电路(实际上也试验了这块电路) 。已经确定方案中必定存在 6v 稳压模块,过多的电压转换消耗系统功率,必然造成效率低下。而用伺服电机可以避免这个麻烦,而且其控制可以直接用主控制板上的伺服电机接口,驱动电路不用另外做,所以

21、伺服电机(舵机)是比较理想的选择。 但是绝对位置量输出的舵机只能转动 180 度,要想测得一周的情况需要 2 个超声波模块。不用再犹豫,第二个方案值得实现。 图 2.4超声波模块有四条引线,分别为:VCC:接 5V 直流电源。GND:接地。SIG2:触发脉冲。SIG1:计时脉冲。控制方法是:从 SIG2 输入触发脉冲(高电平的典型值为 10us)后,模块自动发射 5 个 40khz 的超声波,紧接着模块自动把 SIG1 置高电平,直到收到回声后才把 SIG1 置低,如果超时,模块自动复位。通过计算这个 SIG1 的脉冲宽度就可以很容易计算出和目标的距离。另外传感器设计中用到了指南针模块,目的是

22、通过方位确定达到系统模拟闭环的效果,并且可以为机器人日后完成更复杂的任务做准备。相对于超声波模块控制简单方便,指南针模块似乎更复杂一些。下图 3.5 为指南针模块的引脚和原理。指南针传感器通过地磁场的方向来确定自身的方向,内部设置两个轴:X 轴和 Y 轴,通过计算 X 轴和 Y 轴上的值来计算与地磁场之间的偏角。图 2.5 指南针模块引脚和原理由图 3.1 的总体框图,可知传感器电路作为一个单独的构件,拥有自己的处理器。这样在其供电设计中就需要两路稳压,一路稳至 5v 给传感器模块,另一路稳压至 3.3v 给 430 单片机。如下图所示,传感器电路分为稳压部分、单片机、传感器接口部分、JTAG

23、 及串口通讯四个部分。这个设计有两个主要的弊端:(1)指南针模块供电应为 5v,而这里给了 3.3v。同样指南针模块的高电平应为 5v 左右,而这里达不到。(2)没有引出备用引脚,单片机资源浪费。图 2.6 传感器电路图对于第二个弊端,由图 3.6 就很容易看出来,而对于第二个弊端,下面详细探讨一下,并找出了解决方案。下面为指南针模块 HM55B 的技术资料,而开始设计时并没有考虑到这一点。表 2.1 指南针模块技术资料解决的办法是:电源改接 5V,输入信号三极管升压(下图) ,输出信号分压进单片机。图 2.7 电平转换2.4电机稳压电路设计LM2596-ADJ 用来稳压到 6V,给伺服电机供

24、电,同时也是给主控板供电。之所以选用这款芯片,主要是因为它能承载较大电流负载(3A) ,满足 18 个伺服电机工作的需要。LM2596 还有其他型号的片子,可以稳压到 3.3V、5V、12V 等,而LM2596-ADJ 可以通过调节两个电阻的比值来达到电压稳至某值的目的。图 2.8 稳压芯片 LM2596-ADJ 资料图 2.9 2596-6V 电路实现2596 的输出电压 Vout=Vref*(1+R2/R1)这里 Vref=1.23V,R1=1K,只要将 R2 调到 3.88K,就能使输出电压 Vout=6V。需要注意的问题:(1)肖特级管 D1 的选取,一定要选取承载电流较大的,市场上

25、5825 很难买到,可以用 5822 来代替,一般不要用 5819。(2)LM2596-ADJ 选用直插封装,而不用贴片,为的是容易散热,并且必须在 2596-ADJ 后面安装散热片。(3)前置电容 C1-470uF,后置电容 C2-220uF 均用电解电容,额定电压 50V以上。(4)电感 L1 的取值认真参考 LM2596 用户手册,实验中 33uH-68uH 表现都不错。一定要买额定电流 3A 的产品。2.5安装调试过程中的问题及解决问题一:主控制板上的 LM1117-33 的 1-VIN、3-GND 引脚颠倒。电源部分应该是焊板子的第一步,在检查出来这部分是否正确的时候,最好不要焊其他

26、元件。而在开始焊上这部分后加电检查时,发现 2 脚 VOUT 没有电压输出。然后检查与各个引脚连接的元件,发现 1117 的 1、3 引脚放置是反的。解决方案:焊接 LM1117-33 时字朝下反焊。LM1117 输出 3.3V 电压,正常。问题二:主控制板上 JTAG 上 1-TDO、3-TDI 颠倒,下不了程序。主控制板焊好之后连上下载器从电脑上下载简单的实验程序,却下不了。显示信息为找不到可下载器件,分析原因可能是 JTAG 下载器(也是自己焊的)、连接线或者主板上 JTAG接口的问题。对照电路图逐一检查,发现是主控制板上 JTAG 上 1-TDO、3-TDI 颠倒。解决方案:将下载线

27、1、3 线割开反过来连接。问题三:单片机下载熔丝烧断,不能再下程序。JTAG 和下载线都是好的,单片机突然不能下程序了,提示语是熔丝烧断!而且这样的事情竟然在小组内六足机器人和四足机器人的主控制板上均发生了两次,也就是烧掉了四片 149!熔丝烧断的 149 虽然不能下载程序,但是片内的程序还可以让机器人按照设定运动。为什么会烧,至今未找到原因。解决方案:第一次烧掉片子时,将片子用热风吹下来重新焊上新片子。当同样的事第二次发生在四足机器人上时(后来我的第二片也烧了) ,搭档不敢再吹下片子,因为电路板是在西安本地做的,工艺水平不允许反复吹焊盘。寻找其他的解决方案,得知有一种下载器-Boot Str

28、ap Loader,是 JTAG 不能下载时的弥补方法。搭档立即询问利尔达杭州总部技术人员,并马上到中工电子市场利尔达售货点买回产品。这种下载器使用串口,只要简单地引出几条线接上,软件也很容易掌握。 为什么 149 那么容易被烧?是 149 的原因还是主控制板的原因?有人认为是单片机引脚与舵机驱动口直接连接造成大电流回流损伤单片机,建议将单片机引脚与舵机驱动口之间加上一个合适阻值的电阻,以后重新制版时可以考虑。还有单片机选型时可以换其他型号,如 MSP430F13X。问题四:该不该将板子直接接触上了绝缘漆的金属?开始连接电机试验时,没有加绝缘层就直接把焊点林立的电路板放到机器人结构件上,这是喷

29、过漆的钢板,放上去之前量了一下导电性,确认了绝缘之后就毫无顾忌地放上去了。直到第一片 149 烧掉之后,分析可能是尖尖的焊点划破薄薄的绝缘漆引起部分短路造成的。然后就立即找绝缘材料,一行三人冒雨到边家村建材市场找到装潢用的双层塑料板,回到实验室立即锯、磨、钻孔,绝缘隔板出来了,后来铜柱也加上了,不过还是没有阻止第二片 149 继续毁灭。那么绝缘板加的是不是多余的?笔者认为绝缘板加上绝不是多余,如果没有绝缘板,焊点划破绝缘漆引起短路是很有可能的,防范还是必要的。第三章 行走算法及程序细节3.1编号、建表要把 18 个电机管理得井井有条并不是简单的事,首先要做的就是给每个电机编个号(取个名字) ,

30、这样就不用反复查找线的源头,也方便建表及在编程过程中随时查表对照。下图为 18 个电机编号:图 3.1 电机编号由上图,将电机分为 6 个小组,编号是从 0 到 5,每一小组电机包括实现不同作用的三个电机。根据电机的作用不同,将电机分为下面三种:负责水平面上方向控制的电机:臂电机 有 1A、4A、1B、4B、1C、4C;负责上下动作的电机:腿电机 有 2A、5A、2B、5B、2C、5C;负责与地面摩擦的电机:脚电机 有 3A、6A、3B、6B、3C、6C。再根据每根线连的具体端口,就得到了下面的表:P4.0-6A-13P4.1-1C-4P4.2-4B-3P4.3-2C-10P4.4-5B-9P

31、4.5-3C-16P4.6-6B-15P4.7-6C-17P1.0-2B-8P1.1-4C-5P1.2-4A-1P1.3-1A-0P1.4-1B-2P6.3-3A-12P6.4-3B-14P6.5-5C-11P6.6-5A-7P6.7-2A-6表 3.1 端口-编号对应表3.2行走动作算法及动作细化必须分工合作,3 只腿脱离地面运动的时候必须有三只腿支撑地面。这样将6 个小组又组合成两大组,相隔的三个为一组。这样编号为 0、2、4 的为一组,1、3、5 为另一组。当将第一组抬起时,第二组必须支撑地面;抬起的第一组臂和脚向前运动;第一组放下接触地面后电机恢复原来的位置,这样就产生了可以推动机器人

32、前进的摩擦力;第一组放下时,第二组抬起来动作。这就是设计动作时最初的想法最初动作简化得到的五步法很粗陋,动作也不协调,但是它对于动作的形成有直接的作用。五步法的步骤为:第一步:抬第一组腿和脚;第二步:放第一组腿,抬第二组腿和脚;第三步:蹬第一组脚;第四步:放第二组腿;第五步:蹬第二组脚。可以看出,这里没有加臂电机的动作,放第一组腿和抬第二组腿在一个动作里,必然造成动作的僵硬。但是这些都没有关系,只要验证这个思路是正确的,机器人能向前挪动,哪怕一点点,就算是成功了。但是结果出来却不尽如人意,机器人只是在原地扭动,丝毫前进不了。为什么呢?仔细看动作和脚的形态,发现了一个似乎幼稚的问题:机器人每组的

33、三只脚与地面之间的摩擦力合力为零!因为其动作关于圆中心对称。这个案例在以后的设计中时刻提醒我:一定要注意细节,每个电机动作的细微之处与其他电机或许是不同的。修改了动作细节之后,按照预想的样子,机器人爬起来了,动作笨拙,但是它的确在前进。接下来要做的就是更加细化动作,使机器人的运动更加协调连贯。这样就形成了八步法,加上了臂电机的运动。下面具体讲一下八步法的实现,结合程序中的一些定义。假设初始状态时电机均处于中心位置。确定一个轴向,比如以第 4 小组为轴向。以下是八步法的动作具体步骤:第一步:抬第一组腿。2C 前腿上抬至某处- Terminal_UP_2。2B、2A 后腿上抬至某处- Termin

34、al_UP_2。 第二步:抬第一组脚,并旋转第一组臂。3C 前脚上抬至某处- Terminal_UP_3。3B、3A 后脚反方向抬至某处- Terminal_DW_3。1B (处于轴向左边)顺时针旋转至某处- Terminal_CLK_1。1A (处于轴向右边)逆时针旋转至某处- Terminal_ATCLK_1。 第三步:放下第一组腿。2C 前腿回到中心位置- Center_Position_2。2B、2A 后腿回到中心位置- Center_Position_2。 第四步:抬第二组腿5C、5B、5A 上抬至某处- Terminal_UP_2。 第五步:抬第二组脚,并旋转第二组臂。6B、6C

35、抬起至某处- Terminal_UP_3。6A 反方向抬起至某处- Terminal_DW_3。4B (处于轴向左边)顺时针旋转至某处- Terminal_CLK_1。4C (处于轴向右边)逆时针旋转至某处- Terminal_ATCLK_1。 第六步:蹬第一组脚,并旋转第一组臂回原位。3C 前脚向前扒地-Center_Position_3。3B、3A 后脚向后蹬地-Center_Position_3。1B (处于轴向左边)逆时针旋转回初始位置-Center_Position_1。1A (处于轴向右边)顺时针旋转回初始位置-Center_Position_1。 第七步:放第二组腿。5C、5B、

36、5A 回到初始位置- Center_Position_2。第八步:蹬二组脚,并旋转第二组臂回原位。6B、6C 前脚向前扒地- Center_Position_3。6A 后脚向后蹬地- Center_Position_3。4B (处于轴向左边)逆时针旋转回原位- Center_Position_1。4C (处于轴向右边)顺时针旋转回原位- Center_Position_1。 这里的有关变量的定义为:#define Center_Position_1 308 /臂电机的中心位置量。#define Center_Position_2 300 /腿电机的中心位置量。#define Center_Po

37、sition_3 320 /脚电机的中心位置量。#define Step_1 35 /臂电机转动的偏角。#define Step_2 130 /腿电机转动的偏角。#define Step_3 50 /脚电机转动的偏角。#define Terminal_UP_3 Center_Position_3 + Step_3 /脚电机上抬的终点量。#define Terminal_DW_3 Center_Position_3 - Step_3 /脚电机下置的终点量。#define Terminal_UP_2 Center_Position_2 - Step_2 /腿电机上抬的终点量(常用) 。#defin

38、e Terminal_UU_2 Center_Position_2 + Step_2 /腿电机上抬的终点量(不常用) 。#define Terminal_ATCLK_1 Center_Position_1 + Step_1 /臂电机逆时针转动的终点量。#define Terminal_CLK_1 Center_Position_1 - Step_1 /臂电机顺时针转动的终点量。 显然是把这些量作为全局变量在主函数的开始预定义。同样还有对应舵机舵盘在个位置的值,定义一个数组 PWM_Duty18来完成。Unsigned int PWM_Duty18 = Center_Position_1, Ce

39、nter_Position_1, Center_Position_1, Center_Position_1, Center_Position_1, Center_Position_1, Center_Position_2, Center_Position_2, Center_Position_2, Center_Position_2, Center_Position_2, Center_Position_2, Center_Position_3, Center_Position_3, Center_Position_3, Center_Position_3, Center_Position_3

40、, Center_Position_3;以上定义的共同特点是将 18 个电机看作 3 种电机(臂、腿、脚)而对于同样的如臂电机不加区分。好处是方便编程,但是由于安装等问题,即使同样作用的电机也会有差异性,这种差异性如果在软件上来修正是比较恰当的,效果也会更好。留给日后的师弟师妹们来做。这样编程出来,前进的动作蛮完美。然后就想到怎么使机器人按任意轴向前进,也就是怎样运用归纳法得出一般性的算法。定义出下面几个变量,由 Mode的值来计算其他变量的值。Mode,Mode_couple,pwm_0,pwm_1,pwm_2,pwm_3,pwm_4,pwm_5,pwm_6,pwm_7,pwm_8,pwm_

41、9, pwm_10,pwm_11,pwm_12,pwm_13,pwm_14,pwm_15。在上面的以第 4 小组为轴向的例子中,看看怎样用变量来代替原来确定的电机(由编号来表示) 。Mode=4, Mode_couple 是与第四小组沿直径关于中心对称的小组编号,参见图3.1 可知是第一小组,所以 Mode_couple1。pwm_0-2Cpwm_1-2Bpwm_2-2Apwm_3-3Cpwm_4-3Bpwm_5-3Apwm_6-1Bpwm_7-1Apwm_8-5Apwm_9-5Bpwm_10-5Cpwm_11-6Apwm_12-6Bpwm_13-6Cpwm_14-4Bpwm_15-4C表 3

42、.2 一般性变量代替表 然后要做的事就是根据 Mode 的值计算出这些变量的值。程序中的Compute_pwmN()函数就是完成这项任务的函数。void Compute_pwmN(void) pwm_0 = Mode + 6; pwm_3 = Mode + 12; if(Mode 3) pwm_1 = pwm_0 - 4; pwm_2 = pwm_0 - 2; pwm_4 = pwm_3 - 4; pwm_5 = pwm_3 - 2; pwm_6 = Mode - 4; /保证 pwm_6 在轴向左边 pwm_7 = Mode - 2; /保证 pwm_7 在轴向右边 else pwm_1 =

43、 pwm_0 + 2; pwm_2 = pwm_0 - 2; pwm_4 = pwm_3 + 2; pwm_5 = pwm_3 - 2; pwm_6 = Mode + 2; /保证 pwm_6 在轴向左边 pwm_7 = Mode - 2; /保证 pwm_7 在轴向右边 if(Mode = 3) Mode_couple = Mode - 3; else Mode_couple = Mode + 3; pwm_8 = Mode_couple + 6; pwm_11 = Mode_couple + 12;/Mode_couple 定义与轴向相对的腿,以此好计算出第二组腿。注意Mode_coupl

44、e 的左/边就是 Mode 轴向的右边。 if(Mode_couple 3) pwm_9 = pwm_8 - 2; pwm_10 = pwm_8 - 4; pwm_12 = pwm_11 - 2; pwm_13 = pwm_11 - 4; pwm_14 = Mode_couple - 2; /pwm_14:轴向的左边 pwm_15 = Mode_couple - 4; /pwm_15:轴向的右边 else pwm_9 = pwm_8 - 2; pwm_10 = pwm_8 + 2; pwm_12 = pwm_11 - 2; pwm_13 = pwm_11 + 2; pwm_14 = Mode_

45、couple - 2; /pwm_14 轴向的左边 pwm_15 = Mode_couple + 2; /pwm_15 轴向的右边 这样前进一步的动作细化(分为八步)程序可以写出来了。PWM_Duty18是一个数组,用来定义分别控制 18 个电机的 PPM 脉冲宽度对应值。PWM_Duty0- PWM_Duty17的顺序对应图 4.1 的编号序列。void SetPWM_Duty(void) static unsigned char flag = 1; /设置标志 flag,目的是动作分步。 static unsigned char elong = 0; /设置标志 elong,目的是延长步与

46、步之间的时间,使动作舒缓。/-下面两句可以用作幅度不大的转向。-/ / PWM_DutyMode = Center_Position_1 + 15; PWM_DutyMode_couple = Center_Position_1 + 10; /修正尾舵中心值 if(elong 3) elong +; else if(flag = 1) /第一步,抬第一组腿,pwm_0及对应的臂和脚为轴 PWM_Dutypwm_0 = Terminal_UP_2; PWM_Dutypwm_1 = Terminal_UP_2; PWM_Dutypwm_2 = Terminal_UP_2; flag+; elong

47、 = 0; else if(flag = 2) /第二步,抬第一组脚+旋转第一组臂 PWM_Dutypwm_3 = Terminal_UP_3; /前脚 UP 上抬 PWM_Dutypwm_4 = Terminal_DW_3; /后脚 DW 上抬 PWM_Dutypwm_5 = Terminal_DW_3; /后脚 DW 上抬 PWM_Dutypwm_6 = Terminal_CLK_1; PWM_Dutypwm_7 = Terminal_ATCLK_1; /右边的臂逆时针旋转 flag+; elong = 0; else if(flag = 3) /第三步,放第一组腿。本来第三步和第四步合在

48、一起,但是那样动作在换腿的时候声音很大,对机械的损伤也大。 PWM_Dutypwm_0 = Center_Position_2; PWM_Dutypwm_1 = Center_Position_2; PWM_Dutypwm_2 = Center_Position_2; flag+; elong = 0; else if(flag = 4) /第四步,抬第二组腿 PWM_Dutypwm_8 = Terminal_UP_2; PWM_Dutypwm_9 = Terminal_UP_2; PWM_Dutypwm_10 = Terminal_UP_2; flag+; elong = 0; else i

49、f(flag = 5) / 第五步,抬第二组脚+旋转第二组臂 PWM_Dutypwm_11 = Terminal_DW_3; PWM_Dutypwm_12 = Terminal_UP_3; PWM_Dutypwm_13 = Terminal_UP_3; PWM_Dutypwm_14 = Terminal_CLK_1;/轴向左边的顺时针转 PWM_Dutypwm_15 = Terminal_ATCLK_1; /轴向右边的逆时针转 flag+; elong = 0; else if(flag = 6) /第六步,蹬第一组脚+旋转第一组臂,这是第二步的逆动作,目的是借助摩擦力推动机器人。 PWM_D

50、utypwm_3 = Center_Position_3; /第一次利用摩擦力前进 PWM_Dutypwm_4 = Center_Position_3; PWM_Dutypwm_5 = Center_Position_3; PWM_Dutypwm_6 = Center_Position_1; /第二次利用摩擦力前进 PWM_Dutypwm_7 = Center_Position_1; flag+; elong = 0; else if (flag = 7) /第七步,放第二组腿 PWM_Dutypwm_8 = Center_Position_2; PWM_Dutypwm_9 = Center_

51、Position_2; PWM_Dutypwm_10 = Center_Position_2; flag+; elong = 0; else if(flag = 8) /第八步,蹬第二组脚+旋转第二组臂,是第五步的逆动作,仍然借助摩擦力推动机器人。 PWM_Dutypwm_11 = Center_Position_3; /第三次利用摩擦力前进 PWM_Dutypwm_12 = Center_Position_3; PWM_Dutypwm_13 = Center_Position_3; PWM_Dutypwm_14 = Center_Position_1; /第四次利用摩擦力前进 PWM_Dut

52、ypwm_15 = Center_Position_1; flag = 1; elong = 0; 3.3PPM 产生程序及其他 产生 PPM 波可以利用定时器产生 PWM 波的方法,MSP430F149 有两个定时器TimerA 图 3.2 PPM 控制伺服电机原理和 TimerB,可以同时产生八路 PWM 输出,其中,TimerA 产生两路,TimerB 产生六路。但是这样仍不能满足六足机器人行走需要。并且当使用定时器的这一功能时,TA0(P1.1),TB0(P4.0)就不能作为 PWM 输出口。故采用另一种 PWM 产生方式:即用纯软性 for 循环来产生,用到定时器 B 的中断功能。

53、下面的程序是如何产生 18 路 PPM 波及初值是如何装载的。其中 TBCCR0 中断子程序用中断的方式产生周期为 20ms 的波,而 InitServo()函数是如何规定定时器 B 以及如何使用简单的 for 循环语句产生高电平为 1.5ms 的 PPM 波,即达到初始化电机的目的,而 Servo_Control()函数是 PWM_Duty值载入的过程,采用顺序扫描的方式,轮流装载。/TBCCR0 中断子程序#pragma vector = TIMERB0_VECTOR_interrupt void TimerB_CCR0() /每约 20ms 中断一次 _BIC_SR_IRQ(CPUOFF

54、); /退出时唤醒 CPU void InitServo() unsigned int h,l; /PWM 波高电平持续时间变量和低电平持续时间变量 unsigned char i; /计数器,使得电机保持垂直站立约 2 秒 / unsigned int high; /定时器,定时 PPM 的脉冲宽度 P4DIR |= 0XFF; /P4 口全作为输出,输出 8 路 PPM 波给舵机 P4OUT = 0X00; /P4 口清零 P1DIR |= 0XFF; /P1 口 1.0-1.4 输出 5 路 PPM P1OUT = 0X00; /P1 口清零 P6DIR |= 0XFF; /P6 口 6

55、.3-6.7 输出 5 路 PPM P6OUT = 0X00; / P6 口清零 for(i=0;i10;i+) P4OUT = 0XFF; /P4 口全输出高,对应 PPM 高电平部分开始 P1OUT = 0XFF; /P1 口全输出高,对应 PPM 高电平部分开始 P6OUT = 0XFF; /P6 口全输出高,对应 PPM 高电平部分开始 for(h=0;hPWM_Duty17;h+); /高电平持续约 1500us,即对应舵机舵盘处在中间位置 P4OUT = 0X00; /P4 口全输出低,对应 PPM 低电平部分开始 P1OUT = 0X00; /P1 口全输出低,对应 PPM 低电

56、平部分开始 P6OUT = 0X00; /P6 口全输出低,对应 PPM 低电平部分开始 for(l=0;l5000;l+); /低电平持续约 20ms TBCTL |= TBSSEL_1 + TBCLR; /TIMER_B 时钟源设为 ACLK,并清 TAR TBCCR0 = 655; /CCR0 中断周期约为 20ms TBCCTL0 |= CCIE; /允许 CCR0 中断 TBCTL |= MC_1; /TIMER_B 工作于增计数方式 /电机控制程序 void Servo_Control() unsigned int high; P4OUT |= BIT0; /P4_0 输出 1,对

57、应第 1 路 PPM 输出的高电平开始 for(high=0;highPWM_Duty13;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_0 输出 0,对应第 1 路 PPM 输出的低电平开始 P4OUT |= BIT1; /P4_1 输出 1,对应第 2 路 PPM 输出的高电平开始 for(high=0;highPWM_Duty4;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_1 输出 0,对应第 2 路 PPM 输出的低电平开始 P4OUT |= BIT2; /P4_2 输出 1,对应第 3

58、路 PPM 输出的高电平开始 for(high=0;highPWM_Duty3;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_2 输出 0,对应第 3 路 PPM 输出的低电平开始 P4OUT |= BIT3; /P4_3 输出 1,对应第 4 路 PPM 输出的高电平开始 for(high=0;highPWM_Duty10;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_3 输出 0,对应第 4 路 PPM 输出的低电平开始 P4OUT |= BIT4; /P4_4 输出 1,对应第 5 路 PPM

59、 输出的高电平开始 for(high=0;highPWM_Duty9;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_4 输出 0,对应第 5 路 PPM 输出的低电平开始 P4OUT |= BIT5; /P4_5 输出 1,对应第 6 路 PPM 输出的高电平开始 for(high=0;highPWM_Duty16;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_5 输出 0,对应第 6 路 PPM 输出的低电平开始 P4OUT |= BIT6; /P4_6 输出 1,对应第 7 路 PPM 输出的高

60、电平开始 for(high=0;highPWM_Duty15;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_6 输出 0,对应第 7 路 PPM 输出的低电平开始 P4OUT |= BIT7; /P4_7 输出 1,对应第 8 路 PPM 输出的高电平开始 for(high=0;highPWM_Duty17;high+); /延时一段时间,对应 PPM 的脉冲宽度 P4OUT = 0X00; /P4_7 输出 0,对应第 8 路 PPM 输出的低电平开始 P1OUT |= BIT0; /P1_0 输出 1,对应第 9 路 PPM 输出的高电平开始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论