文章目录

  • 一、完整的代码
  • 二、循迹代码详解
    • 1.循迹的原理
    • 2.判断情况
    • 3.调速代码
    • 4.循迹代码
    • 5.调试问题
  • 总结

代码分享给同学们啦,在同学们运行小车的过程中,总会遇见各种奇怪的情况,比如小车不动啦,硬件烧掉啦,正负极接反啦,这都是初学者的必经之路,你们可以独立思考解决问题,也可以百度或者询问他人,只要思想不滑坡,办法总比困难多!( ͡• ͜ʖ ͡• )


小车演示视频:https://www.bilibili.com/video/BV1ur4y1n7RP


提示:完整的代码可以直接烧录Arduino运行,不过地图不同,执行效果也不同,完全copy就能用,就不要想了

一、完整的代码

// 左边电机引脚5-6,右边电机引脚9-10,必须是有PWM功能的端口
// 循迹引脚 11-12-13-14,从车头方向的最左边开始排序
#define LeftMotor1 3  //Arduino的3号引脚连接在D0端口,利用宏定义可以方便后期改端口
#define LeftMotor2 5    //Arduino的5号引脚连接在D1端口
#define RightMotor1 6   //Arduino的6号引脚连接在接D2端口
#define RightMotor2 9   //Arduino的9号引脚连接在接D3端口
#define track1 10   //Arduino的10号引脚连接在最左边的循迹模块的D0口,以下同理
#define track2 11
#define track3 12
#define track4 13int Sensor[4] = {0, 0, 0, 0}; //初始化循迹的值
int i = 0;//计数或计时void setup() {// put your setup code here, to run once:Serial.begin(9600); //串口初始化Track_Init(); //循迹模块初始化Motor_Init(); //电机引脚初始化
}void loop() {// put your main code here, to run repeatedly:Sensor_Read();  //不断地读取循迹模块的高低电平xun_ji(); //循迹函数count();  //计数函数Print();  //打印循迹的高低电平
}void Track_Init()
{//循迹模块D0引脚初始化,设置为输入模式pinMode(track1, INPUT);pinMode(track2, INPUT);pinMode(track3, INPUT);pinMode(track4, INPUT);
}
void Motor_Init()
{//电机引脚初始化,设置为输出模式pinMode(LeftMotor1, OUTPUT);pinMode(LeftMotor2, OUTPUT);pinMode(RightMotor1, OUTPUT);pinMode(RightMotor2, OUTPUT);
}
void Sensor_Read()
{Sensor [0] = digitalRead(track1); //检测到黑线为高电平(1),白线为低电平(0)Sensor [1] = digitalRead(track2);Sensor [2] = digitalRead(track3);Sensor [3] = digitalRead(track4);
}
void Motor_Speed(int Left1_Speed, int Left2_Speed, int Right1_Speed, int Right2_Speed)
{analogWrite(LeftMotor1, Left1_Speed); //控制电机的速度,不同的车模,代码执行效果不同!analogWrite(LeftMotor2, Left2_Speed);analogWrite(RightMotor1, Right1_Speed);analogWrite(RightMotor2, Right2_Speed);
}
void xun_ji() //小车的速度可根据实际地图进行调节
{if (Sensor [0] == 0 && Sensor [1] == 1 && Sensor [2] == 0 && Sensor [3] == 0)  //0-1-0-0 小左转Motor_Speed(50, 0, 150, 0); //左轮速度 50 右轮直走 150else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 1 && Sensor [3] == 0)  //0-0-1-0 小右转Motor_Speed(150, 0, 50, 0); //左轮速度 150 右轮速度 50else if (Sensor [0] == 1 && Sensor [1] == 0 && Sensor [2] == 0 && Sensor [3] == 0)  //1-0-0-0 大左转Motor_Speed(0, 180, 180, 0); //左轮速度 -180 右轮直走 180else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 0 && Sensor [3] == 1)  //0-0-0-1 大右转Motor_Speed(180, 0, 0, 180); //左轮直走 180 右轮速度 -180else if (Sensor [0] == 1 && Sensor [1] == 1 && Sensor [2] == 0 && Sensor [3] == 0)  //1-1-0-0 左急转弯Motor_Speed(0, 200, 200, 0); //左轮反转 -200 右轮直走 200else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 1 && Sensor [3] == 1)  //0-0-1-1 右急转弯Motor_Speed(200, 0, 0, 200); //左轮直走 200 右轮反转 -200else  //除了左右转,就只剩下直走Motor_Speed(100, 0, 100, 0);
}
void count()    //计黑十字的函数封装
{if (i > 2)  //i的具体范围要根据地图的黑十字路口而定!{Motor_Speed(0, 0, 0, 0);  //如果到达终点,就停车}else if (Sensor [0] == 1 && Sensor [1] == 1 && Sensor [2] == 1 && Sensor [3] == 1) { //1-1-1-1 计数i++;delay(100); //延时可以防止i加的过快}else if (Sensor [0] == 0 && Sensor [1] == 1 && Sensor [2] == 1 && Sensor [3] == 0) { //0-1-1-0 计数i++;delay(100);}else if (Sensor [0] == 1 && Sensor [1] == 1 && Sensor [2] == 1 && Sensor [3] == 0) { //1-1-1-0  计数i++;delay(100);}else if (Sensor [0] == 0 && Sensor [1] == 1 && Sensor [2] == 1 && Sensor [3] == 1) { //0-1-1-1 计数i++;delay(100);}
}
void Print()    //在串口打印循迹的高低电平
{Serial.print(Sensor [0]);Serial.print("---");Serial.print(Sensor [1]);Serial.print("---");Serial.print(Sensor [2]);Serial.print("---");Serial.println(Sensor [3]);
}

二、循迹代码详解

1.循迹的原理

我们做的四驱小车前轮是不能转向的,那么怎么样才可以左右转呢?
其实就是通过左右轮的差速就可以转弯,想要小车左转的话,那么 右轮的速度就要大于左轮的速度,想要小车向左转90°的话,差速就行不通了,这时候怎么办呢?当然也是有解决办法的啦!可以让左轮反转,右轮正转,小车就可以原地大幅度转弯了,反转和正转的数值越大,小车转弯的幅度也就越大,具体的数值,就要看你们的地图的情况了。

2.判断情况

循迹模块的主要情况,其中0表示检测到白线,1表示检测到黑线

Sensor [0] Sensor [1] Sensor [2] Sensor [3] 运动状态
0 0 0 0 直走
0 1 0 0 小左转
0 0 1 0 小右转
0 0 0 1 大左转
1 0 0 0 大右转
1 1 0 0 左急转弯
0 0 1 1 右急转弯
1 1 1 1 直走

3.调速代码

Left1_Speed、Left2_Speed控制左轮的速度,Right1_Speed、Right2_Speed控制右轮的速度,相信大家在网上看到过很多把转弯和直走单独封装起来的代码,那样子也可以,不过我个人觉得,传四个参数进去,更加直观、简洁,同学们也可以根据自己的看法来对代码进行取舍

void Motor_Speed(int Left1_Speed, int Left2_Speed, int Right1_Speed, int Right2_Speed)
{analogWrite(LeftMotor1, Left1_Speed); //控制电机的速度,不同的车模,代码执行效果不同!analogWrite(LeftMotor2, Left2_Speed);analogWrite(RightMotor1, Right1_Speed);analogWrite(RightMotor2, Right2_Speed);
}

4.循迹代码

当里面的两个循迹模块,有一个检测到黑线(0-1-0-0或0-0-1-0),说明小车轻微偏离轨道,这时候我们可以用差速,让小车小转弯,这样小车就摆正回来了

  if (Sensor [0] == 0 && Sensor [1] == 1 && Sensor [2] == 0 && Sensor [3] == 0)  //0-1-0-0 小左转Motor_Speed(50, 0, 250, 0); //左轮速度 50 右轮直走 250else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 1 && Sensor [3] == 0)  //0-0-1-0 小右转Motor_Speed(250, 0, 50, 0); //左轮速度 250 右轮速度 50

当外面的两个循迹模块,其中一个检测到黑线时(1-0-0-0或0-0-0-1),说明小车严重偏离轨道,这时差速就没什么用了,为了让小车回正,可以用反转,让小车以大幅度转弯

  else if (Sensor [0] == 1 && Sensor [1] == 0 && Sensor [2] == 0 && Sensor [3] == 0)  //1-0-0-0 大左转Motor_Speed(0, 230, 255, 0); //左轮速度 -230 右轮直走 255else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 0 && Sensor [3] == 1)  //0-0-0-1 大右转Motor_Speed(255, 0, 0, 230); //左轮直走 255 右轮速度 -230

当小车遇到直角时,会出现左边两个或者右边两个循迹模块同时检测到黑线(1-1-0-0或0-0-1-1),这时小车就需要更大的转弯幅度了,也就是更大的反转

  else if (Sensor [0] == 1 && Sensor [1] == 1 && Sensor [2] == 0 && Sensor [3] == 0)  //1-1-0-0 左急转弯Motor_Speed(0, 250, 250, 0); //左轮反转 -250 右轮直走 250else if (Sensor [0] == 0 && Sensor [1] == 0 && Sensor [2] == 1 && Sensor [3] == 1)  //0-0-1-1 右急转弯Motor_Speed(250, 0, 0, 250); //左轮直走 250 右轮反转 -250

学会了用 if语句判断循迹的情况后,你们也可以学着用switch语句来判断,这样代码运行得会更快,也可以学PID算法,这样小车转弯会变得十分丝滑。

5.调试问题

  1. 你让小车左转或者直走,但是它有点叛逆,它偏不听你的,去右转或者后退,这种情况也是正常的,两种方法:①硬件上,你把电机驱动模块的接线反过来就可以了;②软件上,把代码的速度反过来就可以了,一般的话,我建议你还是把线给调转一下吧。
  2. 小车不会动了,你可以检查一下是不是哪里的接线没接好,或者代码写的有问题。
  3. 总之嘞,万事开头难(︶^︶),遇到问题停下来思考思考,分析到底是哪里出了问题,是在不明白的,就多多去百度啦,多多问大佬啦,只要思想不滑坡,办法总比困难多!多积累经验,多沉淀自己,你们会比大佬更加厉害!

总结

我相信你们通过自己的努力后,小车能过运行起来了!那么你可以理解代码,试着改一下速度或者是引脚,多去体会其中的道理,也自己去摸索一下怎样的速度是最合适的,要是感觉循迹小车太简单,没意思了,你也可以尝试着做蓝牙遥控小车、超声波避障小车、红外跟随小车呀,总之,多动手,勤思考,办法总比困难多。加油吧!同学们!(0^ ◇ ^0)

Arduino循迹小车教程四----代码篇相关推荐

  1. Arduino循迹小车教程一----材料篇

    文章目录 前言 1.亚克力板*1片 2.T型支架*2个 3.双轴直流减速电机*4 4.杜邦线*n条 5.M3螺柱*50 6.2.54mm排针排母*1把 7.黑工胶布*1卷 8.TCRT5000循迹模块 ...

  2. 循迹小车基本原理和代码实现

    目录 一.循迹模块使用 二.接线方式 三.循迹小车原理 四.代码实现 一.循迹模块使用 1.TCRT5000传感器的红外发射二极管不断发射红外线,当发出的红外线没有被反射回来或被反射回来但强度不太够时 ...

  3. Arduino循迹小车(三路红外)

    利用红外线传感器让小车在规定路线上行进 1. 所需材料 小车车架及车轮(可以用sw建模然后利用3D打印机打印,也可以在网上直接购买小车地板,用纸板最廉价O(∩_∩)O哈哈~) 该图为3D打印效果 Ar ...

  4. 超声波模块详细介绍(stm32循迹小车中超声波的介绍)

    超声波模块详细介绍(stm32循迹小车中超声波的介绍) 超声波模块是非常重要的一个模块,今天给大家全面介绍一下超声波模块的原理以及用法,代码的编写. 1 超声波模块的认识 首先,市面上的常见超声波模块 ...

  5. 基于Arduino3路循迹小车

    本人西伯利亚蟑螂,最近抽空回顾了一下arduino,顺手做了个arduino循迹小车 (条件所限我的小车为两驱三路循迹模块小车) 话不多说,先上干货. #define STOP      0 #def ...

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

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

  7. 基于arduino的5路循迹小车(2)

    基于arduino的5路循迹小车(2) 小车5路红外循线 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347 ...

  8. 基于arduino的5路循迹小车(4)与舵机控制板的通信控制

    基于arduino的5路循迹小车(4) arduino与舵机控制板的通信控制 以及语音播报模块 接第一篇链接 https://blog.csdn.net/weixin_45984029/article ...

  9. 基于arduino的5路循迹小车(3)

    基于arduino的5路循迹小车(3) 使用红外模块的定位停车 以及超声波避障 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details ...

最新文章

  1. C++:C++语言入门级基础知识考察点回顾之函数、结构体和类
  2. 详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍
  3. PyTorch 实现 Mask-RCNN
  4. [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)
  5. HarmonyOS硬件创新合作伙伴,【HarmonyOS】HarmonyOS智能硬件开发学习指南 - HDC2020
  6. [JSOI2008]最小生成树计数
  7. c2java Greedy 之任务调度
  8. 在java中获取当前系统时间 插入数据库中的时间值没有时间只有日期的原因...
  9. python3语法学习第四天--序列
  10. java numberformat_NumberFormat(数字格式化类)
  11. 数据库编程之ODBC编程
  12. Acrel-2000Z智能电力监控系统解决方案
  13. 软件构造笔记——Java基本数据类型和对象数据类型
  14. 告诉你守望先锋外挂的是什么技术原理
  15. CSDN余额充值协议
  16. 单片机(Arduino)+FLASH+MIC+喇叭自制录音、播放器(二)
  17. npm 发布包遇到的问题
  18. android 卡联系人导入iphone,苹果手机怎么把通讯录导入新手机sim卡
  19. 机器学习K-均值——nonzero(clusterAssment[冒号,0].A==cent
  20. Flutter 时间选择器

热门文章

  1. 2022考研真题+汤家凤网课视频。祝2022考研朋友顺利上岸!
  2. Android-沉浸式导航栏
  3. 详解以太网诊断DoIP
  4. .NET Framework、 .NET Core、.NET Standard区别。
  5. 不用写算法的机器视觉外观检测软件
  6. coreseek php接口,筹建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例...
  7. 区块链的布局:腾讯 VS 阿里
  8. 【参赛作品15】openGauss数据库维护管理
  9. 基于模板配置的数据可视化平台
  10. Git统计代码行数;Java实现统计代码行数,忽略空行、注释行