背景

在使用灰度传感器制作巡迹小车时,传统循迹方法通常采用三灰度循迹,即在小车车体的左中右三个位置分别放置三个灰度传感器,根据传感器是否触发或是传感器返回的数值大小来判断车体的三种位置状态:中正、偏左、偏右,但是这样的循迹方式有一个很大的缺点,当车体发生一次歪斜之后,继续巡线过程中车体左右摇摆严重,非常影响小车前进速度以及前进方向的稳定。
本文提出一种双灰度传感器巡黑线的方案,经过实际验证,该方案很好的解决了上述问题。

传统的三灰度循迹传感器放置方案

注意: 在下面的图中,棕色的方形块和四个蓝色的圆柱表示一个小车的车体,眼睛表示灰度传感器,黑色的半透明阴影表示黑色的循迹线。
图1.直行状态(从底部向上看)

图2.左偏状态(从底部向上看)
通常情况下,当车体歪斜一个不小的角度时,小车右边的传感器才能检测到黑色,然后执行右转的代码,使车体回正,如下图所示;

图3.执行回正代码后小车状态(从底部向上看)
在回正的过程中,代码逻辑是要小车转向直到中间传感器检测到黑色,完成转向后,小车的状态通常是这样;此时中间传感器检测到黑线,判断为中正,保持直行,但是这样走一小段距离,小车左边传感器就检测到了黑线,又要往左转向,然后车体再次歪斜,再往右转向;如此周而复始,就造成了小车循迹过程中左右摇摆的现象。

图4.传统循迹方法下的小车轨迹

尝试新的传感器放置方案

为解决上述问题,我想了很多种方案,比如:

  • 在车体前部两侧放置两个传感器
    图5.双灰度并排两侧放置(从底部向上看)
  • 在车体前部放置五个传感器
    图6.五灰度并排放置(从底部向上看)
  • 在车体前部中间放一个传感器,后面两侧放两个传感器
    图7.三灰度三角形放置(从底部向上看)
  • 在车体前部中间放一个传感器,中部两侧放两个传感器,后部中间放一个传感器
    图8.四灰度四边形放置(从底部向上看)

    以上方案经过测试,都没有很好的解决左右摇摆的问题。
    最终在测试中,发现了下面的双灰度传感器并排中置方案,经过实际测试,发现巡线效果大幅提升,车体运行十分平稳。

双灰度传感器并排中置方案

注意: 在下面的图中,棕色的方形块和四个蓝色的圆柱表示一个小车的车体,两个眼睛表示两个灰度传感器,黑色的半透明阴影表示黑色的线。

  • 如图9所示,两个灰度传感器均能检测到黑色,此时车体中正,保持直行。
    图9.直行状态(从底部向上看)

    图10:对应的俯视图
  • 如图11所示,小车右边的传感器(对应仰视图的左边)检测不到黑线,而左边传感器(对应仰视图的右边)检测到了黑线,此时小车向右偏,应该左转。
    图11.左转状态(从底部向上看)

    图12.对应的俯视图
  • 如图13所示,小车左边的传感器(对应仰视图的右边)检测不到黑线,而右边传感器(对应仰视图的左边)检测到了黑线,此时小车向左偏,应该右转。
    图13.右转状态(从底部向上看)

    图14.对应的俯视图

    由于两传感器距离黑线边界较近,且传感器位置放置在车头处,车体稍稍发生一点偏斜,就立即触发转向程序,因而能及时纠正车体位置,不至于当车体偏离很大的角度后才触发转向,避免了左右摇摆的现象。
    图15.循迹效果示意

2019.11.23 完善
注: 这里其实只提出了一个思路,因为是软硬件结合的,不同的硬件结构的代码也完全不一样,在实际操作的时候还是会遇到很多问题;
比如这种循迹方法只能巡直线和弯度不大的转弯,如果要过直角弯还需要增加两个灰度传感器进行辅助判断;
反正,就是具体问题具体解决嘛。。。
这里给出我的代码,仅供参考:) 希望能帮到你~

#include <Servo.h>int sensor_pin[4] = {A0,A4,A2,A3};
int sensor_value[4] = {0,0,0,0};
const int LEFT = 0;//normal left
const int RIGHT = 1;//normal right
const int LEFT_RightAngle = 2;//right angle left
const int RIGHT_RightAngle = 3;//right angle right
const int STRAIGHT = 4;
const int BlackLimit_ML = 680;
const int BlackLimit_MR = 550;
const int BlackLimit_L = 500;
const int BlackLimit_R = 500;
const int HIGH_RIGHT = 234;
Servo myservo;
boolean isobstacle = 0;void setup(){pinMode(5,OUTPUT);//motor outpinMode(6,OUTPUT);pinMode(9,OUTPUT);//motor outpinMode(10,OUTPUT);pinMode(8,INPUT);//touch sensormyservo.attach(11);Serial.begin(9600);
}//judge whether an obstacle in front of us,return true when it is
boolean is_obstacle(){isobstacle = digitalRead(8);return isobstacle;
}//read sensor value
void read_value(){for(int i = 0;i < 4;i++){sensor_value[i] = analogRead(sensor_pin[i]);}
}//turn to a direction
void turn(const int direction_){switch(direction_){case LEFT:analogWrite(5,LOW);digitalWrite(6,HIGH_RIGHT);//right wheeldigitalWrite(9,LOW);digitalWrite(10,LOW);//left wheelwhile(sensor_value[2] > BlackLimit_MR){//sensor_value[1] > BlackLimit_M     read_value();delay(5);}break;case RIGHT:digitalWrite(5,LOW);analogWrite(6,LOW);//right wheeldigitalWrite(9,LOW);digitalWrite(10,HIGH);//left wheelwhile(sensor_value[1] > BlackLimit_ML){//sensor_value[1] > BlackLimit_M        read_value();delay(5);}break;case LEFT_RightAngle:digitalWrite(5,LOW);analogWrite(6,HIGH_RIGHT);//right wheeldigitalWrite(9,HIGH);digitalWrite(10,LOW);//left wheelwhile(sensor_value[1] > BlackLimit_ML){//sensor_value[1] > BlackLimit_M        read_value();if(sensor_value[3] < BlackLimit_R)break;delay(5);}break;case RIGHT_RightAngle:digitalWrite(5,HIGH_RIGHT);analogWrite(6,LOW);//right wheeldigitalWrite(9,LOW);digitalWrite(10,HIGH);//left wheelwhile(sensor_value[2] > BlackLimit_MR){//sensor_value[1] > BlackLimit_M        read_value();if(sensor_value[0] < BlackLimit_L)break;delay(5);}break;case STRAIGHT:digitalWrite(5,LOW);analogWrite(6,HIGH_RIGHT);//right wheeldigitalWrite(9,LOW);digitalWrite(10,HIGH);//left wheelbreak;default:digitalWrite(5,LOW);analogWrite(6,HIGH_RIGHT);//right wheeldigitalWrite(9,LOW);digitalWrite(10,HIGH);//left wheelbreak;}
}//judge what direction to turn with sensor value
void judge_turn(){read_value();if(sensor_value[0] < BlackLimit_L && sensor_value[3] > BlackLimit_R){//turn left right tangleSerial.println(LEFT_RightAngle); turn(LEFT_RightAngle);}else if(sensor_value[0] > BlackLimit_L && sensor_value[3] < BlackLimit_R){//turn right right tangleSerial.println(RIGHT_RightAngle);turn(RIGHT_RightAngle);}else if(sensor_value[1] > BlackLimit_ML && sensor_value[2] < BlackLimit_MR){Serial.println(RIGHT); turn(RIGHT);}else if(sensor_value[1] < BlackLimit_ML && sensor_value[2] > BlackLimit_MR){Serial.println(LEFT); turn(LEFT);}else{Serial.println(STRAIGHT);turn(STRAIGHT);   }
}void run(){judge_turn();delay(10);
}void loop(){run();
}

一种双灰度传感器巡黑线方案:完美解决小车循迹时左右摇摆的问题相关推荐

  1. 阅读小车循迹论文笔记:灰度传感器、仿生处理器、路径跟踪机制()

    阅读小车循迹论文笔记 灰度传感器 grayscale sensors 小车循迹中灰度传感器的工作原理 发射 接收 电压比较器(运放) 红外灰度传感器总电路原理图 仿生处理器Bio-inspired p ...

  2. 五路循迹传感器的优点_5路红外线传感器控制智能小车循迹,27秒走完所有站点...

    5路红外线循迹智能小车27秒走完比赛地图 为了指导学生参加2017年广东省机器人挑战赛自选项目"高铁时代"的比赛,我改进了某厂家的arduino智能小车,把红外线循迹传感器从2路增 ...

  3. 51单片机智能小车循迹完整程序_电气与信息工程学院双创协会开展循迹小车培训...

    为培养青年学子创新意识和创新能力,激发勇于创新的主动性和积极性,营造良好科技创新氛围,10月29日至30日,电气与信息工程学院双创协会于一教609.三教102和三教202开展循迹小车培训,该培训由电子 ...

  4. 五路循迹传感器的优点_对于安装五路循迹传感器的机器人来说,如果五个传感器都遇到黑线,说明机器人的状态是()。...

    [单选题]以下四种材料中,非常适合作为泡腾剂的粘合剂的材料是( ) [单选题]对于湿.热敏感的药物,可以用( )作为湿法制粒压片的粘合剂? [判断题]相同型号.相同黏度的HPMC,制成片剂时,药物的溶 ...

  5. 水下自动循迹机器人_一种夜间巡逻机器人自动循迹方法

    一种夜间巡逻机器人自动循迹方法 [技术领域] [0001]本发明涉及机器人应用技术领域,尤其涉及一种夜间巡逻机器人自动循迹方法. [背景技术] [0002]目前,博物馆.会展中心以及公园等场所的夜间安 ...

  6. 智能循迹小车_校园智能车障碍断路方案浅谈

    点击上方蓝字 关注小黑记事本 小黑提要: 华软嵌协举办的第十届校园智能车比赛即将开赛,组委会今年在赛道元素上进行了一次大创新,加入了没有出现过的障碍与断路新元素,对于参赛的选手是一个不小的挑战,而选手 ...

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

    在老少通吃的智能小车到底是什么呢?科普来喽!一文中,我们介绍了智能小车的分类及组成,为什么循迹小车能够追踪黑线轨迹呢? 智能小车在画有黑线的白纸 "路面"上行驶,由于黑线和白纸对光 ...

  8. [20个项目学会BBC micro:bit编程] 18-红外循迹(黑线)

    [20个项目学会BBC micro:bit编程]网易云课堂视频教程 点击这里 --硬件连接 注:big:bit扩展板上标XJ-L接左循迹传感器,标XJ-R的接右循迹传感器.两个传感器并没有区别,但要区 ...

  9. 【电赛优秀作品集】自动循迹小车制作方案

    简单来说自动循迹小车就是集光,机,电于一体的简易智能小车.参赛者通过论证,比较,实验之后,制作出了简易小车的循迹电路系统,整个系统基于普通玩具小车的机械结构,并利用了小车的底盘,前后轮电机及其自动复原 ...

最新文章

  1. java类接口实验_实验3_Java类的继承和接口的定义和使用
  2. python流程控制语句-4.python流程控制语句介绍
  3. 单片机里XPL是什么_单片机可以替代PLC么?
  4. Nacos 2.0 性能提升十倍,贡献者 80% 以上来自阿里之外
  5. scale Database
  6. 第五章 循环结构课后反思
  7. 前端学习(2364):图片的上传
  8. 数据库缓存双写一致性的一些个人想法
  9. 计算机模块word2003和2007,以Word2003的名义熟悉Word2007
  10. DbUtils操作数据库的用法
  11. 在CentOs 5.1中使用rpm安装NGINX+php+mysql(二)
  12. 智慧交通之智能红绿灯调控系统分析
  13. 教室录播系统方案_录播教室技术解决方案
  14. Linux-shell篇之while用法
  15. FIR滤波器设计(1)——利用matlab的fdatool工具箱设计FIR滤波器参数
  16. winRAR压缩、解压不常见的文件格式
  17. 设计模式---观察者模式(Observer)和委托事件模型(DEM)
  18. angular中ng-sow使用时候发现
  19. 什么是Webshell?
  20. 【图论】电气工程师 ceoi

热门文章

  1. 如何查看、更改文件的扩展名(后缀名)
  2. 语义识别(一):隐性马尔可夫模型
  3. 判断list集合不为空的方法,返回的是size == 0
  4. 展豪说 41-80d
  5. 算法的基础概念,插入算法和分治算法分析
  6. 计算机专硕学哪些专业,计算机考研学哪个专业
  7. 独立站精品模式占据主流
  8. SCJ-LD40 雷达水位计(平板雷达水位计)
  9. html在gzip解压缩,在javascript中解压缩gzip和zlib字符串
  10. javaEE城市公交查询系统