
//舵机和超声波调试代码
#include <Servoh>
#include <Metroh>
Metro measureDistance = Metro(50);
Metro sweepServo = Metro(20);
unsigned long actualDistance = 0;
Servo myservo; //创建舵机
int pos = 60;
int sweepFlag = 1;
int URPWM = 3; //PWM输出0-25000us,每50us代表1cm
int URTRIG= 10; // PWM trigger pin PWM串口为10
uint8_t EnPwmCmd[4]={0x44,0x02,0xbb,0x01}; // distance measure command 距离测量命令
void setup(){ // Serial initialization 串行初始化
myservoattach(9); //舵机串口为9
Serialbegin(9600); // Sets the baud rate to 9600
SensorSetup();
}
void loop(){
if(measureDistancecheck() == 1){
actualDistance = MeasureDistance();
// Serialprintln(actualDistance);
// delay(100);
}
if(sweepServocheck() == 1){
servoSweep();
}
}
void SensorSetup(){
pinMode(URTRIG,OUTPUT); // A low pull on pin COMP/TRIG
digitalWrite(URTRIG,HIGH); // Set to HIGH
pinMode(URPWM, INPUT); // Sending Enable PWM mode command 发送使能控制模式命令
for(int i=0;i<4;i++){
Serialwrite(EnPwmCmd[i]);
}
}
int MeasureDistance(){ // a low pull on pin COMP/TRIG triggering a sensor reading 触发传感器读数
digitalWrite(URTRIG, LOW);
digitalWrite(URTRIG, HIGH); // reading Pin PWM will output pulses 读引脚脉宽调制将输出脉冲
unsigned long distance=pulseIn(URPWM,LOW);
if(distance==50000){ // the reading is invalid阅读无效
Serialprint("Invalid");
}else{
distance=distance/50; // every 50us low level stands for 1cm
}
return distance;
}
void servoSweep(){
if(sweepFlag ){
if(pos>=60 && pos<=120){
pos=pos+1; // in steps of 1 degree 1度角度的转动
myservowrite(pos); // tell servo to go to position in variable 'pos' 告诉舵机转动的角度
}
if(pos>119) sweepFlag = false; // assign the variable again 重新分配变量
}else {
if(pos>=60 && pos<=120){
pos=pos-1;
myservowrite(pos);
}
if(pos<61) sweepFlag = true;
}
}
////////////////////////////////////////////////////////////
需要加载一个Metroh的库,这只是调试机器,余下的完全看你的发挥了,加上电机
1.通过解决相关实际问题,以巩固、加深对嵌入式的认识和相关知识的理解,提高综合运用课程知识的能力。
2.熟悉与计算机相关的嵌入式方面的电子元器件和电路特性,能正确反映设计和实验成果,提高自主创新能力。
3.培养严肃认真的工作作风和严谨科学态度。通过课程设计实践,获得初步的应用经验,为以后从事生产和科研工作打下的坚实的基础。
4.培养根据课题需要选学参考书籍、查阅手册图表和文献资料的自学能力。通过独立思考,深入钻研有关问题,学会自己分析解决问题。
5.了解与课程有关的电子电路以及元器件技术规范,按课程设计任务书的要求编写设计说明书。提高自己的动手能力,培养严肃、认真的工作作风和科学态度。
6.为了完成一款自主设计、制作的嵌入式作品,以提升个人能力和队嵌入式的兴趣。
7.对避障小车的避障原理有充分的理解,掌握其避障的方法,能够对实验过程中出现的问题进行解决,发现问题,解决问题。
12 背景
学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的知识面广,易于拓展[1]。整个智能小车系统作为一个完整的系统,从它的原理图的实现到实物的完成的过程,不仅需要深厚的电子方面的知识,还有对电路实现的良好掌握,对于培养学生的实践能力都有重要的意义。智能小车的竞赛在我国各大高校中都受到了重视,吸引了大批的高校学生的兴趣,而且取得了很多优异的成果,为我国推进智能化的进程做出了巨大的贡献,也为智能汽车的发展提供了理论依据[2-3]。
只有当把理论和模型应用到实践中,这样的创新才用意义,我们国家这几年在智能化方面的进步越来越快,也推动了我国在国际社会上在智能化方面的话语权。智能小车是智能化的一部分,它的系统里的避障、循迹、红外遥控的技术用到了智能化,将智能化应用到传统技术上是21世纪发展的趋势。
我国虽然从改革开放以来大力发展科技创新,但是在智能化的创新水平与国外较发达的国家相比还有巨大的差距,智能竞赛在高校越来越流行,也证明了我国教育在这方面很快会赶上世界上的发展水平。本次设计是以单片机为电路板,通过编程和一些外围电路的设计来实现红外遥控,避障,循迹等功能。最重要的是把模型上的研究应用到实际生活中,智能车辆便做到了这一点[4-6]。在实际应用中比如在倒车的过程中实现的红外警报系统是以智能小车为模型而研发出来的。对于电子知识的热爱与钻研有利于研发更多智能车辆,使我们的生活更加便利、智能化。
本次课程设计主要任务是实现基于51单片机智能小车红外避障和循迹的主要功能应用。以红外避障的功能解决小车在不同的环境避开行走的障碍物,直到终点,以红外循迹的功能去感应黑线找到走出迷宫的线索为目标。让机器人小车变得更加灵活。
2 需求分析
智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动运作,不需要人为的管理,可应用于科学勘探等等用途;并且能实现显示时间、速度、里程,具有红外自动寻迹、避障等功能,可程控行驶速度、定位停车,远程传输图像、按键控启动K4让小车运行起来,利用红外传感器感应黑线进行寻迹,利用红外反射感应进行红外避障功能。
图1 智能小车设计思维导图
如图1所示,我们使用STC89C52RC单片机电路板控制整个机器人小车的功能,通过接线建立好小车的电路图连接以及通过C51书写红外避障以及循迹功能程序。在设计好的场地,从出发点到终点,通过现有的功能顺利躲开障碍物的干扰以及通过智能机器人寻找黑线的功能一直走好直线且顺利到达终点,完成任务。在车的模型上分析,我们也补充到了红外感应原理,红外传播通过我们学习物理光学知识后,能解决为什么避障反应慢的问题,并解决了。
如图2所示,智能小车初步构想流程图,让整个项目实现的目标更加清晰明了。利用红外传感器,其优点是对近距离的障碍物反应速度灵敏,不同方位的传感器之间信号不会相互干扰,最终选择红外传感器作为小车的眼睛,进行避障。
由于本次实验小车轮子没有实现转弯功能,所以通过设定左右两组轮子的不同前进速度来实现转弯功能。当向右转时,左侧轮子的速度要比右侧轮子的前进速度快,反之实现左转功能,此设计需小心谨慎,防止出现轮子不同步,无法实现转弯功能。
图2 智能小车功能模块流程图
3系统设计
31总体设计
311 设计思路
总体来说,这个程序设计还算比较简单,比较基础,目的就是要学会基本的应用,这个过程中利用红外线传感器发射和接收信号模块来控制单片机,让单片机翻译传输指令,从而实现相应的功能。具体的过程如下:四路红外传感器,每一路发射一个信号,检测接收到的信号,若出现高电平,则说明该方向前方有障碍物,则单片机控制电机正转和反转,从而实现绕开障碍物继续前行。同时还增加一个无线发射和无线接收模块控制单片机,让单片机翻译传输指令,从而实现相应的功能。无线发射模块发出指令,无线接收模块接收信号后,传递给单片机,单片机翻译接收到信号后,传输给驱动电路驱动电机旋转,从而实现让小车的前进、后退、左转和右转。
在主控制器模块上分析,采用STC89C52单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址 *** 作功能、价格低廉等优点。51单片机具有功能强大的位 *** 作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
实现自动寻迹等。基于单片机的循迹避障小车的设计与实现官网显示,设计意义为通过配合软件编程,可以很好的实现自动寻迹、避障的功能。arm单片机是以arm处理器为核心的一种单片微型计算机,是近年来随着电子设备智能化和网络化程度不断提高而出现的新兴产物。
循迹避障小车国内外研究现状简述目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论。智能循迹功能以智能导航系统为主要功能模块,帮助小车能够实现自主实现识别和判断正确路线的功能。智能循迹避障小车可以在没有人为管理的情况下实现智能寻迹导航功能以及避开阻碍障碍物功能,设定智能小车的预定模式,根据其预定的功能需求应用传感器技术、自动控制技术以及电机驱动技术等手段来完成小车的设计,并且探索开发新功能。该技术已经应用于仓库、无人驾驶车辆、服务机器人以及无人工厂等领域。以STC89C52单片机为控制核心,以红外反射开关传感器为主要器件的循迹模块判断白色路面中间的黑色预定路径;传感器数据即时传输回控制系统,系统将信号转换成单片机能够识别的数字信号。L298N作为驱动芯片构成双H桥以控制直流电机;软件系统采用C程序。小车运行过程中同时不间断地检测每个模块传感器的输入信号,循迹模块实时检测5路循迹模块在黑线跑道上的状态,在小车跑出设定限制范围以外的时候,智能汽车可以独立调整汽车的方向和位置。避障模块在智能汽车运行的可以同时探测前方是否有障碍物以及小车实时距离障碍物的距离,当前方障碍物距离小于20厘米时,小车将避开障碍物,向后折返继续循迹运行。LCD1602液晶显示器能够显示智能汽车和前方障碍物之间的距离,智能小车的驱动部分采用L298驱动芯片。此设计的电路结构简单,可靠性高,易于实现。
¥
59
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
循迹避障小车国内外研究现状简述
文柯天秤座
循迹避障小车国内外研究现状简述
目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论。智能循迹功能以智能导航系统为主要功能模块,帮助小车能够实现自主实现识别和判断正确路线的功能。智能循迹避障小车可以在没有人为管理的情况下实现智能寻迹导航功能以及避开阻碍障碍物功能,设定智能小车的预定模式,根据其预定的功能需求应用传感器技术、自动控制技术以及电机驱动技术等手段来完成小车的设计,并且探索开发新功能。该技术已经应用于仓库、无人驾驶车辆、服务机器人以及无人工厂等领域。
第 1 页
以STC89C52单片机为控制核心,以红外反射开关传感器为主要器件的循迹模块判断白色路面中间的
//包含所需头文件
#include <ioM16vh>
#include <macrosh>
#include"time1_inith"
#include"motorh"
#define ahead 1
#define backwards 0
#define compare(x,y) (x<y1:0)
#define mid 0X17
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x08;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x00;//初始值
OCR0 = 0x17;//匹配值
TIMSK |= 0x00;//中断允许
TCCR0 = 0x7D;//启动定时器
}
void adc_init(void)
{
//adc转换初始化
ADCSRA = 0x00; //禁止AD转换
ADCSRA|=BIT(ADIF);
ADMUX=0X46;
SFIOR |= 0x00;
ACSR = 0x80; //禁止模拟比较器
ADCSRA = 0xE7;
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer0_init();
timer1_init();
adc_init();
SEI();//开全局中断
}
uint sensor_head[3],sensor_back[3],cord; //存储6个传感器AD转换的值
uchar offset ; //黑线偏移小车中心轴的距离
uint sensor_compare_head[3]={300,300,300},sensor_compare_back[3]={300,300,300}; //判断黑线是否位于传感器下的阈值
uchar start_head_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X40;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X40+i; //启用前端传感器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_head[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_head[i-1],sensor_compare_head[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)
offset=sum2/j;
ADMUX=0X46;
ADCSRA=0xE7;
return offset;
}
uchar start_back_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X43;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X43+i; //启用前端传感器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_back[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_back[i-1],sensor_compare_back[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)offset=sum2/j;
ADMUX=0X46;
ADCSRA=0XE7;
return offset;
}
//角度传感器滤波函数
uint cord_sensor(void)
{
uchar i;
uint max=0,min=1023,sum=0;
for(i=0;i<5;i++)
{
ADCSRA|=BIT(ADIF);
while(!(ADCSRA&BIT(ADIF)));
cord=ADC;
sum+=cord;
max=(max>cord)max:cord;
min=(min<cord)min:cord;
}
return (sum-max-min)/3;
}
void direc_ctrl(uchar x,uchar y)
{
if(y)
{
if(x==0)OCR0=mid+3;
if(x==4)OCR0=mid-3;
if(x==2) OCR0=mid;
}
else OCR0=mid+x-2;
}
void menmber_path(void)
{
uchar j;
uint i;
uint max_head[3]={0,0,0},min_head[3]={1023,1023,1023},max_back[3]={0,0,0},min_back[3]={1023,1023,1023};
for(i=4000;i;i--)
{
start_head_sensor();
for(j=0;j<3;j++)
{
max_head[j]=(max_head[j]>sensor_head[j])max_head[j]:sensor_head[j];
min_head[j]= (min_head[j]<sensor_head[j])min_head[j]:sensor_head[j];
}
start_back_sensor();
for(j=0;j<3;j++)
{
max_back[j]=(max_back[j]>sensor_back[j])max_back[j]:sensor_back[j];
min_back[j]= (min_back[j]<sensor_back[j])min_back[j]:sensor_back[j];
}
}
for(j=0;j<3;j++)
{
sensor_compare_head[j]=(max_head[j]+min_head[j])/2;
sensor_compare_back[j]=(max_back[j]+min_back[j])/2;
}
}
uchar head_sensor_all(void)
{
start_head_sensor();
if( compare(sensor_head[0], sensor_compare_head[0]) && compare(sensor_head[1], sensor_compare_head[1]) && compare(sensor_head[2], sensor_compare_head[2]))
return 1;
else
return 0;
}
uchar back_sensor_all(void)
{
start_back_sensor();
if( compare(sensor_back[0], sensor_compare_back[0]-30) && compare(sensor_back[1], sensor_compare_back[1]-30) && compare(sensor_back[2], sensor_compare_back[2]-30))
return 1;
else
return 0;
}
void search_path_ahead(uchar speed)
{
motor_autorun(ahead,speed);
while(1)
{
if(head_sensor_all())
{
motor_stop();
return;
}
else
{
direc_ctrl(offset,1);
}
}
}
void search_path_backward(uchar speed)
{
motor_autorun(0,speed);
while(1)
{
if(back_sensor_all())
{
motor_stop();
return;
}
else
direc_ctrl(offset,0);
}
}
以上就是关于求arduino避障小车程序,急!(高额悬赏)全部的内容,包括:求arduino避障小车程序,急!(高额悬赏)、keil小车避障功能的作用、基于arm单片机的智能小车循迹避障设计意义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)