1 系统方案设计
1.1 方案论证
本设计对于实现自动寻迹的智能小车提出如下两套设计方案。
方案一:
采用传统的51单片机进行整体的小车设计,它有8位CPU,4kbytes程序存储器,32条I/O口线,21个专用寄存器,2个可编程定时/计数器;5个中断源,2个优先级,一个全双工串行通信口[6]。
智能小车以STC89C51为主芯片,红外传感器作为检测信号的工具,红外传感器能识别地面反射的光信号,经过一个电压比较器,把光信号转换为单片机可识别的电信号,在把这个电信号给STC89C51单片机进行集中处理并传递给驱动模块控制电机的驱动,进而控制小车的前进方向。当小车两边的都处于白色路面时,红外传感器两都能接受到自己发射的红外光,这样小车就正常前进。当一侧的红外传感器检测不到发出的红外光时,会根据情况做出对应的行驶方向上的调整,当两侧红传感器都检测不到自己发射的红外光时,小车停止前进[7]。
方案二:
本设计采用以新型的Arduino UNO开发板为核心进行小车的整体设计,它由14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚、一个USB接口、一个16 MHz的晶体振荡器、一个ICSP接口、一个DC接口,一个复位按钮等组成。它的使用也非常简便,只需要把它连接到计算机或者用电池给它供电我们就可以使用它[8]。
本设计使用两轮驱动,用两个电机分别驱动左轮和右轮。通过小车底部的两个寻迹探头来检测地面的黑线。主要利用了黑色对光的反射能力很弱,白色对光的反射能力较强的原理。假如,放置车辆的时候小车偏左,小车底部的右边的探头就会检测到地面的黑线,小车就会执行右转弯的函数使小车在两个探头之间,小车的两侧都检测不到黑线。小车直行。需要转弯的时候,寻迹探头会首先感知到地面颜色的变化,这个变化会由寻迹模块传给Arduino单片机由单片机内执行一个向另一侧转弯的信号,小车整体就会向另一侧转弯。当转过弯后,循环此过程直到两侧都检测不到黑线小车直线前进。
经过资料查阅、与老师探讨、总结出了两种设计的优缺点如下:
(1)Arduino平台,作为新发展起来的平台,它摒弃了传统单片机繁杂的开发模式,在C语言的基础上进行简化,使得作为一个Arduino平台的开发者而言,效率更高。
(2)使用Arduino平台做项目,由于它的广大兼容性,完全可以按照自己的需求来丰富、扩展自己的使用模块,使得项目的成品功能更加丰富。而传统的单片机,依赖于硬件的设计,需要和单片机匹配的硬件模块和制作整块PCB开发板。Arduino平台的模块化方式使得开发更便捷。
(3)Arduino平台自诞生起,它就是一个开源的平台,我们可以从互联网上获取想要的任何信息,在互联互助的今天,传统的单片机限于书本上的学习内容变得枯燥乏味,而互联网的多样化时代使得Arduino这个新平台的学习更加愉快。
综上所述,作为新兴的开源Arduino平台,它的性能比51单片机更好且运行更加稳定,而且传统的51单片机在高电平输出方面会稍显无力,在保护电路方面,51单片机会经常出现被烧坏的情况。在这个信息多元化的时代,Arduino平台的学习成本更低,开发效率更高。因此,本设计采用方案二。
1.2 项目的总体设计
本项目基于Arduino单片机设计的智能寻迹小车由:Arduino UNO开发板、转接主控板、寻迹模块、电源模块等构成。单片机负责存储程序、打开电源开关首先程序会执行按键、端口初始化操作。等待下一步指令,当单片机检测到按键按下后,蜂鸣器会响起,寻迹程序开始。小车在白色的地面沿着黑色寻迹路线前进。系统的功能框图如1.1所示。
图1.1 系统功能图
小车前进时,两侧的传感器映射灯常亮。假如小车要右转弯时,小车的左侧红外传感器始终能检测到返回的红外光,小车的左轮始终前进,小车的左指示灯常亮。小车右侧的红外传感器在右转弯时会触碰黑线,检测不到返回的红外光,输出高电平,右前轮停止转动,这时候右侧传感器映射灯熄灭。小车的左前轮前进,右前轮由于检测到黑色路线,右轮停止转动,实现小车右转弯。左转弯功能相反。既此时完成整个寻迹功能。
2 项目硬件设计
2.1 Arduino平台简介
Arduino Uno是基于ATmega328P单片机的开发板。它有14个数字输入/输出引脚,6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC电源接口,一个ICSP接口,一个复位按钮。它包含了单片机最小系统的全部内容,只用简单地连接到计算机的USB接口,或者使用电源适配器,甚至是电池,就可以驱动[9]。
在硬件方面,选择了Arduino Uno这块开发板,“Uno”在意大利语是“一”的意思,这是Arduino平台的第一块开发板,因此在功能反面这块开发板功能全、性能好,此后的Arduino开发板都是基于“Uno”的衍生产品。在软件方面Arduino平台开发出一套自己专门的Arduino IDE这就完成了Arduino平台初版的开发标准,也为后来的Arduino其他开发板奠定了基础。Arduino Uno的主要数据如表2.1.1所示。
表2.1 Arduino Uno主要数据
型号 Arduino Uno
微控制器 ATmega328P
工作电压 5 V
输入电压(推荐) 7-12 V
数字I/O引脚 14
PWM通道 6
模拟输入通道(ADC) 6
Flash 32 KB
SRAM 2 KB
EEPROM 1 KB
时钟速度 16 MHz
板载LED引脚 13
Arduino是一款方便上手、灵活便捷、效率极佳的开源电子技术平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)[10]。它构建于开源的simple I/O介面版,并且具有使用类似Java、C语言的良好开发环境。Arduino包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino平台;另外一个则是Arduino IDE,你的计算机中只要安装了Arduino IDE用USB连接到它的平台,选好对应的COM串口,编写出你想要做事情,把程序下载到Arduino当中。Arduino平台就会立刻执行它应该做的事情[11]。
Arduino开发板的核心是ATMEGA328P单片机,它是双列直插式28管脚的芯片,其引脚连接Arduino微控制器的模拟端口和数字端口关系图如图2.1所示。0-13号为数字端口,其中带有“”的具有PWM输出功能,标有A0A5标号的是模拟端口。
图2.1Arduino UNO端口与Atmal328P引脚对应图
2.7 蜂鸣器提示电路的设计
本设计需要一款当按钮按下时,会警示按钮被按下的报警提示模块,不需要过大的音量。通过蜂鸣器实现报警电路,具有电路简单,性能可靠、稳定等优点,最重要的是低成本。
本系统所采用的报警模块为5V有源蜂鸣器模块,蜂鸣器直接与图2.4.3中A3引脚相连。打开电源开关,当按钮被按下时,程序会给A3口一个高电平使蜂鸣器响,按钮松开时蜂鸣器停止。蜂鸣器电路图如2.14所示。
2.14 蜂鸣器电路
2.8 LED指示灯电路的设计
本设计中每此探测到黑色循迹路线都应该对应的LED指示灯,当小车一侧探测到黑线时,指示灯亮,反之,熄灭。随着线路的不断变化,指示灯的亮暗也应该随之变化。图2.15分别为LED左右指示灯电路。
图2.15 LED指示灯电路
3 项目的软件设计
3.1 Arduino的开发环境
Arduino的编程语言是基于C语言开发的,不过后来又引入C++的了面向对象的变成思想,这使得现在的Arduino核心库文件采用了C和C++混合而成[18]。
Arduino的编程语言,是指Arduino的给广大开发者们提供的接口(英文名是API)的集合。在Java中接口是一系列方法的声明,可以被任何人实现这个接口,这和C++的面向对象的编程思想有着异曲同工之妙。因此,即使我们不懂在传统的开发方式中,不懂配置各个寄存之间的关系,只要我们调用的相应的接口,底层的代码直接就帮我们配置了各个繁杂的寄存器。如下图3.1所示就是一个最基本的Arduino开发环境。
图3.1 Arduino开发环境
在Arduino的开发环境中,最重要的两个方法或函数,就是setup()和loop()。其中setup()方法中主要用来做定义变量的操作,该方法仅会在Arduino平台通电时运行一次,相当于变量的初始化操作。loop()方法是一个不断循环的函数,主要用这个方法来控制setup()中已经初始化好的端口。
实现一个Arduino最简单的让Arduino开发板上的LED灯闪烁的功能如下图3.2所示[19]。
图3.2 点亮Arduino开发板上面的LED灯的程序
其中pinMode(int,string)这个被封装好的接口需要两个参数,第一个参数类型为整数,主要是为了设置我接下来需要使用哪个引脚,第二个参数为INPUT或者OUTPUT,这样就设置好了引脚的模式,这样就初始化为13号端口的引脚。digitalWrite(int,string)这个被封装好的接口需要两个参数,第一个参数为定义好的接下来要用到的引脚,第二个参数为我要给这个引脚输出的是高电平(HIGH)还是低电平(LOW)。通过这些简单的被封装好的接口我们就能进行快速的开发。
3.2 寻迹小车端口初始化
在Arduino平台中若想使用一个端口应该进行端口的定义及初始化操作,如下图3.3为寻迹小车初始化操作。在主函数的外部定义Arduino控制小车的端口,在setup()函数中初始化定义好端口的输出方式。
图3.3寻迹小车初始化操作
3.3 寻迹小车行进函数
若想让小车按照规定的路线前进、转弯、停车等操作,应该在不同的方法中对已初始化好的端口进行对应操作,小车的直行停止前进函数如下图3.4所示。
图3.4 小车的前进和停车函数
3.4 单片机主程序介绍
主程序流程图如图3.5所示,打开转接板上的电源开关后系统进行初始化操作,当按键没被按下时程序一直在循环检测按键是否被触发,当按键被按下时蜂鸣器响动,小车处于启动状态。把小车放在具有黑线的白色寻迹路线上,若两侧均没有检测到黑色路线,小车会直线行驶,当小车一侧检测到黑线,另一侧没有检测到黑线时小车会向有黑线的这一侧进行转弯,当小车两侧传感器同时检测到黑线时,小车停止。
图3.5 程序主流程图
文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。