hongxiansheng 发表于 2016-1-15 22:45:12

避障小车,UNO+L298N,欢迎大神指教

本帖最后由 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);         //右轮静止不动
}

zk16 发表于 2016-1-30 17:14:56

不错的资料!能发个视频吗?

mikeliujia 发表于 2016-1-18 20:50:39

大家做的小车都棒棒哒:lol

xinxinzhihuo 发表于 2016-7-17 10:03:05

谢谢,下载了看一下

月上琉璃 发表于 2016-7-17 21:22:05

不错不错,楼主厉害啊。

勿忘初心龙 发表于 2017-7-21 15:48:53

学习学习。

心之梦魇qm 发表于 2017-12-13 09:37:56

有思路了,感谢楼主分享
页: [1]
查看完整版本: 避障小车,UNO+L298N,欢迎大神指教