陈正敏步行机器人实验报告Word下载.docx
《陈正敏步行机器人实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《陈正敏步行机器人实验报告Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
3、掌握机器人机械工作方式,红外避障工作原理,掌握机器人尾随行走所需的闭环控制算法,学会将机械运动和自动化(利用软、硬件)紧密结合。
4、学会查阅科技参考资料,根据自己的设计任务和设计方法编制程序、调试程序软、硬件联机调试,达到设计要求收集实验数据,并对结论进行分析,写好实验报告。
三、实验原理
1)时间测量和电压
在这本学习指南中,我们将多次提到几个重要的时间单位秒(s),毫秒(ms),
微秒(us)。
通常,我们将秒用小写字母“s”表示,所以,可以将1秒写成1s。
毫秒则用“ms”表示,1毫秒等于1/1000秒;
微秒用“us”表示,1微秒等于
1/1000000秒,从毫秒、微秒与秒的关系你是否已经推出:
1毫秒=1000微秒。
在
2)运动原理
从AVRCPU中发送出来的一组控制伺服电机的控制信号被称为“脉冲序列”,
如图2-1所示。
AVRCPU能够通过编程产生这样的信号波形,而且还能用它任意的
一个I/O口进行信号的输出。
在下面的例子中,AVRCPU向PC2(跨步伺服电机)
和PC3(倾斜伺服电机)各发送一个1500微秒的脉冲信号。
在1500微秒的高电平
送出后,AVRCPU继续发送一个25毫秒的低电平给该引脚,产生一组脉冲序列
如图所示,这个脉冲序列由1500微秒的高电平和25毫秒的低电平组成。
伺服
电机的控制主要由1500微秒的高电平来控制,我们通常称这一段时间为脉宽。
脉
冲信号由低电平到高电平这一变化过程我们称为上升沿。
同理,由高电平到低电
平的变化我们称为下降沿。
步行机器人的行走的分4个步骤:
a.向一边倾斜
b.移动被提起的那只腿
c.向另一边倾斜
d.移动被提起的那只腿
3)滑动式转弯
步行机器人有点不大灵活。
它只能向前或向后移动它的步子,不能相对它
的身体旋转步子。
但这并没有阻碍他的转弯能力,当走直线时,步行机器人和
人走直线是相似的,而转弯就明显不同。
步行机器人转弯和人最接近的是就象
人穿着平底鞋站在冰面上转弯的情形。
人站在冰上右转弯的过程是相当简单的,把你的左脚向前迈一步放在地面
上,然后把左脚向后滑行回收,这样你就可以以右脚为轴向右转了。
如果冰是
湿滑的话可能要多次转动才能转过90度。
同样要左转就滑行右脚。
标准的步行机器人在冰上转弯的效果并不理想,但利用这种原理,在其它
表面上可以转得很好。
步行机器人的平滑金属脚提供了一个光滑的表面。
当它
站在能提供摩擦力的表面上来做转弯,效果会更加好。
如果走的平面太光滑,
那么对步行机器人的脚掌进行一些处理以便提供更大的摩擦力。
最典型的做法
四、相关资料及问题
(一)、PWM直流电机调速原理:
通过AVR单片机ATmega8直接产生PWM波形经过电机驱动芯片L298分别驱动两个直流电机,PWM将占空比不同的脉冲变成不同的电压驱动直流电机转动从而得到不同的转速,且实现电机启动、停止、正反转等功能。
(二)、直流电机控制模块
1、控制板的使用说明
#definePOSITIVE_DIR1//正向旋转
#defineNEGATIVE_DIR0//反向旋转
#defineLEFT_MOTOR0//左电机
#defineRIGHT_MOTOR1//右电机
#defineNOT_STOP0//不停止
#defineSTOP1//停止
#defineBY_10MS0//时间控制系数10毫秒倍率
#defineBY_100MS1//100毫秒倍率
#defineBY_1000MS2//1000毫秒倍率
#defineNOT_CONTROL_TIME3//不控制时间
2、通过TTL串口驱动PWM直流电机驱动模块
voidwrite_pwm(unsignedcharbDirection,unsignedcharbSide,unsignedcharbStop,unsignedcharTimeFactor,unsignedcharSpeed,unsignedcharTime)
{
unsignedcharCommand;
bSide=bSide<
<
1;
bStop=bStop<
2;
TimeFactor=TimeFactor<
3;
Command=bDirection|bSide|bStop|TimeFactor;
//组合命令字节
soft_send_enable();
//允许软串口发送
EA=1;
rs_send_byte(0xaa);
//发送控制命令的头部,恒为0xaa
rs_send_byte(Command);
//发送命令字节,想要了解命令格式
rs_send_byte(Speed);
//发送速度描述字节,0~255
rs_send_byte(Time);
//发送时间倍率,0~255
rs_send_byte(0xbb);
//发送控制命令的尾部,恒为0xbb
while(rs_f_TI==0);
//等待所有的命令发出完毕
EA=0;
}
3、几个基本函数
驱动电机后退函数
原理:
左电机正转,右电机反转,以同样的速度旋转,完成后退动作
参数:
Speed:
速度系数(0~255);
TimeFactor:
时间系数(X10ms,X100ms,X1000ms);
Seconds:
时间倍率(0~255);
时间倍率*时间系数=实际时间
voidBackward(unsignedcharSpeed,unsignedcharTimeFactor,unsignedcharSeconds)
write_pwm(POSITIVE_DIR,LEFT_MOTOR,NOT_STOP,TimeFactor,Speed,Seconds);
write_pwm(NEGATIVE_DIR,RIGHT_MOTOR,NOT_STOP,TimeFactor,Speed,Seconds);
驱动电机右转函数
左右电机正转,以不一样的速度旋转,完成右转动作
voidRight(unsignedcharSpeed,unsignedcharTimeFactor,unsignedcharSeconds)
write_pwm(POSITIVE_DIR,RIGHT_MOTOR,NOT_STOP,TimeFactor,Speed,Seconds);
驱动电机左转函数
左右电机反转,以不一样的速度旋转,完成左转动作
voidLeft(unsignedcharSpeed,unsignedcharTimeFactor,unsignedcharSeconds)
write_pwm(NEGATIVE_DIR,LEFT_MOTOR,NOT_STOP,TimeFactor,Speed,Seconds);
驱动电机前进函数
左电机反转,右电机正转,以同样的速度旋转,完成后退动作
voidForward(unsignedcharSpeed,unsignedcharTimeFactor,unsignedcharSeconds)
(三)、头文件及PWM_Init()函数说明
uart.h:
硬串口的相关程序。
包含该文件后,在程序中调用uart_Init()函数,即可完硬串口的初始化。
soft_rs232.h:
TTL-RS232的实现程序。
在该文件中,可修改TTL-RS232的通信波特率以及输出端口。
如果在设置的TTL-RS232数据输出端口外接一个RS232电平转换芯片并搭载DB9串口接口,这样相当于构建了C51平台上的第二个串口。
该程序构建的串口为单工串口。
Movement.h:
该文件提供了龙人贝塔的运动控制函数的范例。
在包含该文件之前,请包含BetaRobot.h文件。
否则,在编译程序的时候会出现错误。
PWM_Init()函数的作用是为初始化第一层与第二层之间的TTL串口连接。
其中TTL串口的数据输出口定义为P1.0口,在程序设计的过程中,请回避该端口,避免引起机器人运动控制的错误。
在KEIL工程中,如果要使用到机器人的运动控制部分,那么在主程序的开头部分,就必须首先执行该函数,进行TTL串口初始化。
五、步行机器人走“日”字
#include<
WalkingRobot.h>
uart.h>
#defineuint16_tunsignedint
#defineStrideServoP1_0//strideservo
#defineTiltServoP1_1//Tiltservo
#defineMoveDelay15//inmstime
#defineTiltStep25//stepsize
#defineStrideStep25//stepsize
#defineRightTilt1200//tiltlimits
#defineCenterTilt1500
#defineLeftTilt1800
#defineRightStride1800//stridelimits
#defineCenterStride1500
#defineLeftStride1200
//movementstatenumbers:
#defineTL0//representationoftiltleft
#defineTC1//representationoftiltcenter
#defineTR2//representationoftiltright
#defineSL3//representationofstrideleft
#defineSC4//representationofstridecenter
#defineSR5//representationofstrideright
#definexx255//endrepresentation
intcodeWalkForward[5]={TR,SL,TL,SR,xx};
//statetable
intcodeWalkBackward[5]={TR,SR,TL,SL,xx};
intcodeTurnLeft[5]={TL,SR,TC,SL,xx};
intcodeWideTurnLeft[9]={TL,SR,TC,SL,TR,SL,TL,SR,xx};
intcodeTurnRight[5]={TR,SL,TC,SR,xx};
intcodePivotRight[9]={TR,SL,TC,SR,TL,SL,TC,SR,xx};
//--------------------[variables]---------------------------------------------
intMoveLoop;
//looptimesofrepeatmovement
uint16_tPulses;
//pulsesvariable
uint16_tCurrentTilt;
//
uint16_tCurrentStride;
uint16_tNewValue;
int*Mx;
//statetableindex
//--------------------[movementroutines]---------------------------------------------
voidMovementTilt(void)//tilt
intstep;
Pulses=CurrentTilt;
if(Pulses>
NewValue)
step=-TiltStep;
else
step=TiltStep;
while(Pulses!
=NewValue)
{
TiltServo=1;
delay_nus(Pulses);
TiltServo=0;
StrideServo=1;
delay_nus(CurrentStride);
StrideServo=0;
delay_nms(MoveDelay);
Pulses=Pulses+step;
}
CurrentTilt=NewValue;
voidMovementStride(void)//stide
Pulses=CurrentStride;
step=-StrideStep;
step=StrideStep;
delay_nus(CurrentTilt);
CurrentStride=NewValue;
//--------------------[subroutines]---------------------------------------------
voidResetCC(void)//moveinitial
CurrentTilt=CenterTilt;
CurrentStride=CenterStride;
for(Pulses=0;
Pulses<
=10;
Pulses=Pulses+StrideStep)
{
delay_nus(CenterTilt);
delay_nus(CenterStride);
voidMovement(void)//movebydatatablereferencedbyMx
while(*Mx!
=xx)
switch(*Mx)//比3小,执行MovementTilt()
case0:
{NewValue=LeftTilt;
MovementTilt();
break;
case1:
{NewValue=CenterTilt;
case2:
{NewValue=RightTilt;
case3:
{NewValue=LeftStride;
MovementStride();
case4:
{NewValue=CenterStride;
case5:
{NewValue=RightStride;
Mx++;
//INPUT;
Mx=tableindex;
END:
Mx=xx
}
//--------------------------------------[Main]--------------------------------------
intmain(void)
{
uart_Init();
printf("
Programstarted!
\r\n"
);
ResetCC();
for(MoveLoop=1;
MoveLoop<
MoveLoop++)//WalkForward
Mx=WalkForward;
Movement();
}
=7;
MoveLoop++)//turnright
Mx=TurnRight;
Movement();
=5;
Mx=FinishForward;
//end
}五、心得体会
通过这次对于机电综合实验的学习,从中获益良多。
首先让我对机电这门课程有了更加深入的了解,机械的自动化才是机械的最终走向,随着几点这门学科越来越发展,他的研究领域将会变得更加广泛,成果也将越来越多的应用于人们的生产生活实践中。
同时通过这次实践我也更加体会到了团队协作的重要性,在未来的工作学习中我们也将会碰到越来越多需要团队协作才能更好完成的事情,所以团队的重要性是不言而喻的,我们要不断的从团队中学习,更加的要把自己融入团队之中,只有这样我们才能不断进步。
参考文献
《步行机器人与高级C程序设计》秦志强
《C51单片机应用与C语言程序设计》秦志强,电子工业出版社;