《六足仿生机器人实验室开放项目结项报告(共35页).doc》由会员分享,可在线阅读,更多相关《六足仿生机器人实验室开放项目结项报告(共35页).doc(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上淮北师范大学实验室开放项目总结报告基于STC12C5A60S2单片机的六足机器人 学 院: 物理与电子信息学院 负 责 人: 韩润 小组成员: 史浩东 史良东 陆家双 张莹莹 康强强 指导老师: 方 振 国 一 、项目重述1.1项目名称:智能六足机器人1.2项目背景及意义:背景:在社会迅速发展的今天,单片机的的运用已经渗透到我们生活的每个角落,也似乎很难找到哪个领域没有单片机的足迹。智能仪表、医疗器械,导弹的导航装置,智能监控、通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,汽车的安全保障系统,动控制领域的机器人,数码像机、电视机、全
2、自动洗衣机的控制,电话机以及程控玩具、电子宠物等等,这些都离不开单片机。意义:单片机的学习、开发与应用将对于现代社会的发展,经济的繁荣,和提高满足人类日益增长的物质文化需求有着至关重要的作用。也成就了一批又一智能化控制的工程师和科学家。科技越发达,智能化的东西就越多。学习单片机是社会发展的必然需求,也是我们现代高级技工所必须要掌握的技能。1.3项目内容:以51单片机为控制器的核心,利用单片机内部中断产生PWM波控制舵机。利用开环函数组成的动作组使六足做仿生动作,制作出了动作灵活、价格低廉以及模块化结构的六足机器人。该机器人能够严格按三角步态进行行走,实现诸如直线、转弯、躲避障碍物和追踪物体等行
3、走功能。 二、方案简介本项目可细分为控制部分、机械部分、恒流源部分、超声波检测部分。控制部分采用STC12C5A60S2单片机为核心处理器。通过PWM波使舵机转动,机械部分采取合理的机械构造,实现机器人在行走的情况下的平稳。恒流源部分采取LM7805稳压芯片为单片机和舵机供电,由于舵机在运转的过程中会有较大的电流波动。因此采用恒流电路进行恒流。超声波壁障采用超声波遇故障反射的原理。实现对物体识别和规避。三、设计过程3.1 STC89C51功能介绍:89C51是一种带4K字节闪烁可编程可擦除(FPEROMFlash Programmable and Erasable Read Only Memo
4、ry)的低电压、高性能CMOS8位,俗称。的可擦除可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多提供了一种灵活性高且价廉的方案。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为输入。P0能够用于外部程序数据,它可以被定义为数据地址的低八位。在FIASH编程时,P0 口作为输入口,当FIASH进行校验时,P0输出原码,此时
5、P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序或16位地址进行存取时,P2口输出地址的高八位。在给出地址“1”时,它
6、利用内部上拉优势,当对外部八位地址数据进行读写时,P2口输出其的内容。P2口在FLASH编程和校验时接收高八位地址信号和。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入
7、)P3.6 /WR(写选通)P3.7 /RD(读选通)P3口同时为闪烁编程和编程校验接收一些。RST:复位输入。当振荡器复位器件时,要保持RST脚两个的高电平时间。ALE/PROG:当访问外部时,允许的用于锁存地址的地位字节。在FLASH期间,此用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该被略微拉高。如果在外部执行状态ALE禁止
8、,置位无效。PSEN:外部的选通信号。在由外部取指期间,每个两次/PSEN有效。但在访问存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间为外部(0000H-FFFFH),不管是否有内部程序存储器读取外部ROM数据。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,单片机读取内部程序存储器。(扩展有外部ROM时读取完内部ROM后自动读取外部ROM)。在FLASH期间,此也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。3.2开关电路及恒流源部分: 开关三
9、极管电路利用三极管工作于截止区和饱和区,相当于电路的切断和导通的特性,被广泛应用于各种开关电路中,如常用的开关电源、驱动电路、高频振荡电路、模数转换、脉冲电路及输出电路等。本次设计用两个NPN型小功率三极管s8050构成三极管开关电路,能够有效地隔绝恒流源电路对单片机芯片的损害。 LM317是应用最为广泛的电源集成电路之一,它不仅具有固定式三端稳压电路的最简单形式,又具备输出电压可调的特点。此外,还具有调压范围宽、稳压性能好、噪声低、纹波抑制比高等优点。lm317是可调节3端正电压稳压器,在输出电压范围1.2伏到37伏时能够提供超过1.5安的电流,此稳压器非常易于使用。构成的电路如下: 3.3
10、 舵机行走步态设计 (1)三角步态。三角步态也称交替三角步态,是“六足纲”昆虫最常使用的一种步态,也被誉为最快速有效的静态稳定步态。大部分六足机器人都是从仿生学的角度出发使用这一步态。昆虫三角步态的移动模式较简单,非常适合步行架构的机器人的直线行走,行进速度也比较快。本论文也采用这种步态实现机器人的直线行走,该步态的具体方式将会在后文中具体给出。 (2)跟导步态 。 通常,三角步态的研究通常都局限在平坦地面,并且假设对于不平地面也是合理的。然而随着1974年Sun首先提出了跟导步态的概念,并于1983年由Tsai成功地把这种步态应用于俄亥俄州立大学的电动六足机器人中,这些为跟导步态的研究和发展
11、,为提高机器人在不平地面上的行走速度奠定了基础。 对于六足机器人来说,跟导步态的重点是选择前两足下一步的落点,而一对中足和一对后足的下一步落点由当前前足和中足的立足点决定。跟导步态每次只需要选择前两足的立足点,因而具有控制简单,稳定性较好,越沟能力强等特点,所以特别适合多足步行机在不平地面行走时采用。 (3)交替步态。与跟导步态类似,为了充分发挥六足机器人相对于轮式机器人在复杂地形的行走优势,交替步态成为新兴的六足机器人研究的重点。这种单腿交替行走步态,也被称为五角步态。 在交替步态中,各腿的运动可分为抬升和前进两个部分。当某腿的相邻各腿均已触地时,该腿开始运动,并给其相邻各腿发出信号。同样,
12、在该腿触地时,也会给相邻各腿发出触地信号。这样,一旦整个六足系统进入行走状态,这种顺次的步态运行状态就可以一直维持下去。 由于各腿等待其相邻腿触地的时间取决于其相邻腿的动作及其触地位置,因而,对于崎岖不平的地面而言,这种步态本身是不可预测的。然而,对于理想的平整地面而言,各腿的运动周期应该是一致的,故而此时的交替步态实质上等同于三角步态,这己在实验中得到证实根据实验及研发,采用了三角步态。六足仿生机器人采用六足昆虫的行走步态,步行时把6条足分为两组,以一边的前足后足与另一边的中足为一组,形成一个三角架支撑机体。因此在同一时间,只有一组的3条足起支撑作用,前足用爪固定物体后拉动虫体前进,中足用以
13、支撑并举起所属一边的身体,后足则推动机体前进,同时使机体转向。行走时机体向前,并稍向外转,3条足同时行动,然后再与另一组3条足交替进行。直线行走时的步态如图3.2所示。机器人开始运动时左侧的2号腿和右侧的4、6号腿抬起,准备向前摆动,另外3条腿1、3、5处于支撑状态,支撑机器人本体确保机器人的原有重心位置处于3条支撑腿所构成的三角形内,使机器人处于稳定状态不至于摔倒,见图3.2(a),摆动腿2、4、6向前跨步,见图3.2(b),支撑腿1、3、5一面支撑机器人本体,一面在小型直流驱动电机和皮带传动机构的作用下驱动机器人本体,使机器人机体向前运动一个半步长S,见图3.2(c);在机器人机体移动到位
14、时,摆动腿2、4、6立即放下,呈支撑态。使机器人的重心位置处于2、4、6三条支撑腿所构成的三角形稳定区内,原来的支撑腿1、3、5已抬起并准备向前跨步,见图3.2(d)摆动腿1、3、5向前跨步,见图3.2(e),支撑腿2、4、6此时一面支撑机器人本体,一面驱动机器人机体使机器人机体向前运动一个步长S,见图3.2(f),如此不断重复步态a-b-c-d-e-f-a,循环往复实现机器人不断向前运动。图3.23.4总原理图: 注:电路模块较多,故较多采用网络标号的方法来实现电路图的物理连接。3.5 PCB电路图: 四、项目总结本次项目设计中,首先对六足机器人的机械构造进行了深入的讨论 最终确定了三角步态
15、的六足结构,采用每脚三个舵机来模仿蜘蛛的足关节。而后在舵机的选取方面采用了目前性价比较高的MG996舵机及全铝合金制的机身和关节等。其次,前期采用STC89C51单片机模拟驱动舵机,由于STC89C52单片机的IO口驱动电流无法驱动MG996舵机,因此采用了STC12C5A60S2单片机驱动。舵机的信号是由单片机提供,其工作电压是外部供电。有效的减轻单片机的负载且提高单片机运行的稳定性。机械结构也是六足机器人重要的考虑部分,机械构造的稳定是完成后续动作的基础,机械的缓震方面也是要做到细致。保证机械的流畅运行。五、附录全部程序:#include#includeservo.h#includesbi
16、t led=P42;uchar time0_count,led_count;/最小值为0 最大值19 0度到190度/*函数申明*/void Delay1ms(void);/12.000MHzvoid Delay_ms(unsigned int x);void time_configuration();/*步态程序*/void Gesture0_ShenZhan(void); /机体伸展void Gesture1_ZhanLi(void); /机体站立姿态void Gesture2_ShouSuo(void); /机体收缩void Gesture3_JinShi(void); /进食姿态voi
17、d Gesture4_SanZuZhanLi(void);void Gesture5_SiZuZhanLi(void);void Left_Gait(void); /左转动作void Right_Gait(uint time); /右转动作void Forword_Gait(uint time); /前进动作void Back_Gait(void); /后退动作/*主函数*/void main()/*所有IO口设置为推挽输出*/ P1M1=0x00;P1M0=0xff;P0M1=0x00;P0M0=0xff;P2M1=0x00; P2M0=0x81; time_configuration();
18、 Gesture0_ShenZhan(); Delay_ms(500); Delay_ms(500); while(1) Forword_Gait(200); /*/4足站立/*/定稿void Gesture5_SiZuZhanLi(void)Angle_Servo_1=7; /左前Angle_Servo_2=0; Angle_Servo_4=4; /左中Angle_Servo_5=12; Angle_Servo_7=7; /左后Angle_Servo_8=8; Angle_Servo_16=13; /右前Angle_Servo_17=0; Angle_Servo_13=16; /右中Angl
19、e_Servo_14=12; Angle_Servo_10=13; /右后Angle_Servo_11=12; Delay_ms(500);Delay_ms(500);Angle_Servo_3=8;Angle_Servo_6=8;Angle_Servo_9=12; Angle_Servo_18=8;Angle_Servo_15=8; Angle_Servo_12=8; /*/3足站立/*/定稿void Gesture4_SanZuZhanLi(void)Angle_Servo_1=10; /左前Angle_Servo_2=0;Angle_Servo_3=0; Angle_Servo_7=10
20、; /左后Angle_Servo_8=19;Angle_Servo_9=19; Angle_Servo_13=10; /右中Angle_Servo_14=0;Angle_Servo_15=0; /*函数名称:void Forword_Gait(unsigned int time)函数功能:前进步态转换角度:30度*/void Forword_Gait(unsigned int time) /*-135抬起-*/ /1 /左前足抬起 Angle_Servo_1=7; Angle_Servo_2=7; Angle_Servo_3=13; /左后足抬起 Angle_Servo_7=7; Angle_
21、Servo_8=7; Angle_Servo_9=9; /右中足抬起 Angle_Servo_13=11; Angle_Servo_14=11; Angle_Servo_15=9; /*延时*/ Delay_ms(time);/*-135前移-*/ /2 /左前足 Angle_Servo_1=7; Angle_Servo_2=7; Angle_Servo_3=14; /左后足 Angle_Servo_7=7; Angle_Servo_8=7; Angle_Servo_9=10; /右中足 Angle_Servo_13=11; Angle_Servo_14=11; Angle_Servo_15=
22、8; /*延时*/ Delay_ms(time);/*-135放下-*/ /2 /左前足 Angle_Servo_1=9; Angle_Servo_2=9; Angle_Servo_3=14; /左后足 Angle_Servo_7=9; Angle_Servo_8=9; Angle_Servo_9=10; /右中足 Angle_Servo_13=11; Angle_Servo_14=11; Angle_Servo_15=8; /*延时*/ Delay_ms(time);/*-246抬起-*/ /右前足抬起 Angle_Servo_10=11; Angle_Servo_11=11; Angle_
23、Servo_11=3; /右后足抬起 Angle_Servo_16=11; Angle_Servo_17=11; Angle_Servo_18=11; /左中足抬起 Angle_Servo_4=9; Angle_Servo_5=9; Angle_Servo_6=9; /*延时*/ Delay_ms(time);/*-246前移135归位-*/ /右前足 Angle_Servo_10=11; Angle_Servo_11=11; Angle_Servo_12=2; /右后足 Angle_Servo_16=11; Angle_Servo_17=11; Angle_Servo_18=10; /左中足
24、 Angle_Servo_4=7; Angle_Servo_5=7; Angle_Servo_6=8; /归位 /左前足 Angle_Servo_1=9; Angle_Servo_2=9; Angle_Servo_3=14; /左后足 Angle_Servo_7=9; Angle_Servo_8=9; Angle_Servo_9=7; /右中足 Angle_Servo_13=9; Angle_Servo_14=9; Angle_Servo_15=9; /*延时*/ Delay_ms(time);/*-246放下-*/ /右前足 Angle_Servo_10=9; Angle_Servo_11=
25、9; Angle_Servo_12=2; /右后足 Angle_Servo_16=9; Angle_Servo_17=9; Angle_Servo_18=10; /左中足 Angle_Servo_4=9; Angle_Servo_5=9; Angle_Servo_6=8;/*延时*/ Delay_ms(time);/*-135抬起-*/ /左前足抬起 Angle_Servo_1=7; Angle_Servo_2=7; Angle_Servo_3=14; /左后足抬起 Angle_Servo_7=7; Angle_Servo_8=7; Angle_Servo_9=7; /右中足抬起 Angle_
26、Servo_13=11; Angle_Servo_14=11; Angle_Servo_15=9; /*延时*/ Delay_ms(time);/*-135前移246归位-*/ /归位 /右前足 Angle_Servo_10=9; Angle_Servo_11=9; Angle_Servo_12=3; /右后足 Angle_Servo_16=9; Angle_Servo_17=9; Angle_Servo_18=11; /左中足 Angle_Servo_4=9; Angle_Servo_5=9; Angle_Servo_6=9;/*延时*/ Delay_ms(time); /*/机体进食状态/
27、*/ void Gesture3_JinShi(void)Angle_Servo_4=3; /左中Angle_Servo_5=9;Angle_Servo_6=5; Angle_Servo_7=9; /左后Angle_Servo_8=7;Angle_Servo_9=7; Angle_Servo_13=10; /右中Angle_Servo_14=5;Angle_Servo_15=9; Angle_Servo_10=5; /右后Angle_Servo_11=7;Angle_Servo_12=7; /*-运动-*/落下 Angle_Servo_1=4; /左前 Angle_Servo_2=1;Angl
28、e_Servo_3=7;Angle_Servo_16=10; /右前Angle_Servo_17=14;Angle_Servo_18=7;/Delay_ms(300);/ /抬起/Angle_Servo_1=6;/Angle_Servo_16=10;/ /Angle_Servo_2=0;/Angle_Servo_17=0;/Angle_Servo_3=19;/Angle_Servo_18=19;/Delay_ms(300);/*-*/*/机体收缩/*/ /定稿void Gesture2_ShouSuo(void)Angle_Servo_1=7; /左前Angle_Servo_2=1; Angl
29、e_Servo_4=7; /左中Angle_Servo_5=1; Angle_Servo_7=7; /左后Angle_Servo_8=1;Angle_Servo_16=7; /右前Angle_Servo_17=14; Angle_Servo_13=7; /右中Angle_Servo_14=14; Angle_Servo_10=7; /右后Angle_Servo_11=14;Delay_ms(500);Angle_Servo_3=1;Angle_Servo_6=1; Angle_Servo_9=1; Angle_Servo_18=17;Angle_Servo_15=17; Angle_Servo
30、_12=17; /*/机体站立/*/定稿void Gesture1_ZhanLi(void)Angle_Servo_1=7; /左前Angle_Servo_2=7;Angle_Servo_3=7; Angle_Servo_4=7; /左中Angle_Servo_5=7;Angle_Servo_6=7; Angle_Servo_7=7; /左后Angle_Servo_8=7;Angle_Servo_9=7; Angle_Servo_16=7; /右前Angle_Servo_17=7;Angle_Servo_18=7; Angle_Servo_13=7; /右中Angle_Servo_14=7;A
31、ngle_Servo_15=7; Angle_Servo_10=7; /右后Angle_Servo_11=7;Angle_Servo_12=7; /*/机体伸展/*/定稿void Gesture0_ShenZhan(void)Angle_Servo_1=9; /左前Angle_Servo_2=9;Angle_Servo_3=14; Angle_Servo_4=9; /左中Angle_Servo_5=9;Angle_Servo_6=9; Angle_Servo_7=9; /左后Angle_Servo_8=9;Angle_Servo_9=7; Angle_Servo_10=9; /右前Angle_
32、Servo_11=9;Angle_Servo_12=3; Angle_Servo_13=9; /右中Angle_Servo_14=9;Angle_Servo_15=9; Angle_Servo_16=9; /右后Angle_Servo_17=9;Angle_Servo_18=11; /*函数名称:void Left_Gait(void)函数功能:左转步态转换角度:30度*/void Left_Gait(void)/*函数名称:void Left_Gait(void)函数功能:右转步态转换角度:30度*/void Right_Gait(uint time)/*-组1抬起-*/ /左前足抬起 An
33、gle_Servo_1=7; /11恢复初始角度 左前足 内圈舵机 Angle_Servo_2=2; /9抬高30度 左前足 中圈舵机 Angle_Servo_3=4; /11往下30度 左前足 外圈舵机 /左后足抬起 Angle_Servo_7=10; /14恢复初始角度 左后足 内圈舵机 Angle_Servo_8=12; /13抬高30度 左后足 中圈舵机 Angle_Servo_9=11; /12往下30度 左后足 外圈舵机 /右中足抬起 Angle_Servo_13=9; /13恢复初始角度 右中足 内圈舵机 Angle_Servo_14=2; /9抬高30度 右中足 中圈舵机 An
34、gle_Servo_15=4; /11往下30度 左后足 外圈舵机/*-组2右转-*/ Angle_Servo_16=5; /12左转30度 右前足 内圈舵机 Angle_Servo_10=5; /12左转30度 右后足 内圈舵机 Angle_Servo_4=6; /13左转30度 左中足 内圈舵机/*延时*/ Delay_ms(time);/*-组1落下-*/ /左前足落下 Angle_Servo_2=5; /9恢复初始角度 左前足 中圈舵机 Angle_Servo_3=3; /11恢复初始角度 左前足 外圈舵机 /左后足落下 Angle_Servo_8=9; /13恢复初始角度 左后足 中
35、圈舵机 Angle_Servo_9=12; /12恢复初始角度 左后足 外圈舵机 /右中足落下 Angle_Servo_14=5; /9恢复初始角度 右中足 中圈舵机 Angle_Servo_15=3; /11恢复初始角度 右中足 外圈舵机/*-组2抬起-*/ /右前足抬起 Angle_Servo_16=8; /12恢复初始角度 右前足 内圈舵机 Angle_Servo_17=2; /9抬高30度 右前足 中圈舵机 Angle_Servo_18=4; /11往下30度 右前足 外圈舵机 /右后足抬起 Angle_Servo_10=8; /12恢复初始角度 右后足 内圈舵机 Angle_Serv
36、o_11=2;/9抬高30度 右后足 中圈舵机 Angle_Servo_12=4; /11往下30度 右后足 外圈舵机 /左中足抬起 Angle_Servo_4=9; /13恢复初始角度 左中足 内圈舵机 Angle_Servo_5=2;/9抬高30度 左中足 中圈舵机 Angle_Servo_6=4; /11往下30度 左中足 外圈舵机/*延时*/ Delay_ms(time);/*-组1右转-*/ /机体右转 Angle_Servo_1=4; /11左转30度 左前足 内圈舵机 Angle_Servo_7=7; /14左转30度 左后足 内圈舵机 Angle_Servo_13=6; /13
37、左转30度 右中足 内圈舵机/*-组2落下-*/ /右前足落下 Angle_Servo_17=5; /9恢复初始角度 右前足 中圈舵机 Angle_Servo_18=4; /11恢复初始角度 右前足 外圈舵机 /右后足落下 Angle_Servo_11=5; /9恢复初始角度 右后足 中圈舵机 Angle_Servo_12=4; /11恢复初始角度 右后足 外圈舵机 /左中足落下 Angle_Servo_5=5; /9恢复初始角度 左中足 中圈舵机 Angle_Servo_6=3; /11恢复初始角度 左中足 外圈舵机/*延时*/Delay_ms(time);/*函数名称:void Left_Gait(void)函数功能:后退步态转换角度:30度*/void Back_Gait(void)/*定时器函数配置*/void time_configuration() TMOD=0X01; TH0=0XFF;/0.125MS TL0=0X83; ET0=1; TR0=1; EA=1; time0_co