Arduino智能小车——循迹篇

Arduino智能小车系列教程时空门:

  1. Arduino智能小车——拼装篇 点击跳转
  2. Arduino智能小车——测试篇 点击跳转
  3. Arduino智能小车——调速篇 点击跳转
  4. Arduino智能小车——超声波避障 点击跳转
  5. Arduino智能小车——蓝牙小车 点击跳转
  6. Arduino智能小车——循迹篇 点击跳转
  7. Arduino智能小车——小车测速 点击跳转

文章目录

  • Arduino智能小车——循迹篇
    • 准备材料
      • 黑色电工胶布
      • 循迹模块
        • 模块特色
        • 工作原理
    • 测试代码
    • 代码详解
    • 循迹效果展示

  相信大家都在网上看到过类似下图这样的餐厅服务机器人,或者仓库搬运机器人,但是你们有没有注意到图片中地上的那条黑线?没错,他们都是沿着这条黑线来行进的,在这一篇将教大家怎么用小车实现类似的循迹功能。

准备材料

黑色电工胶布

  黑色胶布用于搭建小车运行的“轨道”,选用黑色宽度18mm左右的即可。

循迹模块

  在此我们使用循迹模块TCRT5000,该模块体积小,灵敏度较高,还可以通过转动上面的电位器来调节检测范围。

模块特色

1、采用TCRT5000红外反射传感器
2、检测距离:1mm~8mm适用,焦点距离为2.5mm
3、比较器输出,信号干净,波形好,驱动能力强,超过15mA。
4、配多圈可调精密电位器调节灵敏度
5、工作电压3.3V-5V
6、输出形式 :数字开关量输出(0和1)
7、设有固定螺栓孔,方便安装
8、小板PCB尺寸:3.2cm x 1.4cm
9、使用宽电压LM393比较器

工作原理

  TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管一直处于关断状态,此时模块的输出端为低电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,光敏三极管饱和,此时模块的输出端为高电平,指示二极管被点亮。

  由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED常量。
##循迹模块安装
  循迹模块的工作一般要求距离待检测的黑线距离1-2cm,因此我建议大家可以将循迹模块向下延伸。我自己是在硬纸板上面打了几个孔,固定循迹模块,每个模块之间可以留1cm左右的距离。传感器在接收到反射不同的距离的时候“AO”引脚电压会不同,是模拟信号,“DO”是数字信号输出。因为在这里我们只用判断是否检测到黑线,因此使用“DO”数字信号即可。按照车头为正方向,从右到左循迹模块的“DO”依次接到开发板“10”、“11”、“12”、“13”引脚。

## 跑道的搭建   找一块干净的地面,贴上准备好的黑色电工胶布。由于小车自身结构的原因,转弯的时候尽可能增大转弯半径,在跑道尽头如图中那样拉一条黑色横线,用于小车识别终点。


测试代码

#include <Servo.h>#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4int leftMotor1 = 16;
int leftMotor2 = 17;
int rightMotor1 = 18;
int rightMotor2 = 19;int trac1 = 10; //从车头方向的最右边开始排序
int trac2 = 11;
int trac3 = 12;
int trac4 = 13; int leftPWM = 5;
int rightPWM = 6;Servo myServo;  //舵机int inputPin=7;   // 定义超声波信号接收接口
int outputPin=8;  // 定义超声波信号发出接口void setup() {// put your setup code here, to run once://串口初始化Serial.begin(9600); //舵机引脚初始化myServo.attach(9);//测速引脚初始化pinMode(leftMotor1, OUTPUT);pinMode(leftMotor2, OUTPUT);pinMode(rightMotor1, OUTPUT);pinMode(rightMotor2, OUTPUT);pinMode(leftPWM, OUTPUT);pinMode(rightPWM, OUTPUT);//寻迹模块D0引脚初始化pinMode(trac1, INPUT);pinMode(trac2, INPUT);pinMode(trac3, INPUT);pinMode(trac4, INPUT);
}void loop() {// put your main code here, to run repeatedly:tracing();}
void motorRun(int cmd,int value)
{analogWrite(leftPWM, value);  //设置PWM输出,即设置速度analogWrite(rightPWM, value);switch(cmd){case FORWARD:Serial.println("FORWARD"); //输出状态digitalWrite(leftMotor1, HIGH);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, HIGH);digitalWrite(rightMotor2, LOW);break;case BACKWARD:Serial.println("BACKWARD"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, HIGH);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, HIGH);break;case TURNLEFT:Serial.println("TURN  LEFT"); //输出状态digitalWrite(leftMotor1, HIGH);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, HIGH);break;case TURNRIGHT:Serial.println("TURN  RIGHT"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, HIGH);digitalWrite(rightMotor1, HIGH);digitalWrite(rightMotor2, LOW);break;default:Serial.println("STOP"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, LOW);}
}
void tracing()
{int data[4];data[0] = digitalRead(10);data[1] = digitalRead(11);data[2] = digitalRead(12);data[3] = digitalRead(13);if(!data[0] && !data[1] && !data[2] && !data[3])  //左右都没有检测到黑线{motorRun(FORWARD, 200);}if(data[0] || data[1])  //右边检测到黑线{motorRun(TURNRIGHT, 150);}if(data[2] || data[3])  //左边检测到黑线{motorRun(TURNLEFT, 150);}if(data[0] && data[3])  //左右都检测到黑线是停止{motorRun(STOP, 0);while(1);}Serial.print(data[0]);Serial.print("---");Serial.print(data[1]);Serial.print("---");Serial.print(data[2]);Serial.print("---");Serial.println(data[3]);
}

代码详解

小车装有4个TCRT5000,从最右边模块开始读入数据,放入data[]数组中

data[0] = digitalRead(10);
data[1] = digitalRead(11);
data[2] = digitalRead(12);
data[3] = digitalRead(13);

4个模块可能存在的检测状态如下,其中“1”表示检测到黑线,“0”代表没有检测到黑线:

data[0] data[1] data[2] data[3] 小车运动状态
1 1 1 1 停止
0 0 1 1 左转
0 0 0 1 左转
0 0 1 0 左转
1 1 0 0 右转
1 0 0 0 右转
0 1 0 0 右转
0 0 0 0 直行

第一种情况,四个模块都没有检测到黑线时,直行:

if(!data[0] && !data[1] && !data[2] && !data[3])  //左右都没有检测到黑线
{motorRun(FORWARD, 200);
}

右边任意一个模块检测到黑线时,右转:

if(data[0] || data[1])  //右边检测到黑线
{motorRun(TURNRIGHT, 150);
}

左边任意一个模块检测到黑线时,左转:

if(data[2] || data[3])  //左边检测到黑线
{motorRun(TURNLEFT, 150);
}

当四个模块都检测到黑线时,说明已经运动到轨道终点,此时停止运动:

if(data[0] && data[3])  //左右都检测到黑线是停止
{motorRun(STOP, 0);while(1);
}

循迹效果展示

在起点出准备出发

弯道中

识别到终点后停止

欢迎各位有兴趣的朋友加入Q群1:789127261点评、交流

Arduino智能小车——循迹篇相关推荐

  1. Arduino智能小车——调速篇

    Arduino智能小车--调速篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  2. Arduino智能小车——拼装篇

    Arduino智能小车--拼装篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

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

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

  4. 循迹智能小车c语言主程序,智能小车循迹、避障、红外遥控C语言代码

    <智能小车循迹.避障.红外遥控C语言代码>由会员分享,可在线阅读,更多相关<智能小车循迹.避障.红外遥控C语言代码(13页珍藏版)>请在人人文库网上搜索. 1.智能小车避障.循 ...

  5. 基于51单片机智能小车循迹功能的实现

    基于51单片机智能小车循迹功能的实现 目录 基于51单片机智能小车循迹功能的实现 一.思路(仅供参考) 二.部分硬件模块介绍 1.L298n电机驱动模块 2.两路红外循迹模块 三.实现 1.代码 2. ...

  6. STM32智能小车循迹教程

    文章目录 前言 一.红外循迹模块工作原理及接线图 红外循迹模块工作原理 红外循迹模块和STM32的接线图 二.cubeMX配置 三.代码解析 总结 前言 本篇文章将带大家学习STM32智能小车的循迹功 ...

  7. 智能小车循迹、跟随业务代码编写

    通过这段时间的学习,终于是把智能小车的循迹.跟随.避障业务实现出来.那么通过写下这篇文章,将自己在这个过程的心得.组装智能小车以及通过代码的编写实现各种业务的心路历程记录下来. 这是小车的实物图,通过 ...

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

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

  9. 遥控汽车的编程c语言,智能小车循迹、避障、红外遥控C语言代码.docx

    //智能小车避障.循迹.红外遥控C语言代码 // 实现功能有超声波避障, 红外遥控智能小车, 红外传感器实现小车自动循迹, 1602 显示小 车的工作状态,另有三个独立按键分别控制三种状态的转换 // ...

最新文章

  1. c语言把地址用%d输出字符串,C语言必须要记住的经典程序
  2. 修改Hadoop的日志级别
  3. 北大率先官宣朱松纯加盟,现身燕园,任职AI研究院院长,“AI发展离不开哲学思考”...
  4. php think cmf,thinkphp cmf代码
  5. class没有发布到tomcat_总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
  6. cmd测试cuda安装_安装:anaconda+cuda+pytorch+pycharm
  7. 将模块放入到一个项目中展示_一个号称NB的开源电商系统
  8. 被邻居偷偷拉了条网线到他家,然后在他家装WiFi,我怎么让他不能使用我的网络?
  9. Spark函数讲解: combineByKey
  10. iOS开发中设置UITextField的占位文字的颜色,和光标的颜色
  11. alsa的动态库安装在哪里_源码编译安装MySQL8.0.20
  12. NETGEAR R7000 更新固件失败 使用TTL-USB修复教程
  13. React Native 中使用图标
  14. 为出海掘金创造更多可能 助力开发者触达全球用户
  15. 养龟村长讲解三线闭壳龟的重要性,对于养殖的你深刻了解多少?
  16. JAVA 数组降序排列思路
  17. 腾讯微信面试题:侧重科班基础
  18. 我的产品经理书单(2017-2019)
  19. 【U8+】用友U8+登录账套,提示“指定的参数已超出有效值的范围。参数名:index”
  20. 网站域名在微信端被封禁了怎么办?这样几步就能解封!

热门文章

  1. 「儒系」产品经理:管理预期,做好增长的3个核心要素
  2. 关于有向图强连通分量 和 无向图双联通分量的理解
  3. 浅谈 Java 中的枚举
  4. 花 40 块搞个游戏机「GitHub 热点速览 v.22.27」
  5. 第三十一章 SQL函数 CONVERT
  6. css定义变量(定义:--aa;使用:var(--aa)、calc()计算样式函数
  7. CPMP IPMP PMP这三个证书有什么区别?
  8. 搜狐畅言社交化评论插件接入之单点登录
  9. 传智播客python培训怎么样
  10. 互联网告别免费时代,准备好了吗?