循迹避障车教程需要材料:直流电机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();
}
}
|