保姆级的Arduino循迹小车研发日志及一些坑(其中包含L298N、Arduino、TCRT5000以及1:48的TT电机的使用)

循迹小车的研发日志

开发要求如下:在这里插入图片描述

引言:为什么会用到米思齐这个青少年编程软件是有两个原因:

  1. 接到了某所小学的研发项目需求,研发成果给小学生参加无人车循迹比赛。
  2. 实验室的师弟师妹并不是所有都有编程基础,因此米思齐可以作为简单的编程引入课程。

技术设计路线

  1. 首先我认为 TCRT5000红外循迹传感器 是最重要的,有两个需要考虑的点,一个是数量,另一个则是排放方式
  2. 其次我认为地图的走势也是很重要的,因此我手绘了一副地图并且分析了无人车的走向;(可以减少很多无用功
  3. 最后就是 L298N 和 Arduino UNO的接线和应用。(没想到他是最麻烦的!!!

下面附上我的大致思路(中途有所修改)
在开发过程中,看到师弟师妹的做法有用排列的方法来实现的,也有用分情况触发来实现的,也不失为一种好办法。(排列指的是列出24=16,16种可能性之后再一个个加判断条件;分情况触发指的是用一些特殊的位置进行判断,然后分段分析地图。)
但下面为我目前想到最简单的代码,调用尽量少的函数、尽量少的判断条件

电路接线图地图及情况分析简易机械装配图


硬件部分

简单的TCRT5000

TCRT5000
TCRT5000红外循迹传感器的发射二极管可以不断的发射红外线,通过检测反射回来的红外线的强大进行判断是否处于黑线上。当指示灯一直处于熄灭状态也就是没有检测到反射,即检测到黑色,此时模块输出端为高电平1;反之,指示灯点亮时为检测到反射,此时模块输出端为低电平0,即检测到白色。
需要3.3-5V供电。
资料下载链接:
https://pan.baidu.com/s/1Dqri3AanZbPhnMMCU1HZRQ
提取码:1234
在本设计路线中,用到四个TCRT5000,且排放方式在简易装配图中有画出。


玄妙的L298N

L298N
L298N作为直流步进电机驱动模块的主驱动芯片,所以该模块就简称为L298N了,该模块内置78M0通过驱动电源部分取电工作,因此当大于12V驱动电压是,应该使用外置的5V逻辑供电。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在产品介绍中也看到了,L298N不仅价格亲民,接线也很简单,逻辑也没什么毛病,那为什么说L298N这个直流电机驱动模块玄妙呢?大致分成以下几个说法:

  1. 电机有震动的声音但不转动
  2. 电机没有震动的声音且不转动
  3. 通电后测电压电压一直下降
  4. 一只轮子不转另一只转动
  5. 两只轮子转速有差别

解决方法如下:

  1. 电压不足,换电池,L298N虽然写的是5V可以供电,但会出现供电不足的问题,因为Arduino板也占用了电压,相当于串联分压。经过测试8.5-9V电机都能正常工作,而且转速不会特别低。
  2. 估计L298N的ENA/ENB出现问题,可以采用ENA/ENB短接,然后再IN1/IN3上面输入PWM信号,一样可以实现PWM控制
  3. L298N与Arduino短接,可能是接线的时候误触导致,把所有的线都拔了重新插一次,如果还有上述问题,L298N本身串联了大容量的电容器,随着充电过程,电路充满电电路没有电流通过,导致电压降为零。
  4. 接线松掉,考虑3种情况,IN1/ENA没有接好;Arduino接IN1/ENA的线没接好;代码有问题,可以试着用我下面提供的PWM代码测试,如果两个轮子都转动,那就是代码出现问题。
  5. 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小车的结构、代码可能都不是最优的。希望各位大佬可以指正修改,也欢迎大家关注我们的公众号,一起分享关于开源机器人的项目和见解!!

成品图:

在这里插入图片描述

完整代码

提取码:open
如果崩了请联系我

  • 39
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Edison_Source

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值