首页 > 编程知识 正文

智能小车黑线循迹,arduino小车转弯代码

时间:2023-05-05 22:55:35 阅读:175839 作者:1976

Arduino智能购物车——跟踪篇Arduino智能购物车系列教程时空门:

Arduino智能购物车——组装篇点击跳转Arduino智能购物车——测试篇点击跳转Arduino智能购物车——调速篇点击跳转Arduino智能购物车——超声波避障点击跳转Arduino ooth购物车点击跳转Arduino智能购物车3——跟踪篇点击跳转Arduino智能购物车——购物车速度点击跳转文章目录Arduino智能购物车——跟踪编辑准备材料黑色电工创可贴跟踪momo

相信你在网上看到过如下图所示的餐厅服务机器人和仓库搬运机器人,你注意到照片中地面上的黑线吗? 是的。 他们沿着这条黑线前进。 本篇将教您如何在购物车中实现类似的跟踪功能。

准备材料为黑色的电工胶布、黑色的胶布,用于制作小车运行的“轨道”。 选择黑色宽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-2厘米,因此建议将跟踪模块向下拉伸。 我自己在瓦楞纸板上打了几个洞,固定着跟踪模块。 各模块之间可以空出1cm左右的距离。 传感器接收到反射不同的距离后,“AO”端子的电压不同,变为模拟信号,“DO”变为数字信号输出。 在此,由于仅判断是否检测到黑线,所以使用“DO”数字信号即可。 车头为正方向,从右到左跟踪模块的" DO "依次与开发板" 10 "、" 11 "、" 12 "、" 13 "针脚连接。

#跑道的建设要找干净的地面,贴上准备好的黑色电工胶布。 根据小车本身的结构,转弯时尽量加大转弯半径,在路线结束时如图所示画一条黑色横线,用于小车识别终点。 测试代码# include servo.h # definestop0# define forward1# define backward2# defineturnleft3# define turn right4intleftmotor1=int rightMotor1=18; int rightMotor2=19; int trac1=10; //从车头方向最右边开始排序int trac2=11; int trac3=12; int trac4=13; int leftPWM=5; int rightPWM=6; 服务器卷; //舵机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 ); 拼音模式(left motor 2,OUTPUT ); 输入模式(right motor 1,OUTPUT ); 拼音模式(right motor 2,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 ); }voidmotorrun(intcmd,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]小车运动状态1111停止0011左转0001左转0010左转1100右转1000右转0100右转0000直行

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

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点评、交流

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。