机器人课程结课总结报告汇编Word格式.docx
《机器人课程结课总结报告汇编Word格式.docx》由会员分享,可在线阅读,更多相关《机器人课程结课总结报告汇编Word格式.docx(58页珍藏版)》请在冰点文库上搜索。
1.循迹程序:
小车循迹程序思路图
#include<
Servo.h>
intLeft_motor_back=8;
//左电机后退(IN1)
intLeft_motor_go=9;
//左电机前进(IN2)
intRight_motor_go=10;
//右电机前进(IN3)
intRight_motor_back=11;
//右电机后退(IN4)
intkey=7;
//定义按键数字7接口
constintSensorRight=3;
//右循迹红外传感器(P3.2OUT1)
constintSensorLeft=4;
//左循迹红外传感器(P3.3OUT2)
intSL;
//左循迹红外传感器状态
intSR;
//右循迹红外传感器状态
voidsetup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT);
//PIN8(PWM)
pinMode(Left_motor_back,OUTPUT);
//PIN9(PWM)
pinMode(Right_motor_go,OUTPUT);
//PIN10(PWM)
pinMode(Right_motor_back,OUTPUT);
//PIN11(PWM)
pinMode(key,INPUT);
//定义按键接口为输入接口
pinMode(SensorRight,INPUT);
//定义右循迹红外传感器为输入
pinMode(SensorLeft,INPUT);
//定义左循迹红外传感器为输入
}
voidrun(inttime)//前进
voidrun()
digitalWrite(Right_motor_go,HIGH);
//右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,255);
//PWM比例0~255调速
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH);
//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,255);
analogWrite(Left_motor_back,0);
//delay(time*50);
//执行时间,可以调整
}//voidleft(inttime)//左转(左轮不动,右轮前进)
voidleft()
analogWrite(Right_motor_go,200);
digitalWrite(Left_motor_go,LOW);
//左轮后退
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,100);
voidright(inttime)//右转(右轮不动,左轮前进)
voidright()
digitalWrite(Right_motor_go,LOW);
//右电机后退
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,100);
digitalWrite
2.避障程序:
charL1=9;
//zheng
charL2=8;
charR1=10;
charR2=11;
intechopin=13;
inttrigpin=12;
voidsetup()//初始化动作的区块,定义串行端口和脚位
{pinMode(echopin,INPUT);
//pwm
pinMode(trigpin,OUTPUT);
voidloop()//版子重复执行动作的区块
{intcurrDist;
longrandnumber;
currDist=MeasureDistance();
//读取前端距离
delay(5);
if(currDist>
10)
{straight();
}
if(currDist<
=10)
{randomSeed(analogRead(0));
randnumber=random(0,10);
if(randnumber>
5)
{back();
delay(1000);
turnright();
delay(800);
else
{back();
delay(1000);
turnleft();
delay(800);
intMeasureDistance()
{digitalWrite(trigpin,LOW);
delay
(2);
digitalWrite(trigpin,HIGH);
delay(10);
digitalWrite(trigpin,LOW);
intdistance=pulseIn(echopin,HIGH);
distance=distance/58.0;
//计算距离344*100/1000000*pulseIn()/2
delay(60);
//循环间隔60uS
return(distance);
voidstraight()
{analogWrite(L1,100);
//2550zhengzhuan
analogWrite(L2,0);
analogWrite(R1,100);
analogWrite(R2,0);
voidturnright()
analogWrite(R1,0);
//2550zhengzhuan
analogWrite(R2,0);
voidturnleft()
{analogWrite(L1,0);
analogWrite(L2,0);
voidback()
analogWrite(L2,100);
analogWrite(R1,0);
analogWrite(R2,100);
实验过程中遇到的问题及解决办法
循迹中:
1.电机速度差异控制:
发现左右轮写入同一数值时,小车行进方向偏离直线,——对左右两轮写入不同数值,多次测试,指导左右轮速度相等。
2.电机驱动器给arduino供电出现问题,改用充电宝给arduino供电,直接从gnd和5v输出脚给电机驱动器供电
3.一个电机有两根信号输入线,一根控制正转,一根控制反转。
两个轮子一起测转地眼晕,容易出错。
避障中:
1.超声装置避障距离的确定——将HC-SR04超声波避障程序中数值改短,提高避障灵敏性
2.硬件的安装:
超声装置无法固定——曾尝试过用胶带,废旧车轮等但不理想,并未得到很好的解决
实验结果
小车可以成功的进行循迹和避障
实验二电子秤实验
一单臂实验
数据处理源码:
axis([0200050])
coords=[020406080100120140160180200;
02.85.17.59.912.414.817.219.622.024.6]
grid
hold
plot(coords(1,:
),coords(2,:
),'
*'
)
x=coords(1,:
y=coords(2,:
)'
b=size(coords)
c=ones(1,b
(2))
MT=[c;
x]
M=MT'
f=inv(MT*M)*MT*y
['
y='
num2str(f
(2)),'
x+'
num2str(f
(1))]
x=-max(x):
max(x)
y=f
(1)+f
(2)*x
mistake=max(x-y)/(max(y)-min(y));
fprintf('
电阻传感器的系数灵敏度S=%5.3f%%\n'
abs(f
(2)))
非线性误差f=%5.3f%%\n'
mistake)
plot(x,y,'
--'
xlabel('
x/g'
ylabel('
V/mv'
title('
单臂实验'
legend(['
num2str(f
(1))])
Matlab处理结果
电阻传感器的系数灵敏度S=0.122%
非线性误差f=3.607%
半桥实验
源码:
axis([0200050])
04.08.813.718.623.518.433.238.243.147.9]
半桥实验'
电阻传感器的系数灵敏度S=0.238%
非线性误差f=1.615%
全桥实验
axis([02000100])
07.415.323.130.938.846.754.662.670.578.4]
全桥实验'
Matlab数据处理
电阻传感器的系数灵敏度S=0.393%
非线性误差f=0.774%
了解PWM波控制电机的原理。
基于C51单片机利用PWM波控制电机。
实验器材
C51单片机、L298N驱动芯片、直流电机、杜邦线、普通导线、keil软件、STC下载器、示波器
实验内容
用keil新建一个“.c”文件,编写程序并对程序进行调试。
将程序烧录进单片机内。
进行硬件连接
C51引脚如图所示:
L298N引脚如图所示:
用单片通过P1.0、P1.1和L298的第一对输入端IN1和IN2相连,然后又L298的第一对输出端OUT1和OUT2与直流电机相连;
单片通过P1.5、P1.6和L298的第二对输入端IN3和IN4相连,然后又L298的第二对输出端OUT3和OUT4与直流电机相连。
给单片机上电。
用示波器观察波形。
程序内容
1、PWM波控制电机启动
#include"
reg51.h"
intrins.h"
#defineFOSC11059200L
typedefunsignedcharBYTE;
typedefunsignedintWORD;
voiddelay_ms(intx);
/*DeclareSFRassociatedwiththePCA*/
sfrCCON=0xD8;
//PCAcontrolregister
sbitCCF0=CCON^0;
//PCAmodule-0interruptflag
sbitCCF1=CCON^1;
//PCAmodule-1interruptflag
sbitCR=CCON^6;
//PCAtimerruncontrolbit
sbitCF=CCON^7;
//PCAtimeroverflowflag
sfrCMOD=0xD9;
//PCAmoderegister
sfrCL=0xE9;
//PCAbasetimerLOW
sfrCH=0xF9;
//PCAbasetimerHIGH
sfrCCAPM0=0xDA;
//PCAmodule-0moderegister
sfrCCAP0L=0xEA;
//PCAmodule-0captureregisterLOW
sfrCCAP0H=0xFA;
//PCAmodule-0captureregisterHIGH
sfrCCAPM1=0xDB;
//PCAmodule-1moderegister
sfrCCAP1L=0xEB;
//PCAmodule-1captureregisterLOW
sfrCCAP1H=0xFB;
//PCAmodule-1captureregisterHIGH
sfrPCAPWM0=0xf2;
sfrPCAPWM1=0xf3;
sbitIN1=P1^0;
sbitIN2=P1^1;
sbitIN3=P1^5;
sbitIN4=P1^6;
voidmain()
CCON=0;
//InitialPCAcontrolre
CL=0;
//ResetPCAbasetimer
CH=0;
CMOD=0x02;
//SetPCAtimerclocksourceasFosc/2
CR=1;
//PCAtimerstartrun
while
(1)
{
inti;
IN1=0;
IN2=1;
IN3=0;
IN4=1;
for(i=100;
i>
=0;
i--)
{
CCAP0H=CCAP0L=i;
//PWM0portoutput50%dutycyclesquarewave
CCAPM0=0x42;
//PCAmodule-0workin8-bitPWMmodeandnoPCAinterrupt
CCAP1H=CCAP1L=i;
CCAPM1=0x42;
delay_ms(100);
for(i=0;
i<
=100;
i++)
IN1=1;
IN2=0;
IN3=1;
IN4=0;
voiddelay_ms(intx)
inty;
for(;
x>
0;
x--)
for(y=0;
y<
1000;
y++);
控制方向
sbitIN1=P1^0;
IN2=1;
PWM波对电机调速
//PCAmodule-0captureregisterLO