循迹小车的研发日志
开发要求如下:
引言:为什么会用到米思齐这个青少年编程软件是有两个原因:
- 接到了某所小学的研发项目需求,研发成果给小学生参加无人车循迹比赛。
- 实验室的师弟师妹并不是所有都有编程基础,因此米思齐可以作为简单的编程引入课程。
技术设计路线
- 首先我认为 TCRT5000红外循迹传感器 是最重要的,有两个需要考虑的点,一个是数量,另一个则是排放方式;
- 其次我认为地图的走势也是很重要的,因此我手绘了一副地图并且分析了无人车的走向;(可以减少很多无用功)
- 最后就是 L298N 和 Arduino UNO的接线和应用。(没想到他是最麻烦的!!!)
下面附上我的大致思路:(中途有所修改)
在开发过程中,看到师弟师妹的做法有用排列的方法来实现的,也有用分情况触发来实现的,也不失为一种好办法。(排列指的是列出24=16,16种可能性之后再一个个加判断条件;分情况触发指的是用一些特殊的位置进行判断,然后分段分析地图。)
但下面为我目前想到最简单的代码,调用尽量少的函数、尽量少的判断条件。
硬件部分
简单的TCRT5000
TCRT5000红外循迹传感器的发射二极管可以不断的发射红外线,通过检测反射回来的红外线的强大进行判断是否处于黑线上。当指示灯一直处于熄灭状态也就是没有检测到反射,即检测到黑色,此时模块输出端为高电平1;反之,指示灯点亮时为检测到反射,此时模块输出端为低电平0,即检测到白色。
需要3.3-5V供电。
资料下载链接:
https://pan.baidu.com/s/1Dqri3AanZbPhnMMCU1HZRQ
提取码:1234
在本设计路线中,用到四个TCRT5000,且排放方式在简易装配图中有画出。
玄妙的L298N
L298N作为直流步进电机驱动模块的主驱动芯片,所以该模块就简称为L298N了,该模块内置78M0通过驱动电源部分取电工作,因此当大于12V驱动电压是,应该使用外置的5V逻辑供电。
在产品介绍中也看到了,L298N不仅价格亲民,接线也很简单,逻辑也没什么毛病,那为什么说L298N这个直流电机驱动模块玄妙呢?大致分成以下几个说法:
- 电机有震动的声音但不转动
- 电机没有震动的声音且不转动
- 通电后测电压电压一直下降
- 一只轮子不转另一只转动
- 两只轮子转速有差别
解决方法如下:
- 电压不足,换电池,L298N虽然写的是5V可以供电,但会出现供电不足的问题,因为Arduino板也占用了电压,相当于串联分压。经过测试8.5-9V电机都能正常工作,而且转速不会特别低。
- 估计L298N的ENA/ENB出现问题,可以采用ENA/ENB短接,然后再IN1/IN3上面输入PWM信号,一样可以实现PWM控制
- L298N与Arduino短接,可能是接线的时候误触导致,把所有的线都拔了重新插一次,如果还有上述问题,L298N本身串联了大容量的电容器,随着充电过程,电路充满电电路没有电流通过,导致电压降为零。
- 接线松掉,考虑3种情况,IN1/ENA没有接好;Arduino接IN1/ENA的线没接好;代码有问题,可以试着用我下面提供的PWM代码测试,如果两个轮子都转动,那就是代码出现问题。
- L298N的H桥的电阻电容大小不是一样的,因此会有差别,倘若电机不太好,差别会更明显,建议用电压表来测试转速*(PWM控制其实就是控制电压,具体可以看公众号发布的文章。)*
如果只是平时自己玩玩这个小车,千万不要这么傻用单电源单驱动的方式,直接双电源双驱动,电压稳定之余PWM调节转换后也是一样的转速!!
资料下载链接:
https://pan.baidu.com/s/1teVnq1LJ3VTQ55Lj8gTnFg
提取码:1234
安装部分
掏个洞,走线更好看。
轮子是外八的,更稳定一些。原因如下:
千万注意!!!!!L298N要用一个木板跟Arduino隔开!!!不然可能短路!!!
软件部分
在通过分析比赛赛道后了解到全部弯道都是左转,因此我们将代码分成4种主要判断条件。
其中直行最为关键,因此我们用3个主要的逻辑判断是否在走直线,并且他能走完直线的巡线。
L==0 && R==0;//识别到白色,直走;
L==1 && R==0;//中间靠左的传感器识别到黑线微微向左边调整;
L==0 && R==1;//中间靠右的传感器识别到黑线微微向右边调整;
写入新的函数,分别是直行,直行左转,直行右转。
void Forward()
{
analogWrite(5,120);
analogWrite(6,140);
digitalWrite(4,LOW);//我采用的是IN1 IN3作为PWM输入,没有用到ENA ENB
digitalWrite(7,LOW);
}
void Forwardturnleft()
{
analogWrite(5,40);
analogWrite(6,120);
digitalWrite(4,LOW);
digitalWrite(7,LOW);
}
void Forwardturnright()
{
analogWrite(5,120);
analogWrite(6,40);
digitalWrite(4,LOW);
digitalWrite(7,LOW);
}
当出现到十字路口时逻辑也应该判断为直走,因此我们需要加入判断全黑时直行。
LL==1 && L==1 && R==1 && RR==1;//识别到全黑,直走;
纵观全图,可以发现:几乎每一个十字路口即(全黑)都是一次重要的转折点。因此我们可以将全黑的情况设置为计数;加入一个新的判断函数即可
void Timer()
{
a=a+1;
Serial.print(a);
delay(300);
}
上诉的几个函数并不能完美的通过直角弯,因此加入新判断:
LL == 1//大左转
进入直角弯道后,会进入到虚线部分,虚线部分会因为我们前面程序检测到全白直行,导致冲出赛道,因此我们需要在这时候进入新的循环,也就是可以通过前面函数Timer中跳转进入循环。
且设置全白为微右调整,同时以防车子左微调会出去,可以在左微调时加入延时;
代码如下:
if (a == 5) {
if (L == 0 && R == 0) {
Forwardturnright2();
}
if ((L == 1 && R == 0) && LL == 0) {
Forwardturnleft2();
delay(150);
}
if (((L == 0 && R == 1) && RR == 0 || (L == 0 && R == 1) && RR == 1) || (L == 0 && R == 0) && RR == 1) {
Forwardturnright2();
}
if (LL == 1) {
turnleft();
}
}
在最后一个十字路口我加了一个加速(可加可不加)
if(a==6)
{
if(L==0 && R==0)//均未检测到黑线
Speedup();
if(L==1 && R==0 && LL==0)//左侧检测到黑线,右侧没有,所以要左转
Forwardturnleft();
if(L==0 && R==1 && RR==0)//右侧检测到黑线,左侧没有,所以右转
Forwardturnright();
}
结语
Emmm小车的结构、代码可能都不是最优的。希望各位大佬可以指正修改,也欢迎大家关注我们的公众号,一起分享关于开源机器人的项目和见解!!
成品图:
文章来源:https://www.toymoban.com/news/detail-405255.html
完整代码
提取码:open
如果崩了请联系我文章来源地址https://www.toymoban.com/news/detail-405255.html
到了这里,关于保姆级的Arduino循迹小车研发日志及一些坑(其中包含L298N、Arduino、TCRT5000以及1:48的TT电机的使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!