龙人宝贝机器人课程设计报告讲解.docx
《龙人宝贝机器人课程设计报告讲解.docx》由会员分享,可在线阅读,更多相关《龙人宝贝机器人课程设计报告讲解.docx(28页珍藏版)》请在冰点文库上搜索。
龙人宝贝机器人课程设计报告讲解
龙人宝贝机器人课程设计报告
1小车硬件安装过程
1.1安装机器人底盘硬件
零件清单:
宝贝车地盘、螺柱4个、盘头螺丝4个、12/32英寸的橡胶圈(本实践中没有该零件)。
(1)将13/32英寸的橡胶套圈插到宝贝车底盘衷心的孔内。
由于本实践中没有该零件,所以该步省略。
(2)确保底盘中心孔的边缘嵌在橡胶圈的凹槽中。
(3)用4个螺丝将螺柱固定在底盘上。
1.2拆除舵机摆臂
零件清单:
两个舵机。
(1)用螺丝起子去掉舵机摆臂和电机输出轴之间的螺钉。
(2)将舵机摆臂从电机输出轴上取下来。
(3)将螺丝钉保存好,而后还会用到。
1.3将电机安装到底盘上
零件清单:
宝贝车地盘(部分已经安装好)、连续旋转舵机、盘头螺丝8个、螺母8个。
(1)用盘头螺丝和螺母将舵机固定在底盘上。
为了最好的性能,必须从里面而不是从外面把电机放入巨型窗口。
(2)用标签纸标识伺服电机的左右轮。
1.4安装电池
零件列表:
宝贝车地盘(部分已经安装好)、带有插头的电池盒、平头螺丝2个、螺母2个
(1)用平头螺丝和螺母将电池盒固定在宝贝车机器人的底盘下面。
(2)将螺丝穿过电池盒,然后在底盘上面用螺母紧固。
(3)将电池盒的电源连接线穿过底盘中间带有橡胶圈的孔。
(4)将伺服电机线也穿过此孔。
(5)牌例伺服电机线和电源线。
1.5安装轮子
零件清单:
部分已经安装好的宝贝车机器人、开口销、球状尾轮、橡皮圈、塑胶轮子、步骤1.2中拆掉舵机摆臂里保存的螺钉。
(1)轮子的中心孔与底盘尾部的中心孔对准在一条水平线上。
(2)将开口销同时穿过这三个孔(底盘左侧、尾轮、底盘右侧)
(3)将开口销一端弯曲使它不会滑出。
(4)拉伸橡皮圈,把它套在每个轮子上。
(5)每个轮子有一个凹槽用于把它安装到输出轴上。
将两个轮子分别在输出轴上,确保两个高度一致,并已安装进轮子的凹槽。
(6)用螺丝钉将轮子固定在输出轴上。
1.6把教学地板安装到地盘上
零件清单:
宝贝车机器人地盘(部分组装好)、盘头带平垫螺丝4个、带控制器的教学板
(1)连接伺服电机到教学底板上的电机接口处。
(2)将贴着“L”(左轮驱动电机)的插头连接到PC3端口,贴着“R”(右轮驱动电机)的插头连接到PC2端口。
(3)确保面包板接近驱动轮而不是尾轮。
(4)将主板放在四个支架上使其与四个孔对齐。
(5)用盘头呆平垫螺丝将主板固定在螺柱上。
2C51+AVR控制板介绍
2.1概述:
C51+AVR宝贝车控制板,是鸥鹏科技有限公司开发的,一款拥有C51和AVR功能的单片机控制板。
C51部分采用的是AT89S52单片机,AVR部分采用的是ALTMEGA8的单片机。
2.289S52的主要性能:
1)与MCS-51单片机产品兼容;
2)8K字节在系统可编程Flash存储器;
3)1000次擦写周期;
4)全静态操作:
0Hz-33MHz;
5)三级加密程序存储器;
6)32个可编程I/O口线;
7)三个16位定时器/计数器;
8)8个中断源;
9)全双工UART串行通道;
10)低功耗空闲和掉电模式;
11)掉电后中断可唤醒;
12)看门狗定时器;
13)双数据指针;
14)掉电标识符。
2.3功能特性描述
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.4引脚结构
图1
图2
图3
2.5AVR的主要性能:
高性能、低功耗的8位AVR微处理器先进的RISC结构130条指令。
大多数指令执行时间为单个时钟周期32个8位通用工作寄存器全静态工作工作于16MHz时性能高达16MIPS只需两个时钟周期的硬件乘法器非易失性程序和数据存储器8K字节的系统内可编程Flash擦写寿命:
10,000次。
具有独立锁定位的可选Boot代码区通过片上Boot程序实现系统内编程真正的同时读写操作512字节的EEPROM擦写寿命:
100,000次。
1K字节的片内SRAM可以对锁定位进行编程以实现用户程序的加密外设特点两个具有独立预分频器8位定时器/计数器,其中之一有比较功能。
一个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立振荡器的实时计数器RTC三通道PWM,TQFP与MLF封装的8路ADC8路10位ADC,PDIP封装的6路ADC,8路10位ADC,面向字节的两线接口两个可编程的串行USART可工作于主机/从机模式的SPI串行接口。
具有独立片内振荡器的可编程看门狗定时器片内模拟比较器特殊的处理器特点上电复位以及可编程的掉电检测片内经过标定的RC振荡器片内/片外中断源–5种睡眠模式:
空闲模式、ADC噪声抑制模式、省电模式、掉电模式及Standby模式。
I/O和封装–23个可编程的I/O口–28引脚PDIP封装,32引脚TQFP封装,32引脚MLF封装。
工作电压2.7-5.5V(ATmega8L)–4.5-5.5V(ATmega8)。
速度等级0-8MHz(ATmega8L)–0-16MHz(ATmega8)4Mhz时功耗,3V,25°C工作模式:
3.6mA空闲模式:
1.0mA掉电模式:
0.5uA
图4
图5
1
电源插头:
单片机供电
17
20pin排母:
AVRLCD显示块的扩展接口。
2
三档拨动开关:
1、档关2、单片机供电
3、舵机供电。
18
IO扩展口舵机插口:
舵机与AVR单片机的连接。
3
C51ISP下载口:
并口下载HEX文件。
19
AVR扩展口。
4
C51单片机供电跳线。
20
扩展面包板。
5
三端稳压器:
提供稳定的5V电源
21
电源指示灯:
显示控制板是否通电。
6
电源选择跳线:
当跳线帽连接到Vin的时候舵机的供电电源是输入电压电源,当跳线帽连接到Vcc,舵机的供电电源是5V。
22
C51单片机电源显示灯:
用于C51单片机通电反馈。
7
舵机连接插头:
舵机与C51单片机的连接。
23
AVR单片机电源显示灯:
用于AVR单片机通电反馈。
8
C51单片机的IO扩展口。
24
轻触开关:
用于C51单片机复位。
9
20pin排母:
C51LCD显示块的扩展接口
25
晶振:
给C51单片机提供时钟信号。
10
MAX232通信IC:
用于PC机与单片机进行异步串行通信。
26
晶振:
给AVR单片机提供时钟信号。
11
DB9母头:
PC机和C51系列的单片机的异步串行通信。
27
轻触开关:
用于AVR单片机复位。
12
C51系列单片机:
AT89S52,TOFP封装。
28
舵机和滚轮:
宝贝车的运动执行器件
13
AVRISP下载口:
并口下载HEX文件。
29
宝贝车的支架。
14
AVR单片机供电跳线。
15
AVR系列单片机28脚PDIP封装。
16
DB9母头:
PC机和AVR系列的单片机的异步串行通信。
3软件编程设计
3.1搭建并测试IR发射和探测器对
3.1.1元件清单:
(1)两个红外检测器
(2)两个IRLED
(3)四个470□电阻
(4)两个9013三极管
3.1.2搭建红外线前灯
电路板的每个角安装一个IR组(IRLED和检测器)。
●断开主板和伺服系统的电源
●建立所示的电路,可参考实物
图6
3.2红外线检测循迹
程序功能图:
后退
图7
根据程序功能图来编写程序
#include
#include
#include//宏定义
#defineLeftIRP1_2//左边红外接收连接到P1_2
#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
#defineRightLaunchP3_6//右边红外发射连接到P3_6
voidIRLaunch(unsignedcharIR)
{
intcounter;
if(IR=='L')//左边发射
for(counter=0;counter<38;counter++)
{
LeftLaunch=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LeftLaunch=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}//为了达到使电机有充分的时间反应做的延时空程序
if(IR=='R')//右边发射
for(counter=0;counter<38;counter++)
{
RightLaunch=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
RightLaunch=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
intmain(void)
{
intpulseLeft,pulseRight;
intirDetectLeft,irDetectRight;
uart_Init();
printf("ProgramRunning!
\n");
do
{
IRLaunch('R');//右边红外发射
irDetectRight=RightIR;//右边接收
IRLaunch('L');//左边红外发射
irDetectLeft=LeftIR;//左边接收
if((irDetectLeft==0)&&(irDetectRight==0))//如果检测到的都是白色的话,向后退,直到检测到黑色,重新走
{
pulseLeft=1300;
pulseRight=1700;
}
elseif((irDetectLeft==0)&&(irDetectRight==1))//左边检测到白色,右边检测到黑色,右转
{
pulseLeft=1700;
pulseRight=1700;
}
elseif((irDetectLeft==1)&&(irDetectRight==0))//右边检测到白色,左边检测到黑色,左转
{
pulseLeft=1300;
pulseRight=1300;
}
else//如果都不是的话前进
{
pulseLeft=1700;
pulseRight=1300;
}
P1_1=1;
delay_nus(pulseLeft);
P1_1=0;
P1_0=1;
delay_nus(pulseRight);
P1_0=0;
delay_nms(20);
}
while
(1);
}
4电路仿真阶段
我们根据电路图来进行protus的电路仿真,在最终的时候我们进行的电路仿真是:
图8:
最终
图9:
最开始
由于在protus软件中没有AT89S52的单片机,所以采用的时候与之比较相似的AT89C52的单片机来代替,仿真电路按照硬件连接的电路所设计,感应器GP2D12。
电机采用的是MOTOR-PWMSERVO舵机伺服电动机,电机的电极根据实际要求查询的资料来确定。
运行结果:
将程序导入到单片机中后发现错误报告,修改后电机不转,感应器不能传感信号。
图10:
修改1
改进:
将传感器改为可以常开常闭的控制开关SW-SPST代替发射0/1信号。
运行结果:
运行后点击不发生偏转,电机控制开关不点击运转不发生变化。
图11:
修改2
改进:
加上示波器来显示显示点击的运转状况。
运行结果:
示波器没有反应。
图12:
修改3
改进:
经过再次的查询资料得知我们的电机的正极和信号线接反了,将接线错误改正。
运行结果:
运行后点击可以显示转角,但是按下控制开关后,点击的转角不发生改变。
同时我们发现没有复位装置的仿真,并且二极管无法显示信号状态。
图13:
修改4
改进:
将二极管改为可显示信号的DIODE,加上复位仿真模块。
运行结果:
二极管信号显示正常,按下控制开关后点击的转角仍然没有发生改变,复位仿真有效果。
但是无法模拟两个红外线都探测到白色信号的情况。
图14:
修改5
改进:
更进一步的查阅资料后得知控制开关应该和地相连,因为单片机本身提供有正电位,信号为1,如果控制开关还和正电位相连的话,那按下控制开关后信号不发生改变。
于是将控制开关与地连接。
同时加上一个控制开关模拟红外线探测到都是白色的情况。
运行结果:
电机发生转角,示波器显示正常。
但是分别按下三个控制开关后结果显示都一样。
经过改进后得到最终的仿真结果。
5相关疑问解答
5.1选择使用三极管9013的原因
因为C51的IO驱动能力比较弱,我们加入三极管来使其工作在开关状态。
三极管是一种控制原件,主要用来控制电流的大小,简单来说,是用小电流控制大电流。
5.2使用AT89S52的四个引脚P1_2、P1_3、P1_5、P1_6分别的作用。
#defineLeftIRP1_2//左边红外接收连接到P1_2
#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
#defineRightLaunchP3_6//右边红外发射连接到P3_6
这里用到的命令是#define,它的作用是声明标识符常量。
往后就可以用LeftIR来代替P1_2,用RightIR来代替P3_5等等。
5.3do…..while语句的使用方法
在C语言中,直到型循环控制语句是do…while,它的一般形式为:
do语句while(表达式)其中语句通常为复合语句,成为循环体
Do….while语句的基本特点是:
先执行后判断。
因此循环体至少被执行一次。
在这个程序DO循环体中,发生38.5kHz的IR信号给每个红外的LED。
当脉冲发生完以后,变量立即存储红外检测器的输出状态。
5.4舵机的工作原理
舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
如果你控制的舵机在不停的抖动,其中一个原因就是你给的脉冲有杂波,这点很重要。
舵机是一个物理器件,它的转动需要时间的,因此,程序中占空比的值变化不能太快,不然舵机跟不上程序的响应时间。
(TheParallax(GWS) NAROServoissmallerandlighterthanastandardservo,butitdeliverstheperformanceofastandardservo.Itisrecommendedforsmallerrobotsorinprojectswherespaceistight.ServosmaybecontrolleddirectlyfromaBASICStampI/OpinbyusingthePULSOUTcommand.Two NAROservosareusedtomaketheParallaxPenguinRobotwalk.)
视差(GWS)NARO伺服的是比标准伺服体积更小,重量更轻,但它提供了一个标准的伺服性能。
它被推荐用于小型机器人或项目,在空间紧张。
舵机直接从BASICStamp的I/O引脚,可控制使用PULSOUT指令。
两个NARO舵机用于使视差企鹅机器人(龙人宝贝)进行步行路程。
5.4.1舵机的结构
我们选的舵机型号是TowerProMG995,实物如图:
图15
它有三条线棕色、红色、黄色分别是GND、V+、S(信号)。
如下图:
图16
伺服电机连接线和延长线的安装:
首先,伺服电机上的插座接线颜色为咖、红、黄,它们分别问GND,V+(电源),S(信号)。
延长线颜色分别为白、红、黑,它们分别是GND,V+(电源),S(信号)。
将他们连接起来,按照伺服电机卡的输出排针上的标示插好,注意线不要接反。
在我们的实验中所用的伺服电机的插座接线已经和延长线接在了一起,所以没有必要再进行这一步的安装。
5.4.2舵机的单片机控制原理
(1)我们得先了解舵机的工作原理:
控制信号由舵机的信号通道进入信号调制芯片,获得直流偏置电压。
它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。
最后,电压差的正负输出到电机驱动芯片决定电机的正反转。
当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
它的控制要求如下图:
图17:
舵机输出转角与输入信号脉冲宽度的关系
(2)由上可知舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。
我们用pic单片机的定时器1模块产生PWM信号,得到控制电机的占空比,也就如上图的占空比信号,周期是20Ms.下面我们来看看怎样产生上图的占空比,单片机的定时器1模块最大可以产生174ms的延时,也就是可以产生最大174ms的中断。
怎样设置Timer1来产生上述占空比的中断,可以参考具体资料书。
当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。
这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。
具体的设计过程:
例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在2ms后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为18ms,再过18ms进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为2ms,等待下次中断到来,如此往复实现PWM信号输出到舵机。
用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动。
但是我们要记住一点,要在中断中做事必须要在长中断中做事,可以避免不必要的麻烦。
5.4.3proteus软件仿真舵机的控制
先在proteus中找到舵机的元件,就是那个英文单词是motor-pwmservo的元件。
这里我们可以用按键的方式去控制单片机产生不同的占空比,来达到可以控制电机转到不同的角度。
电路如图所示:
图18
5.4.4具体的程序清单:
#include
unsignedcharTL01;
unsignedcharTH01;
unsignedcharTL02;
unsignedcharTH02;
intA,C=0;
bitFLAG=0;
voiddelay10ms(void)
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//延时200ms子程序
voiddelay02s(void)
{
unsignedchari;
for(i=20;i>0;i--)
delay10ms();
}
/*主程序*/
voidmain(void)
{
INTCON=0;
GIE=1;//;打开总中断
PEIE=1;//;打开外部中断使能位
TMR1IE=1;//;打开TMR1中断
TRISD=0X0F0;
PORTD=0X00;
T1CON=0x01;//设置TMR1的控制字
RD0=0;//脉冲波形起始状态
TMR1IF=0;
FLAG=0;
TL01=0X23;//TL01=0x2E;//舵机0位,1.5ms定时初始值
TH01=0X0FA;//TH01=0x0FA;
TL02=0X0CC;//TL02=0x0B2;//8.5ms定时初始值
TH02=0X0DE;//TH02=0x0B7;
while
(1)
{
if(RD7==0)
{
delay10ms();//按下,延时,防抖
if(RD7==0)
{//等待释放
delay02s();
A=TL01;
if(A!
=0xFF)//判断是否到+90°
{
C=0;
A=A-20;
if(A<=0)
{A+=255;C=1;}
if(C==0)
{
TL01=A;
C=0;
A=TL02;
A=A+20;
if(A>=255)
{A-=255;C=1;}
if(C==0)
{TL02=A;}
else
{TH02++;TL02=A;C=0;}
}
else
{
TH01--;
TL01=A;
C=0;
A=TL02;
A=A+20;
if(A>=255)
{A-=255;C=1;}
if(C==0)
{TL02=A;}
else
{TH02++;TL02=A;C=0;}
}
}
}
}
if(RD6==0)
{
delay10ms();//按下,延时,防抖
if(RD6==0)
{//等待释放
delay02s();
A=TL01;
if(A!
=0x22)//判断是否到-90°
{
C=0;
A=A+20;
if(A>=255)
{A