arduino黑线循迹小车程序_循迹小车:给我一条线,我能自己走完全程

在老少通吃的智能小车到底是什么呢?科普来喽!一文中,我们介绍了智能小车的分类及组成,为什么循迹小车能够追踪黑线轨迹呢?

智能小车在画有黑线的白纸 “路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线利用了简单、应用比较普遍的检测方法—发光二极管+光敏电阻。发光二极管+光敏电阻,即利用光线在不同颜色的物理表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射白光,当白光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

让我们一起来试验一下吧!

一.实验说明

1、使用寻线传感器控制开发板自带LED。

2、红外寻迹模块是利用红外线反射的原理,根据反射的强度来判定颜色。本寻迹模块是用来识别黑白线,黑线输出低电平,白线输出高电平。

二.物料清单

450f34670141260589ca0f1666cb429c.png

三.模块说明

5d5cb40b3b026217f32efe6fac631320.png

四.连线图

d771f47237b8bd1c0c8b40a2353c8269.png

五.实验代码

int num1;int num2;int num3;int num4;int num5;void setup(){ pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); //定义该接口为接口为输入接口 pinMode(13,OUTPUT);}void loop(){ num1 = digitalRead(7); num2 = digitalRead(8); num3 = digitalRead(9); num4 = digitalRead(10); num5 = digitalRead(11); //读出信号接口的值 if (num1 ==LOW) { //如果1号传感器监测到黑线,灯亮一次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num2 == LOW) { //如果2号传感器监测到黑线,灯亮两次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num3 == LOW) { //如果3号传感器监测到黑线,灯亮三次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num4 == LOW) { //如果4号传感器监测到黑线,灯亮四次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); } else if (num5 == LOW) { //如果5号传感器监测到黑线,灯亮五次 digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(5000); }}

六.相关介绍

1、寻线传感器

寻线传感器是光电传感器的一种,是根据反射式光电传感器原理开发的专用机器人产品,可以帮助你的机器人进行白线或黑线跟踪,可以检测白底中的黑线,也可以检测黑底中的白线。寻线反馈信号可以提供稳定的TTL电平输出(开关量),使寻线更准确更稳定。其可用于光电测速、程控小车寻线,是轮式机器人的必备传感器。

2、光电传感器

光电传感器是各种光电检测系统中实现光电转换的关键元件,它是把光信号(红外、可见及紫外光辐射)转变成为电信号的器件。由于光电传感器具有结构简单、重量轻、体积小、响应快、性能稳定及具有很高的灵敏度等优点,因此在检测和自动控制等领域中应用广泛。

光电传感器按其工作原理可分为模拟式和脉冲式两类。所谓模拟式,是指光敏器件的光电流的大小随光通量的大小而变,为光通量的函数。而脉冲式光敏器件的输出状态仅有两种稳定的状态,也就是“通”与“断”的开关状态,即光敏器件受光照时,有电信号输出,不受光照射时,无电信号输出。

光电传感器在工业应用中可归纳为直射式、透射式、反射式和遮蔽式等四种基本形式。Mini红外寻线传感器是根据反射式光电传感器原理开发设计的,所以简单介绍下此种工作方式。当光源发射出的光通量(红外线)投射到被测物体上,被测物体又将部分光通量反射到光敏器件上。反射的光通量取决于被测物体的反射条件。该形式常用于表面测量和转速测量。

七、总结和经验

根据以上原理我们设计了一个智能循迹小车,经过不断调试最终能在规定的黑线跑道上行驶。智能循迹小车作为机器人的典型代表,能够实现自动导引功能。它的原理是主要通过传感器来感知导引线实现自动识别路线,选择正确的行进路线,并作出判断和相应的执行动作。

b20c46de4d23ff3747507c32ef1c0147.png

此次循迹小车由5个传感器传输信号,中间传感器检测黑线小车直行,左右各2个负责转弯,当检测到黑线时,循迹模块红灯亮起,管脚读取值为0,检测到白线时红灯熄灭,管脚读取值为1。

这里的循迹是指小车在白色地板上循黑线行走,采取的方法是红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。

在我们对小车进行调试的过程中,遇到了几个问题,现进行总结,希望对大家有所帮助。

1、传感器检测距离原理上为0.5~40mm,但小车前方五个循迹传感器灵敏度很低,需紧贴地面才能识别到黑线,导致传感器与地面摩擦影响小车行驶。

2、小车左右两个电机电压分配不平均。虽然不影响小车循迹但是对转向大小的修改产生一定影响,导致左右轮转不一致,要注意调节左右转轮速度。

3、一开始程序设定处两侧灯检测到黑线以外,所有情况均直行。但这种方法不适合直角等角度拐角过大的弯道,总会超出跑道,于是我们修改了代码,只有中间检测到黑线才会执行,两侧检测到黑线则拐弯。

但是随之产生的问题是小车摇摆剧烈,经过修改代码参数,我们把摇摆幅度降到了最低。当遇到直角转弯,或者急转弯的时,可将一次车轮转速设为0,加大转向幅度。

4、开始时if-else语句过于复杂给小车运行带来了一定的延迟。此时选择代码优先级,当碰到3个灯同时亮时,if else语句优先执行第一个满足条件的语句,同时要注意处理好转向问题。

代码如下:

#include "config.h"int right1;int right2;int middle;int left2;int left1;void setup(){ setPin();}void loop(){ readDigitalValue(); judge(); //delay(50);}/*定义接口模式*/void setPin(){ pinMode(SensorRight1, INPUT); pinMode(SensorRight2, INPUT); pinMode(SensorMiddle, INPUT); pinMode(SensorLeft2, INPUT); pinMode(SensorLeft1, INPUT); pinMode(right, OUTPUT); pinMode(left, OUTPUT);}/*读出信号接口的值*/void readDigitalValue(){ right1 = digitalRead(SensorRight1);  right2 = digitalRead(SensorRight2); middle = digitalRead(SensorMiddle); left2 = digitalRead(SensorLeft2); left1 = digitalRead(SensorLeft1);}/*对运行状态进行判断并作出响应*/void judge(){ if(right1==low&&right2==low&&left2==low){ analogWrite(right,0); analogWrite(left,180); } else if (right1 ==low) turnRightRapidly(); else if (right2== low) turnRight(); else if (middle== low) goStraight(); else if (left2 == low) turnLeft(); else if(left1 == low) turnLeftRapidly(); //else goStraight();}/*直行 返回值为空*/void goStraight(){ analogWrite(right,speedLow); analogWrite(left,speedSpecial);}/*快速左转 当检测到左侧第一个信号灯信号时 返回值为空*/void turnLeftRapidly(){ analogWrite(right,0); analogWrite(left,speedHigh);}/*快速右转 当检测到右侧第一个信号灯信号时 返回值为空*/void turnRightRapidly(){ analogWrite(right,speedHigh); analogWrite(left,0);}/*左转 当检测到左侧第二个灯信号时 返回值为空*/void turnLeft(){ analogWrite(right,20); analogWrite(left,speedMiddle);}/*右转 当检测到右侧第二个灯信号时 返回值为空*/void turnRight(){ analogWrite(right,speedMiddle); analogWrite(left,20);}配置文件 /* * right 右电机pwm输出引脚 * left 左电机pwm输出引脚 * low 检测到黑线,指示灯亮 * high 检测到白线,指示灯灭 * speedHigh 高速pwm值 * speedMiddle 中速pwm值 * speedLow 低速pwm值 * speedSpecial 直行左轮速度pwm值,调节两个电机转速误差 * SensorRight1 右侧第一个信号灯的引脚 * SensorRight2 右侧第二个信号灯的引脚 * SensorMiddle 中间信号灯的引脚 * SensorLeft2 左侧第二个信号灯的引脚 * SensorLeft1 左侧第一个信号灯的引脚 * right1 读取的右侧第一个信号灯的信号 * right2 读取的右侧第二个信号灯的信号 * middle 读取的中间信号灯的信号 * left2 读取的左侧第二个信号灯的信号 * left1 读取的左侧第一个信号灯的信号 */ #define right 3  #define left 6 #define low 0  #define high 1 #define speedHigh 222 #define speedMiddle 150 #define speedLow 70 #define speedSpecial 80 #define SensorRight1 4 #define SensorRight2 5 #define SensorMiddle 9 #define SensorLeft2 10 #define SensorLeft1 12

关注我们的微信公众号:xunmingiot,后台回复“智能小车”,即可免费获得智能小车超级详细的制作视频,更可以获取Arduino教程以及其他学习资源。有任何问题欢迎评论或在后台留言!

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页