|
本帖最后由 hongxiansheng 于 2016-1-15 22:50 编辑
大家互相交流一下,我们三个做的车也是费劲心力,前后三次拆装,代码更不用说了,现在分享给大家
作者:酒英凯、何伟、张跃
日期:2015年1月12日
智能车现状:
智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车,远程传输图像等功能。智能小车可以分为三部分——传感器部分、控制器部分、执行器部分。控制器部分:接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。好比人的大脑。执行器部分:驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。对机器人小车来说,最基本的就是轮子。这部分就好比人的四肢一样。传感器部分:机器人用来读取各种外部信号的传感器,以及控制机器人行动的各种开关。好比人的眼睛、耳朵等感觉器官。
实验目的:
本实验主要是针对小车在位置环境下的探测,利用超声波和红外模块实现自动避障功能
利用L298N驱动对小车的电机进行控制,利用超声波传感模块、红外传感模块实现对小车前方、左方、右方障碍的探测,将探测结果返回单片机,利用函数实现智能小车的避障功能。
实验原理
一、电路连接
超声模块:将模块连接入电路,主要运用于智能小车的正前方探测。共有四个引脚,其中Vcc连接5V电源,trig端为超声波传感模块的控制端口,echo为超声波传感模块的接收端口,GND为地线。其原理为,控制端控制发出超声波,接收端进行接收,利用其在空气中传播的速GND为底线度与控制与接收的时间差来计算,得到距离大小。
红外避障模块:红外避障模块主要应用于智能小车前方两侧的障碍探测。其共有三个引脚,其中Vcc连接5V电源,GND为地线,DO为接收端。当红外避障模块探测到障碍时,DO返回端得到低电平。
LED作用:LED在此用作警示灯作用,利用超声探测得到的距离,对危险情况做出分类,在不同分类的情况下LED闪烁的频率不同,安全时LED常亮。
实物连接如下:
制作过程
(1)购买所需零器件:
元件 数量
电机 2
L298N驱动模块 1
220Ω电阻 1
面包板 1
面包板跳线 1(扎)
蓝色M5 直插LED 1
超声波模块 1
红外避障模块 2
小车底板 1
万向轮 1
电机车轮 2
螺钉螺母 若干
(2)测试超声模块,并利用超声往返时间差测得超声模块前方距离,输出至电脑,观察其是否正常工作。
测试红外避障模块,当其探测到障碍时,返回值是否为低电平,输出至电脑进行观察检测。
(3)结合超声模块与红外模块,将其前方的危险情况分类(由自身确定),并结合LED闪烁进行示警。
(4)连接L298N驱动模块,注意连接时电机的正反方向,防止电机反向工作,小车原地打转。
(5)连接并组装小车,带入程序,根据小车的速度、电机的实际情况来调整超声波测距模块与红外避障模块的警示距离,并进一步调整程序。达到智能小车的最佳避障效果。
程序设计流程
实验总结
一、作品用途
由与智能小车的自动避障功能,可以使智能小车在未知地点进行探测,省去人力所不能或不愿去的地方,减免不必要的麻烦或危险。
二、作品不足
(1)超声探测模块对距离的探测不够准确,在探测过程中会偶尔出现一些不准确数值。这些不准确数值会影响到超声模块的作用,影响智能小车的避障前行,导致不断转弯或倒退。
(2)智能小车的整体探测功能存在一定时延,导致小车存在在探测到障碍时未能及时停下的问题,需要对探测距离进行一定调整,对函数实现进一步调整,达到正常避障效果。
(3)对于单片机,5V电压供电有时不能带动驱动模块驱动小车,可以将单片机的供电由驱动模块来提供,达到足够电压。
附件:
#define IN1 4
#define IN2 5 //定义In1接arduino的4引脚,In2接5引脚
#define IN3 6
#define IN4 7 //定义IN3接arduino的6引脚,IN4接7引脚
int zhw=8;
int yhw=9;
int LedPin=13; //定义13接口为灯闪烁
int Echo_Pin=11;
int Trig_Pin=12; //定义超声波Echo接口和Trig接口
int cm;
int L;
void forward( );
void back( );
void turnLeft( );
void turnRight( );
void turnbackLeft( );
void turnbackRight( );
void turnLeftOrigin( );
void turnRightOrigin( );
void _stop();
void setup()
{
Serial.begin(9600); //波特率为9600
pinMode(Trig_Pin, OUTPUT);
pinMode(Echo_Pin, INPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(zhw, INPUT);
pinMode(yhw, INPUT);
pinMode(LedPin,OUTPUT); //定义LED8口为输出
}
void loop()
{
zhw=digitalRead(8);yhw=digitalRead(9);//读取前面的避障模块状态
//zhw=digitalRead(8);yhw=digitalRead(9);//读取前面的避障模块状态
/*******************************超声波距离 *************************************/
digitalWrite(Trig_Pin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(Trig_Pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_Pin, LOW);
cm = pulseIn(Echo_Pin, HIGH) / 58.0; //将回波时间换算成cm
//cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(200);
L=cm;
/*******************************警示灯 *************************************/
if(L>30||zhw==0||yhw==0)
{
digitalWrite(LedPin,HIGH);
}
if((L>15&&cm<=30)||zhw==0||yhw==0)
{
digitalWrite(LedPin,HIGH);
delay(200);
digitalWrite(LedPin,LOW);
delay(60);
}
if((L>5&&cm<=15)||zhw==0||yhw==0)
{
digitalWrite(LedPin,HIGH);
delay(100);
digitalWrite(LedPin,LOW);
delay(30);
}
if(L<=5||zhw==0||yhw==0)
{
digitalWrite(LedPin,HIGH);
delay(30);
digitalWrite(LedPin,LOW);
delay(10);
}
//zhw=digitalRead(8);yhw=digitalRead(9);//读取前面的避障模块状态
if(L>30)forward( );
if(digitalRead(8)==0&&digitalRead(9)==1)
{
_stop();
delay(500);
turnRight();
delay(350);
}
else
{
if(digitalRead(9)==0&&digitalRead(8)==1)
{
_stop();
delay(500);
turnLeft();
delay(350);
}
else
{
if(digitalRead(9)==0&&digitalRead(8)==0)
{
_stop();
delay(500);
back();
}
else
{
if(L<30)
{
_stop();
delay(500);
back();
delay(300);
turnRightOrigin();
}
}
}
}
}
void forward( )
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW); //左轮前进
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW); //右轮前进
}
/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH); //左轮后退
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH); //右轮后退
}
/**************************************************
turnLeft子函数——左转子函数
函数功能:控制车左转
**************************************************/
void turnLeft( )
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW); //左轮静止不动
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW); //右轮前进
}
/**************************************************
turnbackLeft子函数——左后转弯子函数
函数功能:控制车左后转弯
**************************************************/
void turnbackLeft( )
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW); //左轮静止不动
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH); //右轮后退
}
/**************************************************
turnRight子函数——右后转弯转子函数
函数功能:控制车右后转弯
**************************************************/
void turnRight( )
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW); //左轮前进
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW); //右轮静止不动
}
/**************************************************
turnbackRight子函数——右转子函数
函数功能:控制车右转
**************************************************/
void turnbackRight( )
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH); //左轮后退
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW); //右轮静止不动
}
/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH); //左轮后退
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW); //右轮前进
}
/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW); //左轮前进
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH); //右轮后退
}
/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW); //左轮静止不动
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW); //右轮静止不动
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|