目 录
摘 要 Ⅰ
Abstract Ⅱ
引 言 1
1系统方案设计 3
1.1 方案论证 3
1.2 项目的总体设计 4
2 项目硬件设计 6
2.1 Arduino平台简介 6
2.2 ATmega328P单片机的最小系统 8
2.3 寻迹模块的设计 9
2.4 驱动模块的设计 11
2.5 电源模块的设计 14
2.6 按键电路的设计 15
2.7 蜂鸣器提示电路的设计 16
2.8 LED指示灯电路的设计 16
3项目的软件设计 16
3.1 Arduino的开发环境 17
3.2 寻迹小车端口初始化 18
3.3 寻迹小车行进函数 19
3.4 单片机主程序介绍 19
4 项目调试 22
4.1 项目硬件调试 22
4.2 项目软件调试 23
结 论 25
参考文献 26
附 录:程序源代码 28
致 谢 31
摘 要
在21世纪的今天,科技不断的进步,机器人这个词不在陌生,其功能和实用性也逐渐被人们所了解和接受,无论在智能家居还是在物流运输等场合,移动机器人充当着许多不可或缺的角色,所以,在当代的科技发展中,此领域发展相对于传统制造业发展极其迅速。为了探索具有良好寻迹功能的智能小车在现代快节奏的生活中能给人们提供何种便利,及对智能小车的各个性质研究有着重要的实际意义[1]。
本设计利用Arduino平台和相关电路组成的智能寻迹小车,其中核心主要包括了寻迹模块、电源模块、驱动模块等。本课题主要的核心就是用红外寻迹模块来识别路面上的黑色指定路线,以性能强劲、上手容易的Arduino单片机为核心,红外模块采集到的信号能转换为能被Arduino单片机识别的数字信号。采用驱动芯片L293D用来操纵直流减速电动机。软件部分选择了以C语言为核心封装的Arduino的编程语言,其具有跨平台、开放性、简单清晰等优点。
结果表明,基于Arduino的智能寻迹小车设计是可行的,本设计表现出了对人们生产生活等方面的极大便利。
关键词:智能小车;Arduino单片机;自动寻迹;驱动电路;
Abstract
Today in the 21st century, Continuous progress of science and technology,Robot application scenarios are more and more extensive, The performance of multi-functional mobile robot with Mechatronics is gradually enriched, No matter in smart home or in logistics transportation and other occasions, Mobile robots play many indispensable roles, therefor, In the development of modern science and technology, Compared with the traditional manufacturing industry, the development of this field is extremely rapid. Intelligent car with good tracking function is often used in modern logistics transportation system, It should be accurate, stable and real-time. Therefore, in the aspect of identification and tracking path, it is very necessary and important to study the properties of intelligent vehicle.
This paper presents the design of an intelligent tracking car based on Arduino single chip microcomputer. It is composed of Arduino MCU and external circuit, including control module, power module and trace module. In this design, infrared sensor is used as the detection module of intelligent car to identify the black designated route on the road. The core is Arduino single chip microcomputer with strong performance and easy to use, The signals collected by infrared module can be converted into digital signals which can be recognized by Arduino single chip microcomputer. The drive chip L293D is used to form a double H-bridge to control the DC motor. In the software part, the programming language of Arduino, which is encapsulated with C language as the core, is selected, It has the advantages of cross-platform, openness, simplicity and clarity. To sum up, the design of intelligent tracking car based on Arduino is feasible, and this design shows great convenience for people’s production and life.
Keywords: smart car; Arduino MCU; Automatic tracking; Drive circuit;
引 言
时代的发展伴随着科技的进步,智能化这个词语越来越被大众所熟悉,自动化行业的发展有了巨大的飞跃,机器人正是自动化行业中产生的佼佼者。智能机器人被广泛的应用于各个行业,例如医院利用机器人送药品,银行采用机器人分析客户的需求,在大数据时代的背景下,机器人无异于人类的左膀右臂,它的出现解决了许多问题,危险化学药品生产链上一定有机器人的身影,繁重又枯燥的工作也离不开机器人的效劳,并且机器人无论是在严寒或者酷暑的条件下都能出色的完成指令,极大的提高了劳动效率,将人类从危险繁重的工作中解放出来,从家用小机器人到生产链上的人类好帮手,机器人在不断地进步,它的优越性也被更多人熟知。由此可见,在这么多极端环境下工业机器人能代替人类进行操作,其最重要的功能就是寻迹,所以智能寻迹小车是我要研究的课题,最常见的快递分拣系统中,智能寻迹小车能根据规定好的路线对指定的货物进行分拣,其原理就是根据地面的黑线进行寻迹导航[2]。
传感器实时采集外部信息,Arduino单片机处理传感器传来的信号,并且实时改变车辆的行进路线,是基于Arduino的智能化寻迹小车主要特点,本设计包含了自动化、计算机、3D建模等多方面的知识。因此可以以基于Arduino的智能化寻迹小车设计为原型进行扩展,在快递分拣、工厂车间搬运重物或更多危险场景实现代替人类的功能。
本设计主要为了实现一个基于Arduino平台的智能寻迹小车,其核心以新型通用、性能可靠的ATmega328P单片机为核心,使用直流减速电动机驱动整个小车载体,在结合了有关传感器技术,实现了智能小车寻迹的设计[3]。
就目前形势而言,我国的机器人研制技术仅仅处于初级阶段,在“智能”的体现方面相对于欧美发达国家,也相对较差。其中智能移动机器人研究中当前的核心问题有两方面:一方面是如何让机器人的性能更高,比如机器人的行动在保证安全的前提他移动速度更快等方面。另一方面,如何使机器人变得更加智能,如遇到突发状况,机器人应该合理的在做到不伤害人类的前提下尽量保全自己。最后还要提高机器人适应环境变化的能力,使他们能在更多的地方被人类适用[3]。
在智能移动机器人的领域,涉及到多方面的技术,这些方方面面的技术都在影响着整个机器人的性能。就像人类一样,机器人也是一个复杂且精密的系统。这些技术主要有以下个方面:传感器系统,比如机器人要实现寻迹功能,就需要对应的寻迹模块,在本文中就运用了红外寻迹模块。还有利用摄像头加上机器学习算法进行的寻迹模块等。如超声波模块,可以通过超声波模块进行小车避障系统的设计,若将红外传感器和超神波传感器进行融合,整个智能机器人的功能会更加强大。机器人的视觉系统,机器人的视觉系统,可以用来捕获外界图像,并对捕获到的图像进行辨识和处理,在根据对应的程序进行相应的操作。人机接口系统,用于机器人和人类相互交流,传统的人机交流是一行行的代码,现在的人机交流大部分是图形界面[4]。
在国际领域中,智能移动机器人的核心技术方面,美国这个世界强国一直占有主导地位。美国的智能移动机器人技术发展早、精度高、性能强、功能全,已被各国所公认,在各个领域都有广大的应用。在亚洲,唯一的发达国家日本,各类机器人的研究颇深。中国主要原因是起步较晚,技术落后,现在国家各个政策的提出,在科技的高精尖要求不断提高,相信在不久的将来,中国的智能移动机器人领域也会变得强大[5]。
本文基于Arduino的智能寻迹小车,本篇论文共分为四章,主要内容如下:
第一章:系统方案设计。查阅资料,根据实际情况,提出两种可靠的实施方案,结合当前现状,选择合适的方案。
第二章:项目硬件设计。Arduino单片机的介绍、焊接单片机转接板、电机驱动模块、电源供电模块等。
第三章:项目软件设计。程序软件的设计原理及总体介绍,并进行软件部分的开发。介绍了系统的设计原理以及系统流程图。
第四章:系统调试。编写程序以及系统硬件连接的调试。完成本系统所需要识别执行动作的编写的准备工作以及程序的调试过程,搭建系统硬件联调。
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.2所示:
图2.2 Arduino Uno开发板实物图
(1) 微处理器:ATmega328P,8位微处理器,片内包含32KB Flash(0.5KB由BootLoader使用),2KB SRAM,1KB EEPROM,运行时钟频率为16MHz[12]。
(2)外接电源:当Arduino Uno板脱离电脑独立运行时,使用5-12V直流电源均可供电。
(3) USB接口:与电脑连接,用于从电脑中下载程序,同时给Uno单板供电。
(5) 模拟输入:6个模拟输入,提供10-bit的解析度(0-1023)。
(6) 数字输入/输出:Arduino Uno 开发板有14管脚用来输入或输出。其中1管脚是TX,0管脚是RX。他们是串口通信的引脚,作为AVR单片机提供了这两个串口通信的引脚Arduino Uno开发板为了解决Arduino平台连接电脑的问题把使用USB转接口的适配器和0,1两个串口相匹配,做到了Arduino平台与电脑的通信。Arduino开发板上带有的6个“~”的管脚作为可提供8位范围是(0-255)的PWM输出管脚。
2.2 ATmega328P单片机的最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对ATmega328P单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路、电源电路。下图2.3为ATmega328P单片机的一个最小系统[13]。
图2.3 ATmega328P的最小系统
复位电路的用途:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到外界干扰出现程序出错不能正常执行的时候,按下复位按钮内部的程序自动从头开始执行。 ATmega328P单片机只需在RESET接低电平信号即可实现复位功能,在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。
ATmega328P的晶振及其连接方法,CPU工作时都必须有一个时钟脉冲[14]。时钟电路就是产生像时钟一样准确运动的振荡电路。任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。时钟电路一般由晶体振荡器、晶振控制芯片和电容组成。在图2.3中,时钟电路连接的ATmega328P的第9、10号引脚。
2.3 寻迹模块的设计
本设计要想实现最基础的寻迹功能,首先需要的是寻迹模块,经过学习和材料的收集、查找。最终决定使用一个型号为LM393的双电压比较器、两个红外反射开关和两个10K可调电位器组成。
其中LM393多用于简单的数/模转换器、脉冲发生器、方波发生器、延时发生器、MOS时钟计时器灯。LM393被设计成能直接连接TTL和CMOS;当用双电源供电时,它能兼容MOS逻辑电路,即使是单电源供电,比较器的共模输入电压范围接近地电平。其主要特点如下:
(1)工作电源电压范围宽,单电源、双电源均可工作,单电源:2~36V,双电源:±1~±18V;
(2)消耗电流小,Icc=0.8mA;
(3)共模输入电压范围宽,Vic=0~Vcc-1.5V;
(4)输出可以用开路集电极连接“或”门[15]。
LM393的内部原理图如下图2.4所示。
图2.4 LM393 双电压比较器
LM393对应的引脚功能如下表2.2。
表2.2 LM393双电压比较器引脚功能列表
引出端序号 功能 符号 引出端序号 功能 符号
1 输出端1 OUT1 5 正向输入端2 IN+(2)
2 反向输入端1 IN-(1) 6 反向输入端2 IN-(2)
3 正向输入端1 IN+(1) 7 输出端2 OUT2
4 地 GND 8 电源 VCC
由于不同地面对光的反射系数不同,在寻迹模块中,加入了两个可调电位器,他们的作用是改变电阻大小,从而改变LM393双电压比较器与电阻比较的阻值,进而改变传入的高低电平。
如下图2.5两路寻迹模块电路所示:管脚2连接的电位器,整体提供的是一个比较参考电压。3、4管脚连接红外传感器红外接收二极管当接受到红外发射二极管发出的光时,其阻止就会降低(这是一个光电信号转换的过程,当电阻降低时,电压也随之降低,3管脚的电压小于2管脚的电压的时候,管脚1会输出低电平,把这个信号传给Arduino开发板,从而判断小车是否在黑线上行驶。
图2.5 寻迹模块整体电路
图2.6 寻迹模块实物图
2.4 驱动模块的设计
驱动模块主要用来接收单片机传来的信号,在本设计中我采用了恒压恒流桥式驱动芯片L293D,它来自于美国德州仪器公司。其支持4.5V-36V 的电压,最大输出电流为1A,在智能寻迹小车的应用很广,其内部构成的双H桥的双电机驱动电路很好的契合了我们小车所选用的双直流减速电动机。L293D内部的等效电路如下图2.7所示[16]。
图2.7 驱动芯片L293D内部等效电路图
H桥的工作原理,给定ENA使能端的信号为1,IN1为1,IN2为0时。T1和T4的NPN型三极管导通。T2和T3截止,电动机正转。构成的电流回路如下图2.8 H桥的工作示意图所示。当给定的IN1为0,IN2为1时,电动机反转,原理相同,这样就能控制电动机的正反转。
2.8 H桥的工作示意图
速度方面,使用脉冲宽度调制(PWM)方式,这种控制方式能使电源的输出点在这种方式能使电源的输出电压在工作条件变化时保持恒定。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中[17]。
在本设计中,Arduino单片机自带了PWM引脚,因此只需把引脚直接连到Arduino对应能输出的PWM引脚上,并在程序中进行设置,就可以进行PWM调控直流减速电机的速度。其中使用了Arduino单片机上的8,9,10,11~,引脚作为电机驱动芯片L293D的输入引脚。通过红外寻迹传感器传输回来的信号,在Arduino中进行处理,最后把处理好的数据传给驱动芯片这样就能控制小车的前进方向。Arduino单片机与L293D驱动芯片的连接如下图2.9、图2.10所示。
图2.9 Arduino 开发板与L293D连接电路图
图2.10 Arduino 开发板与L293D连接电路图
图2.11 转接板实物图
2.5 电源模块的设计
这本设计中,Arduino Uno开发板、两个直流减速电动机和驱动模块的工作电压均为5V,所以本设计采用两节1600mAh的充电电池为整个系统供电,两节电池充满电的电压和为7.4V。为了保证系统的可靠性,最终选用了有着优秀的过流保护和过热保护的7805三端稳压集成电路为整个系统提供5V电压。最终的电源模块的设计如下图2.12所示。
图2.12 电源电路
电机在运行的时候电流会比较大,整个电路电流过大会导致Arduino开发板复位,所以增加一个滤波电容,使滤波后的输出电压为更稳定的直流电压防止了复位情况的发生。D2为一个发光二极管,当电源接通时,它会亮起,起到对电源指示的作用。
2.6 按键电路的设计
本设计方案采用了一枚按键用于实现寻迹功能的启动,电源开关开启,系统会调用按键扫描函数,当按键没被按下时程序一直在循环检测按键是否被触发,当按键被按下时,Arduino的A2端口电平被拉高,调用执行相应的程序流程。按键部分的示意图如2.13所示。连接到Arduino单片机的示意图如2.9所示。
图2.13 按键电路示意图
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 程序主流程图
4 项目调试
4.1 项目硬件调试
电路板焊接,按照元器件的判断方式按照长正短负的方式进行区分安装,逐一焊接。焊接好后,接通5V电源,首次通电需马上断电,检查指示灯提示,以防出现焊接错误造成器件损毁。焊接好的转接板和Arduino开发板如下图4.1所示。
图4.1 (左) Arduino开发板 (右)转接板
把转接板按照Arduino开发板上的孔位对齐,接到Arduino开发板上,如下图4.2所示。
图4.2 Arduino开发板和转接板对接图
硬件部分整体联调,将小车的电机、主板、寻迹模块等依次用L形固定架固定在小车上,最终小车的整体如下图4.3所示。
4.3 基于Arduino的智能寻迹小车整体图
4.2 项目软件调试
(1)小车的转弯问题
由于小车没有传统汽车的差速器,为了解决这一难题,我查阅了大量资料,学习后发现可以在程序中控制,当小车遇到弯路的时,使一侧车轮前进,另一侧车轮停止,这样两侧车轮实现一个速度差来实现转弯。在程序中体现如下图4.4小车的转弯算法所示。经过多次的调试发现,当小车的PWM调速值较低的时候,小车整体的行进速度不快,性能较差,当PWM调速比例过高,会导致小车转弯速度过快,导致小车跑出黑线寻迹路线,由此把小车PWM调速确定在150。
图4.4 小车的转弯算法
(2)程序下载问题
当编写好程序并编译通过后,通过USB连接到Arduino开发板,发现并不能连接并下载到开发板中,为此我查阅了大量资料,并且实践到项目中,最终总结出Arduino正确使用方法。
首先需要建立一个新的项目,选择使用的Arduino平台的类型。在主界面的工具—>开发板—>Arduino Uno,可以编写一个新的文件,编写完程序后进行验证,验证就是检测程序是否有错误,如果有错误就不能下载到Arduino开发板中。验证通过后可以通过USB端口连接直接点击上传,就可以把写好的程序下载到Arduino当中。下载之前需要检查程序是否安装了驱动,Arduino的安装包中自带了Windows的安装驱动,我们只需把他安装到自己的电脑中,在工具—>端口中选择正确的连接端口,就可以把程序正确的下载到Arduino中。若程序正确的验证并且成功的下载到Arduino平台中。
结 论
采用Arduino Uno平台完全符合本设计的控制需求,循迹模块、电源模块、驱动模块可以与ATmega328P单片机完美的融合兼容,可抗干扰耐用。整个小车运行稳定可靠,识别黑色循迹路面灵敏,准确。电源可以共用整合,该设计方案达到了我们的预期设计。
本设计由电源电路、以Arduino Uno开发板为核心的、直流减速电动机驱动电路、寻迹模块电路、LED指示灯电路、蜂鸣器提示电路和按键电路组成。首先,给小车接通电源,打开开关,按下按钮,蜂鸣器响起。小车的主程序会进行初始化操作,把小车放在带有黑色寻迹的路面时,小车沿着黑色的寻迹路线进行行驶,传感器把实时路径传送给主控芯片,主控芯片把接受到的信息处理成能被驱动电路识别的电信号,通过驱动电路来控制电机的转速和方向。既此时完成寻迹功能[20]。
本设计的主要实现功能是:接通电源,按钮被按下时,蜂鸣器响动,小车启动寻迹程序,小车会根据地面的黑色寻迹路线进行自动寻迹功能的同时,左右两侧LED指示灯会提示哪边探测到了寻迹路线。采用Arduino新平台后,较传统的51平台,系统的识别准确率大大提高。由此能更加稳定、高效的完成寻迹任务,大大降低了程序出错的概率。
参考文献
[1]尤扬. 基于模糊控制的新型循迹智能小车设计[D].沈阳工业大学,2015:1
[2]段丽娜.基于FPGA的智能小车设计[J].电子设计工程,2014,22(9):184-186,190
[3]俞凡. 基于单片机的厂区智能循迹灭火车模型的设计和实现[D].安徽农业大学,2016:1
[4]王晓芳. 智能机器人的现状、应用及其发展趋势[J].科技视界,2015,(33) :98-99
[5]任福继,孙晓.智能机器人的现状及发展[J].科技导报,2015,33(21):32-38.
[6]杨鹏鹏. 智能机器人的现状及发展趋势[J].中国机械,2014,(20) :54-54
[7]任德志. 便携式红外吸收型甲烷检测仪的研究与设计[D].南京农业大学,2012:18
[8]谢晓敏, 闵锐. 基于89C51单片机的智能循迹避障小车设计[J].太原学院学报(自然科学版),2018,36(1) :15-18
[9]彭小波. 医疗垃圾回收处理监控系统设计与实现[D].西南科技大学,2018:22
[10]郎庆阳,吴明超,张楠, 等.Arduino在压力监测项目开发中的应用研究[J].科技风,2019,(12) :181
[11]张哲,陈丽银,汪栋, 等.基于Arduino UNO大型汽车盲区检测与报警装置的设计[J].科技创新与应用,2018,(28) :49-50
[12]闫洪猛. 基于Arduino的移动机器人控制系统设计[J].电子技术与软件工程,2018,000(007) :106
[13]肖洒. 支持富媒体的多终端显示平台的研究与设计[D].山东:山东大学,2018:12
[14]李莹. 模块化仿生四足机器人的步态设计及运动控制[D].浙江:浙江工业大学,2014:25
[15] 张新. 基于单片机的信号发生器设计系统[D].东北师范大学,2011:32
[16]仲攀龙. 激光器控温用中压恒流泵流速控制系统设计[D].中国计量大学,2016:16
[17]谭传武, 刘红梅, 周玲. 一种智能循迹系统的设计与实现[J].国外电子测量技术,2019,38(09) :121-125
[18]张恺, 张玉钧, 殷高方, 石朝毅, 于绍慧, 王志刚, 肖雪, 王欢博, 段静波, 刘文清. 基于脉冲宽度调制技术的水浊度探测研究[J].大气与环境光学学报,2012,7(01) :63-70
[19]何建标. 基于激光雷达的果园割草机器人路径规划研究[D].华南农业大学,2016:19
[20]于洋. 基于Arduino的自动避障及通信控制智能小车系统的研究与设计[D].吉林大学,2017:30
附录:程序源代码
// 寻迹实验
int Left_motor_go=8; //左电机前进(IN1)
int Left_motor_back=9; //左电机后退(IN2)
int Right_motor_go=10; // 右电机前进(IN3)
int Right_motor_back=11; // 右电机后退(IN4)
int key=A2;//定义按键 数字A2 接口
int beep=A3;//定义蜂鸣器 数字A3 接口
const int SensorRight = 3; //右寻迹红外传感器(P3.2 OUT1)
const int SensorLeft = 4; //左寻迹红外传感器(P3.3 OUT2)
int SL; //左寻迹红外传感器状态
int SR; //右寻迹红外传感器状态
void setup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
pinMode(key,INPUT);//定义按键接口为输入接口
pinMode(beep,OUTPUT);//定义蜂鸣器输出
pinMode(SensorRight, INPUT); //定义右寻迹红外传感器为输入
pinMode(SensorLeft, INPUT); //定义左寻迹红外传感器为输入
}
//=基本动作===
// 前进
void run()
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,150);
//delay(time * 100); //执行时间,可以调整
}
//void brake(int time) //刹车,停车
void brake()
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
//delay(time * 100);//执行时间,可以调整
}
//void left(int time) //左转(左轮不动,右轮前进)
void left()
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,150);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左轮停止
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100); //执行时间,可以调整
}
//void right(int time) //右转(右轮不动,左轮前进)
void right()
{
digitalWrite(Right_motor_go,LOW); //右电机停止
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW);//左电机前进
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,150);//PWM比例0~255调速
//delay(time * 100); //执行时间,可以调整
}
void keysacn()//按键扫描
{
int val;
val=digitalRead(key);//读取数字7 口电平值赋给val
while(!digitalRead(key))//当按键没被按下时,一直循环
{
val=digitalRead(key);//此句可省略,可让循环跑空
}
while(digitalRead(key))//当按键被按下时
{
delay(10); //延时10ms
val=digitalRead(key);//读取数字A2口电平值赋给val
if(val==HIGH) //第二次判断按键是否被按下
{
digitalWrite(beep,HIGH); //蜂鸣器响
while(!digitalRead(key)) //判断按键是否被松开
digitalWrite(beep,LOW); //蜂鸣器停止
}
else
digitalWrite(beep,LOW);//蜂鸣器停止
}
}
void loop()
{
keysacn();//调用按键扫描函数
while(1)
{
//有信号为LOW 没有信号为HIGH 检测到黑线 输出高 检测到白色区域输出低
SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭
SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭
if (SL == LOW&&SR==LOW)
run(); //调用前进函数
else if (SL == HIGH & SR == LOW)// 左寻迹红外传感器,检测到信号,车子向右偏离轨道,向左转
left();
else if (SR == HIGH & SL == LOW) // 右寻迹红外传感器,检测到信号,车子向左偏离轨道,向右转
right();
else // 都是黑色, 停止
brake();
}
}
致 谢
经过几个月的忙碌工作,用心设计,本设计倾注了很多精力和汗水,现在即将到达设计的尾声,非常感谢胡海龙老师和于宏波老师的耐心指导,在校四年期间各位授课老师的教导和给我的很多实践的机会,还有一些网络上的朋友。在设计中遇到了许许多多的问题,但是在向老师请教的时候总会得到解决思路,其实问题不可怕,最可怕的就是不知道问题出在了哪里。
印象中最深刻的是,智能小车的寻迹部分,当时经过学习,只理解和清楚了红外寻迹传感器的基础用法,对怎样设计出一个合理可调灵敏度的电路的寻迹模块一头雾水,经过胡海龙老师的悉心教导,和自己的深入学习,最终设计出了用电位器来改变电阻进而改变整个电路电压,最后用一个LM393双电压比较器来控制寻迹模块的灵敏度。
更多的时候,我们需要的只是一个解决方案,一个思路,剩下的就是不断去钻研,去尝试,再次感谢胡海龙老师和于宏波老师帮忙提供的一个又一个宝贵的思路,更要感谢在此期间遇到的每一个人,感谢身边的朋友,有很多时候,也许就是因为朋友的一句话,就会让你斗志满满,每当意志消沉,最想找自己的朋友同学谈谈心,散散心,所以,也要感谢朋友的包容与陪伴,感谢家人的鼓励与支持,在我看来,完成这个作品,顺利毕业,应该就是对身边的人也是对自己最好的交代。