找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1964|回复: 0
打印 上一主题 下一主题
收起左侧

单片机循迹避障车教程

[复制链接]
跳转到指定楼层
楼主
ID:411046 发表于 2018-10-17 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
循迹避障车教程需要材料:直流电机4只                 小车底盘2个
  车轮4个
  超声波模块1个
  红外探测模块2个
  L298N电机驱动模块1个
  杜邦线若干
                 1.5V电池8节(12V电源)
  万能板一个
  Arduino开发板一个
  M3螺丝螺母若干
原理讲解1.小车前进后退转弯原理其输入输出对应真值表如下(以LN1,LN2,OUT1,OUT2为例):
  

模块中ENA,ENB分别为两个电机的调速口,在Arduino中接PWM数字口,利用PWM调节速度(如果不需要此功能直接接到5V电源)。    试验中,我将左侧两个电机并联到OUT1,OUT2口,右侧两个电机并联到OUT3,OUT4口。以一个方向为参考方向(即正向),电机极性一定要清楚,OUT1,OUT3接正向,OUT2,OUT4接反向。下面是电机输出结果表
  

2.循迹原理    其工作方式是白色红外发光管发射红外光,经过反射被黑色接收管接收,接收到了返回高电平,否则低电平。原理:
由于黑色具有吸收光线的作用,当小车到达黑色部分时,其发射光被吸收,返回低电平,达到检测路径的功能。
此时,小车的位置相对于轨迹来说,偏右,我们应该左转矫正位置。同理,偏左应该右转
当两面探头都不在,或都在轨迹上,那么前进。
3.超声波避障原理知识1  超声波
超声波是一种频率高于20000赫兹的声波,它的方向性好,穿透能力强,易于获得较集中的声能,可以在介质中传播,可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大于人的听觉上限而得名。超声波在空气中传播速度约340米/秒,随着温度的变化,传播速度有所变化。
知识2  超声波测速原理
超声波测速是利用超声波发射管发射超声波同时开始计时,收到发射回波后产生一个信号,将发射和接收到回波的时间乘以超声波在介质中的传播速度除以2就是超声波发射到物体的距离。利用超声波模块完成测速。
2.1 HC-SR04超声模块
HC-SR04有单片机STC11、升压ICMAX232及运算放大器TL074构成,HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器与控制器。超声波测速仪每隔一相等时间,发出一超声脉冲信号,每隔一段时间接收到物体反射回的该超声脉冲信号,根据发出和接收到的信号间的时间间隔差和声速,测出被测物体的距离。
基本工作原理:
采用IO口TGIG触发测距,给至少10us的高电平信号;
模块自动发送8个40KHz的方波,自动检测是否有信号返回;
有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340m/s))/2.
参数的设置
时序图的说明
以上时序图表明你在只需要提供一个10us以上脉冲触发信号,该模块内部将发出8个40KHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:us/58=厘米;或是:距离=高电平时间*声速(340m/s)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
注:1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。
2、测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果。
1.3原理图及模块实物
单片机超声模块说明(HC-SR04)
避障原理:利用测车子正前方障碍的距离,设定一个值,当距离小于这个值时,车子后退,或者转弯。具体程序代码
int IN1=7;
int IN2=8;
const int TrigPin = 13;
const int EchoPin = 12;
int ENA=5;//左直流电机
int IN3=9;
int IN4=10;
int ENB=6;//右直流电机
int IR_right=2;//定义右红外传感器引脚
int IR_left=3;//定义左红外传感器引脚
int IR_middle_1=A2;
int IR_middle_2=A3;//定义中间红外传感器引脚
int c;//用于保存超声波测出的距离

void forward()//前进
{
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,45);
  digitalWrite(IN4,LOW);
  digitalWrite(IN3,HIGH);
  analogWrite(ENB,45);
}
void backward()//后退
{
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,100);
  digitalWrite(IN4,HIGH);
  digitalWrite(IN3,LOW);
  analogWrite(ENB,100);
}
void left()//左转
{
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,100);
  digitalWrite(IN4,LOW);
  digitalWrite(IN3,HIGH);
  analogWrite(ENB,100);
}
void right()//右转
{
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,100);
  digitalWrite(35,HIGH);
  digitalWrite(36,LOW);
  analogWrite(ENB,100);
}
void stopp()//停止
{
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,HIGH);
  digitalWrite(IN3,HIGH);
  digitalWrite(IN4,HIGH);
  analogWrite(ENA,100);
  analogWrite(ENB,100);
}

void setup() {
  
  Serial.begin(9600);

  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);
  stopp();
  pinMode(IR_right,INPUT);
  pinMode(IR_left,INPUT);
  pinMode(IR_middle_1,INPUT);
  pinMode(IR_middle_2,INPUT);
}
void loop(){
    digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
    delayMicroseconds(2);
    digitalWrite(TrigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(TrigPin, LOW);
    delay(20);            //消除信号干扰
    c = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
    c = (int(c * 100.0)) / 100.0; //保留两位小数
   /*如果前方距离小于二十厘米,即前方有障碍,
    * 那么后退一步,转个方向
   */
    if(c<20){
        backward();
        delay(100);//自己去调试距离,下同
        right();
        delay(100);
      }
    int Right=digitalRead(IR_right);
    int  Left=digitalRead(IR_left);
    //如果中间为高电平,左、右为低电平
    //说明小车没有偏离轨道
   if((Middle_1==HIGH || Middle_2==HIGH)&&( Right==LOW && Left==LOW)){
   forward();
   }
    //如果右边为高电平,中间、左为低电平
    //说明小车偏右
    else if((Middle_1==LOW && Middle_2==LOW) && Right==HIGH && Left==LOW){
      right();//小车左转
   }  
//如果左边为高电平,中间、右为低电平
//说明小车偏左
    else if((Middle_1==LOW && Middle_2==LOW) &&Right==LOW && Left==HIGH){
    left();//小车右转
    }
//小车的3红外传感器距离可能导致3传感器都为低电平或者没检测到黑线3传感器都为高电平
//小车默认前进
    else{
   forward();
     }  
     }



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表