(页数:61页、字数:14473字)
摘 要
21世纪是信息科技的世纪,近几十年来科学技术的发展一日千里,各种信息化、智能化设备、仪器仪表和工具层出不穷。同样,我国科学技术水平也取得了非常明显的进步,随着我国科技水平不断进步提高和工业自动化、智能化水平不断推进,智能车被广泛应用于社会生活和工业生产中,极大便利了人们生活和提高了生产效率。
本文基于STM32F103C8T6单片机设计了一种智能小车,该智能小车分为智能小车控制板和智能小车底板。由功能上来分,该智能小车由STM32F103C8T6单片机、OLED液晶模块、功能按键、状态显示LED、蜂鸣器、红外循迹电路、红外避障电路、电机驱动电路、超声波模块、舵机、红外遥控信号接收电路、供电电源电路等组成。智能小车还可以根据实际需要添加相关功能模块,进行功能的拓展。
该智能小车可以实现PWM调速、红外循迹、红外避障、红外跟随、超声波避障、红外遥控、测速、灭火等功能。
采用的技术主要有:
(1)通过编程(PWM调制)来控制小车的速度;
(2)红外传感器的有效应用;
(3)超声波模块测距技术;
(4)单片机STM32F103C8T6的应用;
关键词:智能小车;单片机;循迹;遥控;避障
Abstract
The 21st century is the century of information technology. In recent decades, science and technology have developed rapidly, and all kinds of information and intelligent equipment, instruments and tools emerge one after another. Similarly, China's scientific and technological level has also made very obvious progress. With the continuous progress of China's scientific and technological level and the continuous promotion of industrial automation and intelligence, intelligent vehicles are widely used in social life and industrial production, which greatly facilitates people's life and improves production efficiency.
This paper designs an smart car based on stm32f103c8t6 single chip microcomputer. The smart car is divided into smart car control board and smart car bottom plate. In terms of function, the smart car is composed of stm32f103c8t6 single chip microcomputer, OLED LCD module, function keys, status display LED, buzzer, infrared tracking circuit, infrared obstacle avoidance circuit, motor driving circuit, ultrasonic module, steering gear, infrared remote control signal receiving circuit, power supply circuit, etc. The smart car can also add relevant functional modules according to the actual needs to expand the functions.
The smart car can realize PWM speed regulation, infrared tracking, infrared obstacle avoidance, infrared following, ultrasonic obstacle avoidance, infrared remote control, speed measurement, fire extinguishing and other functions.
The technologies adopted mainly include:
(1) Control the speed of the trolley through programming (PWM modulation);
(2) Effective application of infrared sensors;
(3) Ultrasonic module ranging technology;
(4) Application of single chip microcomputer stm32f103c8t6;
Key words: intelligent car; singlechip; Tracking; Remote control; Obstacle avoidance
1 绪论
1.1 前言
根据课题的设计要求,确定如下设计方案:设计2块电路板:智能小车控制板和智能小车底板。智能小车控制板采用STM32F103C8T6单片机作为智能小车的控制核心(智能小车控制板也可以单独作为单片机开发板使用)。智能小车的底扳上包括:电机驱动电路,红外循迹电路;红外避障电路、电源电路等等。
1.2设计任务与要求
根据设计任务书中提出的智能小车功能及技术要求,明确智能小车的总体设计方案,并在此基础上进行智能小车电路和程序设计的构思。进而完成智能小车硬件电路设计方案和程序设计方案。
智能小车设计任务与要求分析:
a、可实现智能小车前进、左转、右转、加速、减速、停止
采用4个驱动轮方式,驱动轮采用直流减速电机驱动。智能小车前进和后退只要使四个驱动轮的运转速度一样就可以实现;左转与右转利用智能小车两侧驱动轮速度差来实现。智能小车加速、减速通过调节PWM的脉宽来调整驱动轮转速来实现。智能小车的停止只要将4个驱动轮停转就可实现。
b、可实现智能小车PWM调速
通过调整PWM调速脉宽来达到调整智能小车运动速度的目的。
c、可以实现智能小车黑线循迹
在智能小车的车底前部安装红外传感器,智能小车在循迹过程中实时检测地面黑色轨迹线。当智能小车偏离轨迹线时,智能小车及时作出调整并回到轨迹线上来。
d、可以实现智能小车红外避障
在智能小车车头部分安装红外传感器,智能小车运动时,红外传感器实时探测前方是否有障碍物,当检测到前方有障碍物时,智能小车做出躲避动作。
e、可以实现智能小车跟随障碍物
在智能小车车头部分安装红外传感器,智能小车运动时,红外传感器实时探测前方是否有障碍物,当检测到前方有障碍物时,智能小车跟随障碍物运动。
f、可以实现智能小车超声波避障
智能小车可以安装超声波模块和舵机。舵机带动超声波模块左右摆动;超声波模块测量智能小车前方障碍物距离智能小车的距离。当距离小于一定值时,智能小车进行避障运动。
g、可以实现智能小车红外遥控
智能小车上安装红外遥控信号接收管,当接收到红外遥控器的控制信号时,智能小车做出相应的动作。可以控制智能小车前进、左转、右转、后退和停止。
h、可以实现智能小车测速
在小车上安装测速模块,可以测量小车驱动电机的转速,从而实现测量小车的运动速度的功能。
i、可以实现智能小车小车灭火功能
在智能小车上安装上灭火模块和火焰探测器,可以实现智能小车红外遥控灭火和循迹灭火功能。
j、利用液晶模块OLED显示智能小车的运动参数。
1.3智能小车硬件设计思路
本设计使用STM32F103C8T6型单片机做为智能小车的控制核心,具体使用STM32F103C8T6型单片机学习板作为智能小车的控制板。学习板使用的处理器是STM32F103C8T6型单片机,带液晶OLED,功能按键,红外遥控信号接收管和蜂鸣器。采用它作为智能小车的控制板能减少设计风险,减轻设计工作量,提高设计工作进度。
除了智能小车控制板外还需要设计智能小车的底板,在底板上需要安装有四个驱动轮、驱动直流电机及其驱动电路。在底板的前方还需要有舵机安装位置(带动超声波模块转动),超声波测距仪的型号为HC-SR04。在小车的前方还应有红外测障装置,小车底板的底部有红外寻迹探测装置。考虑到智能小车控制板和底板是独立的两块电路板,它们之间的电气连接采用杜邦线。
智能小车的底板上还安装有电池,作为智能小车的动力。
1.3.1 智能小车控制板设计思路
智能小车控制板采用现成的STM32F103C8T6单片机学习板,它的各种硬件资源满足对智能小车的控制要求。下图是在智能小车中用到的其硬件资源的框图。
1.3.2 智能小车底板设计思路
智能小车的底板作为智能小车的底盘,上面需要安装电池盒;驱动轮、直流电机、直流电机驱动电路;红外循迹电路;红外测障装置等。下图是智能小车底板资源框图。
2 单片机的组成及特点
单片机是微型机的一个主要分支,在结构上的最大特点是把CPU、存储器、定时器和多种输入/输出接口电路集成在一块超大规模集成电路芯片上。就其组成和功能而言,一块单片机芯片就是一台计算机。STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C~85°C。
2.1 单片机的组成
STM32F103C8T6单片机通过内部总线把各个主要部件接为一体,其内部包括:
ICode总线:该总线将CortexTM-M3内核的指令与闪存指令接口相连接,指令预取在此总线上完成;
DCcode总线:该总线将CortexTM-M3内核的DCcode总线与闪存存储器的数据接口相连接(常量加载和调试访问);
系统总线:该总线连接CortexTM-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和
DMA间的访问;DMA总线:此总线将DMA和AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。
总线矩阵:总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。总线矩阵包含4个驱动部件(CPU的DCode、系统总线、DMA1总线和DMA2总线)和4个被动部件(闪存存储器接口(FLITF)、SRAM、FSMC和AHB2APB桥)。AHB外设通过总线矩阵与系统总线相连,允许DMA访问。
AHB/APB桥(APB):两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。
存储器组织:程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
单片机功能单元一般中有:定时器/计数器、串行端口、中断系统AD/DA、SPI、I2C总线等。
STM32F103C8T6单片机的组成结构如图所示:
2.2 单片机的特点
单片机的各种结构形式及它所采取的半导体工艺,使其具有很多显著的特点,因而在各个领域都得到了迅猛的发展。单片机主要有如下特点,有优异的性价比。
1、集成度高、体积小、有很高的可靠性。
单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了芯片之间的连线,大大的提高了单片机的可靠性与抗干扰能力。另外,其体积小,对于强磁场环境易于采取屏蔽措施,适合在恶劣环境下工作。
2、控制功能强
为了满足工业控制的要求,一般单片机的指令系统中均有极丰富的指令、I/O口的逻辑操作以及微处理能力。单片机的逻辑控制功能及运行速度均高于同一档次的微机。
3、低功耗、低电压,便于生产便携式产品。
4、单片机系统扩展和系统配置较典型、规范,容易构成各种规模的应用系统。
2.3 STM32F103C8T6单片机介绍
STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。
1、工作电压:电压-电源(Vcc/Vdd):2 V ~ 3.6 V。
2、工作频率范围:72MHz。
3、总线宽度:32位。
4、程序存储器容量:64KB (64K x 8)。
5、RAM容量:20K x 8。
6、通用I/O口(输入/输出数:37个)。
2.4 STM32F103C8T6单片机引脚功能说明
STM32F103C8T6单片机管脚分配图如下图所示。
3 方案设计
智能小车设计工作内容包括智能小车硬件电路设计和智能小车控制软件设计部分。智能小车硬件电路设计工作从电路原理图的绘制到PCB电路板的绘制均为自行完成。智能小车控制软件采用C语言编写,一个程序实现一个智能小车的相关功能。
3.1 硬件设计
3.1.1 智能小车控制板硬件设计
3.1.1.1 STM32F103C8T6单片机最小系统
我们想要单片机能工作起来,首先应具备一些基本的条件,这些基本的条件我们称之为单片机的最小系统。
1、处理器:处理器型号是STM32F103C8T6。
2、电源:这当然是必不可少的了。STM32F103C8T6单片机使用的是3.3V电源。 采用电源芯片1117-3.3V为STM32F103C8T6单片机提供3.3V电源。
3、振蒎电路:STM32F103C8T6单片机是一种时序电路,必须提供脉冲信号才能正常工作,在这里STM32F103C8T6单片机外接8M晶体振荡器Y2。
4、复位电路。复位电路包括电容C15、电阻R13和按键S1。当按下按键S1时,处理器会进行复位。
5、模式选择:J10和J14是模式选择跳线,烧写程序时需要将跳线帽BOOT0取下,工作时需要将跳线帽BOOT0插上。
3.1.1.2 程序下载电路
程序下载芯片为CH340,CH340芯片将USB口转换成串口。给STM32F103C8T6单片机烧写程序的时候用一条USB线就可以了。
3.1.1.3 3.3V电源电路
3.3V电源芯片为1117-3.3V芯片为STM32F103C8T6单片机提供3.3V电源。
3.1.1.4 电源开关电路
J2为USB插座,S6为电源开关。当S6被按下后就接通了,这时VCC_5V的被接通到5V。
3.1.1.5 OLED液晶接口
J7为OLED液晶接口,R1和R2为上拉电阻。
3.1.1.6 IO口
J1、J3和J13是IO口插座,将STM32F103C8T6单片机部分IO管脚引出。
3.1.1.7 对外供电接口
对外供电接口分为5V和3.3V对外供电接口,可以对外提供5V和3.3V电源。当智能小车外接功能模块时,可以通过对外供电接口获取电源。
3.1.1.8 LED电路
控制板上有4个LED。分别用单片机的PB12,PB13,PB14,PB15管脚控制,当要LED亮时,将相关的控制管脚设置为低电平;当要LED灭时,将相关的控制管脚设置为高电平。需要将J4用跳线帽连接上。
3.1.1.9 蓝牙接口
蓝牙接口用于接蓝牙模块。电阻R3和电阻R5不焊接。这个蓝牙接口适合的蓝牙模块型号是:HC-05。本智能小车没有用到蓝牙模块,这个蓝牙接口是作为备用。
3.1.1.10 红外遥控信号接收管
红外接收管用于接收红外遥控器的遥控信号。红外接收管的型号为:VS1838B。
智能小车控制板上有4个按键,按键状态的读取管脚为单片机的PA8,PA11,PA12,PA15管脚。按键被按下的时候,相关管脚上是低电平。
3.1.1.11 按键电路
智能小车控制板上有4个按键,按键状态的读取管脚为单片机的PA8,PA11,PA12,PA15管脚。按键被按下的时候,相关管脚上是低电平。
3.1.1.12 蜂鸣器电路
蜂鸣器的控制管脚是PB5管脚,当要蜂鸣器发声时,将PB5管脚设置为低电平。
3.1.2 智能小车低板硬件电路设计
3.1.2.1 电源部分
智能小车采用锂离子电池供电。因为本产品使用的器件需要5V电源供电,因而需要将电池电压输出转换成5V电压,在这里使用电源芯片7805进行电源电压的转换。电源部分接线图如图所示。
BT1是两节可以充电的18650锂离子电池。S1是电源开关,按下时电源接通,松开时电源切断。7805是电源芯片,将锂离子电池电压转换成5V。采用2片7805电源芯片,其中U1产生5V电源给除L293D电机驱动芯片之外的芯片提供电源;U6产生5V电源给L293D电机驱动芯片提供电源。发光二极管D1,D10是电源指示灯,当电源开关接通时,发光二极管发光。电源部分中用到的电容起滤波的作用。该电源电路在智能小车底板上。
3.1.2.2 电机驱动电路
智能小车电机的驱动芯片采用L293D。L293D是一款单片集成的高电压、高电流、4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈、DC和步进电机)和开关功率晶体管等等。L293D有4个通道,每个电机需要用到两个通道,以实现电机的正反转。4个电机就需要用到8个通道。本智能小车需要2片L293D电机驱动芯片。电机驱动电路在智能小车底板上。智能小车的电机驱动电路如下:
3.1.2.3 红外循迹电路
智能小车红外循迹电路由收发一体的红外收发管P1,P2(位于智能小车底板前部的下方);电位器R18,R29;发光二极管D6,D7和芯片LM324等组成。一共有两路,对应的电位器(R18和R29)用于调节灵敏度。LM234用于信号的比较,并产生比较结果(高电平或低电平)输出给单片机进行处理,智能小车控制板上的单片机根据比较结果(高电平或低电平)来判断智能小车是否偏离轨迹,如果偏离了轨迹,及时进行调整,避免智能小车偏离轨迹。红外循迹电路在智能小车底板上。
3.1.2.4 红外避障电路
智能小车红外避障电路由电位器R17,R28;发光二极管D8,D9;红外发射管 D2,D4和红外接收管D3,D5(位于智能小车底板前部左右两侧)和芯片LM324等组成。一共有2路,对应的电位器(R17和R28)用于调节灵敏度。LM234用于信号的比较,并产生比较结果(高电平或低电平)输出给单片机进行处理,智能小车控制板上的单片机根据比较结果(高电平或低电平)来判断智能小车前方是否有障碍物,如果智能小车前有障碍物,智能小车进行避障运动。红外避障电路在智能小车底板上。
3.2 程序设计
产品的程序采用C语言进行开发,开发环境为Keil,程序下载软件为mcuisp。
3.2.1 开发环境Keil介绍
Keil是美国Keil Software公司出品的单片机C语言软件开发系统。它提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。Keil生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显优势,易学易用。Keil开发环境界面如下图所示:
3.2.2 程序下载软件mcuisp软件介绍
MCUISP 是一款单片机下载编程烧录软件,是针对STM32系列单片机而设计的,使用简便,现已被广泛使用。MCUISP软件操作界面如下:
智能小车的程序采用C语言编写,采用模块化设计。每一项功能分别用不同的函数实现,程序简洁易懂。
3.2.3.1 智能小车全速前进运动
以智能小车左电机的控制为例,为了更好地介绍程序源代码,我们先看下电机控制电路,如下:
左前电机和左后电机的正转,反转由3个信号控制: PA2(P1.2),PA3(P1.3),PA4(P1.4)。PA2(P1.2)接电机驱动芯片U2和U3的En1管脚;PA3(P1.3)接电机驱动芯片U2和U3的In1管脚;PA4(P1.4)接电机驱动芯片U2和U3的In2管脚。
右前电机和右后电机的正转,反转由3个信号控制:PA7(P1.7),PA6(P1.6),PA5(P1.5)。PA7(P1.7)接电机驱动芯片U2和U3的En2管脚;PA6(P1.6)接电机驱动芯片U2和U3的In3管脚;PA5(P1.5)接电机驱动芯片U2和U3的In4管脚。
智能小车全速前进控制程序如下:
首先,通过下列语句定义电机驱动芯片对应STM32F103C8T6单片机的控制管脚。
#define EN1 PAout(2)
#define IN1 PAout(3)
#define IN2 PAout(4)
#define EN2 PAout(7)
#define IN3 PAout(6)
#define IN4 PAout(5)
智能小车全速前进控制通过函数Full_Speed_Forward()实现。在Full_Speed_Forward()函数中,首先将L293D的四个通道使能,然后分别控制左右电机的转动。
void Full_Speed_Forward(void)
{EN1 = 1;IN1 = 1;IN2 = 0;EN2 = 1;IN3 = 1;IN4 = 0;}
程序中的语句 EN1 = 1;EN2 = 1使能电机驱动芯片的电机控制通道。 IN1 = 1;IN2 = 0控制为左电机的正转(如果是:IN1 = 0;IN2 = 1则控制为左电机的反转)。语句IN3 = 1;IN4 = 0控制为右电机的正转(如果是:IN3 = 0;IN4 = 1控制为右电机的反转)。
在main()函数中调用Full_Speed_Forward ()函数,智能小车上电后就能全速前进了。
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
Motor_Init();
Full_Speed_Forward();
while(1)
{;}
}
下面是智能小车全速前进运动实验的程序流程图:
3.2.3.2 智能小车PWM调速前进运动
有时候我们需要控制智能小车的速度,不希望智能小车全速前进。比如在“智能小车循迹实验”中,如果小车速度过快,来不及反应做出方向的调整,小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。
智能小车PWM调速前进程序如下:
首先我们设置定时器,让它每1毫秒中断一次。
Timerx_Init(9,7199);
同时,我们还定义了如下变量,用于智能小车的PWM调速。
u8 pwmval_left = 0;
u8 pwmval_right = 0;
u8 pwmval_left_init = 10;
u8 pwmval_right_init = 10;
u8 right_pwm = 1;
u8 left_pwm = 1;
我们先看定时器的中断处理函数,定时器每1毫秒中断一次,每次中断都执行中断处理器函数。
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)
{
pwmval_left = pwmval_left + 1;pwmval_right = pwmval_right + 1;
left_moto();right_moto();
}
TIM3->SR&=~(1<<0);
}
我们看到,定时器每中断一次,变量pwmval_left、pwmval_right就加1。同时调用以下2个函数:left_moto();right_moto()。
以函数left_moto()函数为例,我们看看里面的代码起什么作用。该函数是智能小车的左电机PWM调速函数。
void left_moto(void)
{
if(left_pwm)
{
if(pwmval_left <= pwmval_left_init){EN1 = 1; }
else{EN1 = 0;}
if(pwmval_left >= 20){pwmval_left = 0;}
}
else{EN1 = 0;}
}
语句if(left_pwm)相关于开关,当left_pwm为1时,执行条件范围内的语句。当left_pwm为0时(对应else), 处理器PA2(P1.2)管脚输出的是低电平,即电机控制芯片的En1(使能管脚)的控制信号为低电平,这时该电机控制通道是截止的,对应电机是停止转动的。
当pwmval_left <= pwmval_left_init时,处理器PA2(P1.2)管脚输出的是高电平,即电机控制芯片的En1(使能管脚)的控制信号为高电平,这时该电机控制通道是通的,可以控制电机正转或反转。
反之,对应else语句,处理器PA2(P1.2)管脚输出的是低电平,即电机控制芯片的En1(使能管脚)的控制信号为低电平,这时该电机控制通道是截止的,对应的电机是停止转动的。
而语句if(pwmval_left >= 20){ pwmval_left = 0;}的作用是当pwmval_left >= 20时,重新将pwmval_left设置为0。
到这里,我们可以这样理解,在20个时间段的范围内(对应20个定时器的中断),我们可以通过调整变量pwmval_left_init的值来达到调整电机转速的目的。
比如,情况1:当pwmval_left_init为10时,那么变量pwmval_left在0到10的范围内,电机是转动的;而变量pwmval_left在11到20的范围内,电机是停止转动的。再比如,情况2:当pwmval_left_init为15时,那么变量pwmval_left在0到15的范围内,电机是转动的;而变量pwmval_left在16到20的范围内,电机是停止转动的。再比如,情况3:当pwmval_left_init为6时,那么变量pwmval_left在0到6的范围内,电机是转动的;而变量pwmval_left在7到20的范围内,电机是停止转动的。我们可以知道,在一个固定的时间段内,3种情况中电机转动的持续时间,情况2 > 情况1 > 情况3。也就是说3种情况中轮子的转速,情况2 > 情况1 > 情况3。这样就可以通过修改参数pwmval_left_init值,达到对智能小车电机调速的目的。
从控制程序中我们可以知道,调节pwmval_left_init和pwmval_right_init的值就可以调节EN1和EN2上信号的占空比,从而调节左电机和右电机的运转速度,最终完成智能小车的运动速度。
下面是智能小车PWM调速运动实验的程序流程图:
3.2.3.3智能小车红外循迹运动
智能小车循迹运动的原理如下。红外光线具有反射特性,但对不同颜色的物体反射量是不一样的。对白色物体,红外光线的放射量就会多一点,红外收发管的电压输出就会高一点;而对黑色物体,红外反射量大量减少,红外收发管的电压输出也低。红外收发管的输出电压信号输入到LM324与电位器的电压输出进行比较(这个电压的大小可以通过调节电位器来调整)。这样,我们只要将电位器调节到合适的范围,就可以使红外收发管对着白色物体时LM324输出0(低电平),对应发光二极管亮;红外收发管对着黑色物体时LM324输出1(高电平),对应发光二极管灭。单片机根据LM324输出的电平状态,就能实时判断智能小车是否沿着黑色轨迹运动,如果智能小车是沿着黑色轨迹运动,红外收发管接收的是白色(地板)反光,LM324输出的是0(低电平);如果智能小车是跑偏了,红外收发管接收的是黑色(轨迹线)反光,LM324输出的是1(高电平)。单片机根据这一信号判断智能小车的运动状态,及时对智能小车的前进方向作出调整。
智能小车黑线循迹代码如下:
首先,通过下面2条语句将循迹信号与STM32F103C8T6单片机的PA13和PA14管脚对应上。
#define XJ_LEFT PAin(13)
#define XJ_RIGHT PAin(14)
下面3个函数是分别控制智能小车前进、左转和右转。
void forward(void) //智能小车前进
{IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0;}
void left_turn(void) //智能小车左转
{IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;}
void right_turn(void) //智能小车右转
{IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;}
当XJ_LEFT = 0和XJ_RIGHT = 0,表明是由白色的物体(地面)反射红外线、黑色的轨迹线处于两个红外收发管的中间(智能小车没有跑偏),这时智能小车继续前行。
当XJ_LEFT = 1和XJ_RIGHT = 1,表明两边都感应到黑线(这种情况基本不会出现,主要是容错处理)。
当XJ_LEFT = 1和XJ_RIGHT = 0,表明左边红外收发管检测到黑线,右边红外收发管检测到白色的物体(地面)。这时智能小车是右偏了,程序就控制智能小车左转进行调节。
当 XJ_RIGHT = 1和XJ_LEFT = 0,表明右边红外收发管检测到黑线,左边红外收发管检测到白色的物体(地面)。这时智能小车是左偏了,程序就控制智能小车右转进行调节。
while(1)
{
if((XJ_LEFT == 0)&&(XJ_RIGHT == 0))
{forward();}
else if((XJ_LEFT == 1)&&(XJ_RIGHT == 1))
{forward();}
else
{
if((XJ_LEFT == 1)&&(XJ_RIGHT == 0))
{
delay_ms(3);
if((XJ_LEFT == 1)&&(XJ_RIGHT == 0))
{left_turn();}
}
if((XJ_RIGHT == 1)&&(XJ_LEFT == 0))
{
delay_ms(3);
if((XJ_RIGHT == 1)&&(XJ_LEFT == 0))
{right_turn();}
}
}
}
智能小车红外循迹(黑线循迹)运动程序流程图如下:
3.2.3.4 智能小车红外避障运动
智能小车红外避障运动的原理如下。红外光线具有反射特性,红外发射管发出红外信号,经物体反射后被红外接收管接收。但距离不同的物体反射量是不一样的。对距离近的物体,红外光线的反射量就会多一点,红外接收管的电压输出就会高一点;而对距离远的物体,红外反射量减少,红外接收管的电压输出也低。红外接收管的输出电压信号输入到LM324与电位器的电压输出进行比较(这个电压的大小可以通过调节电位器来调整),并输出高或低的电平值。这样,我们只要将电位器调节到合适的范围,就可以规定一个特定的距离,在这个距离之内LM324输出0(低电平),对应发光二极管亮;在这个距离之外LM324输出1(高电平),对应发光二极管灭;单片机根据LM324输出的电平状态,就能实时判断智能小车前方或后方是否有障碍物。如果检测到智能小车前方或后方有障碍物,智能小车作出规避动作,就能实现智能小车的避障运动了。
智能小车红外避障代码如下:
首先,通过下面2条语句将红外避障信号与单片机的PA13和PA14管脚对应上。
#define BZ_LEFT PAin(13)
#define BZ_RIGHT PAin(14)
下面3个函数是分别控制智能小车前进、后退、左转、右转。
void forward(void) //智能小车前进
{IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0;}
void back(void) //智能小车后退
{IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1;}
void left_turn(void) //智能小车左转
{IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;}
void right_turn(void) //智能小车右转
{IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;}
void circle_right(void) //智能小车向右打转
{IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0;}
当BZ_LEFT = 1和BZ_RIGHT = 1,表明规定的范围内没有障碍物,智能小车继续前进。
当BZ_LEFT = 1和BZ_RIGHT =0,表明规定的范围内右边检测到障碍物,智能小车向左转进行规避。
当BZ_RIGHT = 1和BZ_LEFT = 0,表明规定的范围内左边检测到障碍物,智能小车向右转进行规避。
当 BZ_RIGHT = 0和BZ_LEFT = 0,表明规定的范围内左边和右边都检测到障碍物,智能小车先后退再向右转动一个角度。
while(1)
{
if((BZ_LEFT == 1)&&(BZ_RIGHT == 1))
{forward();}
if((BZ_LEFT == 1)&&(BZ_RIGHT == 0))
{
delay_ms(3);
if((BZ_LEFT == 1)&&(BZ_RIGHT == 0))
{left_turn();}
}
if((BZ_RIGHT == 1)&&(BZ_LEFT == 0))
{
delay_ms(3);
if((BZ_RIGHT == 1)&&(BZ_LEFT == 0))
{right_turn();}
}
if((BZ_RIGHT == 0)&&(BZ_LEFT == 0))
{
delay_ms(3);
if((BZ_RIGHT == 0)&&(BZ_LEFT == 0))
{
back();
delay_ms(1000);
circle_right();
delay_ms(500);
}
}
}
智能小车红外避障运动实验程序流程图如下:
3.2.3.5 智能小车跟随障碍物运动
智能小车跟随障碍物运动的原理如下。红外光线具有反射特性,红外发射管发出红外信号,经物体反射后被红外接收管接收。但距离不同的物体反射量是不一样的。对距离近的物体,红外光线的反射量就会多一点,红外接收管的电压输出就会高一点;而对距离远的物体,红外反射量减少,红外接收管的电压输出也低。红外接收管的输出电压信号输入到LM324与电位器的电压输出进行比较(这个电压的大小可以通过调节电位器来调整),并输出高或低的电平值。这样,我们只要将电位器调节到合适的范围,就可以规定一个特定的距离,在这个距离之内LM324输出0(低电平),对应发光二极管亮;在这个距离之外LM324输出1(高电平),对应发光二极管灭;单片机根据LM324输出的电平状态,就能实时判断智能小车前方或后方是否有障碍物。如果检测到智能小车前方某个方向检测到有障碍物,智能小车就转向那个方向;如果没有检测到障碍物,小车就直行。这样智能小车就能跟随障碍物前进了。
智能小车跟随障碍物代码如下:
首先,通过下面2条语句将跟随信号与单片机的PA13和PA14管脚对应上。
#define BZ_LEFT PAin(13) //左边避障信号
#define BZ_RIGHT PAin(14) //右边避障信号
下面3个函数是分别控制智能小车前进、停止、左转、右转。
void forward(void) //智能小车前进
{IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0;}
void left_turn(void) //智能小车左转
{IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;}
void right_turn(void) //智能小车右转
{IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;}
void stop(void) //智能小车停止
{IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0;}
当BZ_LEFT = 1和BZ_RIGHT = 1,表明规定的范围内智能小车两侧都没有障碍物,智能小车继续前进。
当BZ_LEFT = 0和BZ_RIGHT = 0,表明规定的范围内智能小车两侧都检测到障碍物,智能小车停止前进。
当 BZ_RIGHT = 1和BZ_LEFT = 0,表明规定的范围内左边检测到障碍物,智能小车向左转进行跟随。
当 BZ_LEFT = 1和BZ_RIGHT = 0,表明规定的范围内右边检测到障碍物,智能小车向右转进行跟随。
while(1)
{
if((BZ_LEFT == 1)&&(BZ_RIGHT == 1))
{forward();}
if((BZ_LEFT == 0)&&(BZ_RIGHT == 0))
{stop();}
if((BZ_LEFT == 1)&&(BZ_RIGHT == 0))
{
delay_ms(3);
if((BZ_LEFT == 1)&&(BZ_RIGHT == 0))
{right_turn();}
}
if((BZ_RIGHT == 1)&&(BZ_LEFT == 0))
{
delay_ms(3);
if((BZ_RIGHT == 1)&&(BZ_LEFT == 0))
{left_turn();}
}
}
智能小车跟随障碍物程序流程图如下:
3.2.3.6 智能小车超声波避障运动
超声波避障电路采用型号为HC-SR04的超声波测距模块。
超声波测距模块工作原理:
(1)单片机IO口给HC-SRO4的TRIG至少10us的高电平信号,触发HC-SRO4的测距功能。
(2)HC-SR04自动发送8个40khz的方波,自动检测是否有信号返回。
(3)有信号反回,HC-SR04的ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
下面我们看看程序源代码是如何实现智能小车超声波模块测距的。
先看下超声波模块测距的源代码部分:
超声波模块的Trig接开发板的PB1;超声波模块的Echo接开发板的PB0。
超声波模块测距的函数如下:
void Read_Distane(void)
{
PBout(1)=1;delay_us(15);PBout(1)=0;
if(TIM3CH3_CAPTURE_STA&0X80)
{
JuLi=TIM3CH3_CAPTURE_STA&0X3F;
JuLi*=65536;
JuLi+=TIM3CH3_CAPTURE_VAL;
JuLi=JuLi*170/1000;
TIM3CH3_CAPTURE_STA=0;
}
}
下面这个函数是将测得的距离值在OLED液晶屏中显示出来。
void Oled_Show(void)
{
OLED_ShowString(20,10,"ChaoSB-TEST");
OLED_ShowString(0,30,"Distance:");
OLED_ShowNumber(80,30,(u16)JuLi,4,12);
OLED_ShowString(110,30,"mm");
OLED_Refresh_Gram();
}
在智能小车超声波避障实验中,还需要用到舵机。舵机带动超声波模块左右摆动。
舵机内部的基准电路产生周期为20ms、宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定舵机内部电机的正反转。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。对应的控制关系是这样的:
0.5ms ------- 0度;
1.0ms ------- 45度;
1.5ms ------- 90度;
2.0ms ------- 135度;
2.5ms ------- 180度;
这样,我们通过控制该脉冲的高电平部分的长度(需在0.5ms~2.5ms范围内)就能控制舵机的舵机转动角度。
#define ControlPort PAout(0)
舵机控制信号连接到单片机的PA0管脚。
#define Stop 0 //舵机停标志
#define Right 1 //舵机右转标志
#define Left 2 //舵机左转标志
再定义几个与舵机控制相关的变量。
在main()函数中,首先是将定时器2设置成0.25ms中断一次了,我们再看下定时器2的中断处理函数。
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)
{
TimeOutCounter ++;
timer++;
switch(LeftOrRight)
{
case 0 : //为0时,舵机归位,脉宽1.5ms
{
if(TimeOutCounter<=6){ControlPort = 1;}
else{ControlPort = 0;}
}break;
case 1 : //为1时,舵机左转,脉宽1ms
{
if(TimeOutCounter<=4){ControlPort = 1;}
else{ControlPort = 0;}
}break;
case 2 : //为2时,舵机右转,脉宽2ms
{
if(TimeOutCounter<=8){ControlPort = 1;}
else{ControlPort = 0;}
}break;
default : break;
}
if(TimeOutCounter <= 30)
{EN1 = 1; EN2 = 1;}
else if(TimeOutCounter > 30)
{EN1 = 0; EN2 = 0;}
if(TimeOutCounter==80) //周期20ms
{TimeOutCounter = 0;}
}
TIM2->SR&=~(1<<0);
}
我们可以通过以下3条语句控制舵机转到左边,转到右边和回到中间。
LeftOrRight = Stop; //舵机停在中间
LeftOrRight = Left; //舵机左边
LeftOrRight = Right; //舵机右边
智能小车超声波避障运动的原理如下。利用智能小车上安装的超声波模块测量出障碍物离智能小车的距离,如果这个距离小于我们的规定值,智能小车向右转做出规避动作。
如果小车前进的过程中测量到小车前方25cm内有障碍物时,小车停止。然后舵机带动超声波模块左右扫描,分别测量小车左前方和右前方障碍物离小车的距离。如果左前方和右前方障碍物离小车的距离都小于20cm,小车后退比较长的一段距离;如果大于20cm小车后退比较短的一段距离。如果左边障碍物离小车的距离比较远,小车向左转;如果右边障碍物离小车的距离比较远,小车向右转。
void process(void) //超声波避障处理函数
{
u8 j;u8 p;
u32 S1_temp = 0;u32 S2_temp = 0;
LeftOrRight = Left; //舵机转到左边
TimeOutCounter = 0;
for(j=0;j<=9;j++)
{delay_ms(1000);}
Oled_Show();息
S1_temp = JuLi;
以上代码是将舵机带动超声波模块摆向左边,并利用超声波模块进行测距,将距离值保存在变量S1_temp中。
LeftOrRight = Right; //舵机转到右边
TimeOutCounter = 0;
for(j=0;j<=13;j++)
{delay_ms(1000);}
Oled_Show();
S2_temp = JuLi;
以上代码是将舵机带动超声波模块摆向右边,并利用超声波模块进行测距,将距离值保存在变量S2_temp中。
LeftOrRight = Stop; //舵机回到中间
TimeOutCounter = 0;
for(j=0;j<=9;j++)
{delay_ms(1000);}
以上代码是将舵机带动超声波模块回到中间位置。
if((S1_temp<=200)||(S2_temp<=200))
{
back(); //小车后退
for(p=0;p<=10;p++)
{delay_ms(1000);}
}
如果S1_temp和S2_temp的距离都小于200毫米,则智能小车先后退一段比较长的距离。
else
{
back(); //小车后退
for(p=0;p<=8;p++){delay_ms(1000);}
}
stop(); //小车停下
for(p=0;p<=2;p++){delay_ms(1000);}
否则,智能小车后退一段比较短的距离。
if(S1_temp>S2_temp)
{
circle_left(); //小车向左转
for(p=0;p<=2;p++){delay_ms(1000);}
}
如果S1_temp大于S2_temp,智能小车逆时针旋转一个角度。
else if(S1_temp<S2_temp)
{
circle_right(); //小车向右转
for(p=0;p<=2;p++){delay_ms(1000);}
}
}
如果S1_temp小于S2_temp,智能小车顺时针旋转一个角度。
如果超声波模块测得的障碍物在智能小车200毫米之外,智能小车是前进的。
智能小车超声波避障程序流程图如下:
3.2.3.7 智能小车红外遥控运动
在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。很多视频和音频设备都可以通过红外遥控方式进行遥控,比如电视机、空调等等,都用到了红外遥控技术。红外遥控技术应用十分广泛,且应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。
红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片和应用电路组成。通常为了使信号能更好地被传输发送端将基带二进制信号调制为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。红外遥控信号发射与接收示意图如下:
接收头输出的波形正好和遥控芯片输出的相反。
红外线遥控的特征:
- 8位地址码,8位命令码。
- 完整发射两次地址码和命令吗,以提高可靠性。
- 脉冲时间长短调制方式。
- 38KHz载波频率。
- 位时间1.12ms或2.25ms。
在智能小车的红外线遥控中,采用的是NEC协议。NEC协议如下:
上图所示为NEC协议的典型脉冲链。协议规定低位首先发送,如上图所示的情况,发送的地址码为“59”,命令码为“16”.每次发送的信息首先是用于调整红外接收器增益的9ms AGC(自动增益控制)高电平脉冲,接着是4.5ms的低电平,接下来便是地址码和命令码。地址码和命令码发送两次,第二次发送的是反码(如:11110000的反码为00001111),用于验证接收的信息的准确性。
下面我们分析下智能小车红外遥控的程序源代码:
#define RDATA PAin(1)
智能小车控制板上的红外接收管的信号管脚接到处理器的PA1管脚上,PA1作为外部中断管脚用。
u8 Remote_Process(void)
{
u8 t1,t2;
t1=Remote_Odr>>24; //得到地址码
t2=(Remote_Odr>>16)&0xff; //得到地址反码
Remote_Rdy=0; //清除标记
if(t1==(u8)~t2&&t1==REMOTE_ID) //检验遥控识别码(ID)及地址
{
t1=Remote_Odr>>8;
t2=Remote_Odr;
if(t1==(u8)~t2)return t1; //处理键值
}
return 0;
}
以上函数是获取红外遥控码值。
while(1)
{
if(Remote_Rdy) //如果接收到红外遥控信号
{
key = Remote_Process(); //读取遥控信号值
BEEP = 0; delay_ms(50); BEEP = 1;
switch(key)
{
case 0x68: //按下0
{;}break;
case 0x30: //按下1
{;}break;
case 0x18: //按下2
{forward();}break; //控制智能小车前进
case 0x7A: //按下3
{;}break;
case 0x10: //按下4
{left_turn();}break; //控制智能小车向左
case 0x38: //按下5
{stop();}break; //控制智能小车停止
case 0x5A: //按下6
{right_turn();}break; //控制智能小车向右
case 0x42: //按下7
{;}break;
case 0x4A: //按下8
{back();}break; //控制智能小车后退
case 0x52: //按下9
{;}break;
}
}
}
通过以上函数实现:按下遥控器的2键,智能小车前进;按下遥控器的4键,智能小车左转;按下遥控器的5键,智能小车停止;按下遥控器的6键,智能小车右转。按下遥控器的8键,智能小车后退。
智能小车红外遥控程序流程图如下:
3.2.3.8 智能小车测速运动
小车测速要用到专用的测速模块,如下:
测速时,将2个测速码盘套在电机轴上与电机轴一同转动。在测速电路板上有红外光耦,当红外光耦被挡住时测速电路板输出低电平,没有被挡住时输出高电平。而测速码盘上是有20个栅格的。这样当电机轴带动测速码盘转动时,测速码盘上的栅格就交替挡住和没有挡住红外光耦,这时测速电路板就输出脉冲信号。我们只要在一个 的时间段内测得脉冲数,就能推导出码盘转了多少圈。又因为码盘和小车轮子都是与电机轴联动的,从而也能推导出在固定的时间段内轮子转了多少圈。我们又能知道轮子的周长,就能推导出小车的速度了。
测速实验程序如下:
先将PA0和PA13定义为外部中断管脚:
#define INT0 PAin(13)
#define INT2 PAin(0)
测速模块的脉冲信号接到单片机的PA0和PA13管脚,PA0和PA13管脚是STM32F103C8T6单片机的2个中断管脚。每一个测速脉冲,对应的变量加1。
void EXTI0_IRQHandler(void)
{
delay_ms(1); //消抖
if(INT2==1)
{right_numb++;}
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
void EXTI15_10_IRQHandler(void)
{
delay_ms(1); //消抖
if(INT0==1)
{left_numb++;}
EXTI->PR=1<<13; //清除LINE13上的中断标志位
EXTI->PR=1<<15; //清除LINE15上的中断标志位
}
同时,定时器3每2ms中断一次,每中断一次timer++,当加到500时(即1S)将变量flag置1。
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001) //溢出中断
{
timer++;
if(timer == 500) {timer = 0;flag = 1;} //1S
pwmval_left = pwmval_left + 1;
pwmval_right = pwmval_right + 1;
left_moto();right_moto();
}
TIM3->SR&=~(1<<0); //清除中断标志位
}
每当flag = 1时(也就是每隔1秒),会执行一次process()函数。
while(1)
{if(flag == 1){process();flag = 0;}}
process()函数中将1秒内的测速脉冲值转换成智能小车速度,并在OLED液晶中显示出来。
void process(void)
{
left_speed = (left_numb/20)*20.5;
right_speed = (right_numb/20)*20.5;
left_numb = 0;
right_numb = 0;
OLED_ShowString(20,10,"SPEED-TEST");
OLED_ShowString(0,30,"left: cm/s");
OLED_ShowNumber(40,30,(u16)left_speed,4,12);
OLED_ShowString(0,50,"right: cm/s");
OLED_ShowNumber(40,50,(u16)right_speed,4,12);
OLED_Refresh_Gram(); //刷新
}
智能小车测速实验程序流程图如下:
3.2.3.9 智能小车红外遥控灭火运动
红外遥控灭火实验用到了灭火模块,如下:
我们看函数
while(1)
{
if(Remote_Rdy)
{
key = Remote_Process(); //读取接收到的红外遥控键值
BEEP = 0;delay_ms(50);BEEP = 1;
switch(key) //判断接收到的红外遥控键值
{
case 0x68: //按下0
{;}break;
case 0x30: //按下1
{;}break;
case 0x18: //按下2
{forward();}break; //智能小车前进
case 0x7A: //按下3
{;}break;
case 0x10: //按下4
{left_turn();}break; //智能小车左转
case 0x38: //按下5
{stop();}break; //智能小车停止
case 0x5A: //按下6
{right_turn();}break; //智能小车右转
case 0x42: //按下7
{Mh_Ctl = 0;}break; //启动灭火风扇
case 0x4A: //按下8
{back();}break; //智能小车后退
case 0x52: //按下9
{Mh_Ctl = 1;}break; //停止灭火风扇
}
}
}
以下代码实现按下红外遥控器上的“7”键启动灭火风扇。
case 0x42: //按下7
{Mh_Ctl = 0;}break; //启动灭火风扇
以下代码实现按下红外遥控器上的“9”键灭火风扇停转。
case 0x52: //按下9
{Mh_Ctl = 1;}break; //停止灭火风扇
智能小车红外遥控灭火实验程序流程图如下:
3.2.3.10 智能小车循迹灭火运动
智能小车循迹灭火实验,即当智能小车没有感应火源时智能小车做循迹运动,感应到火焰后智能小车停下并启动灭火风扇进行灭火,当火焰熄灭后关闭灭火风扇,智能小车重新进行循迹运动。
循迹灭火实验需要用到灭火模块和火焰探测器,如下:
智能小车循迹运动的代码在智能小车循迹运动的实验中有详细介绍,在这里只介绍与灭火有关的代码。
while(1)
{
if(Hy_Sig==1)
//如果没有感应到火源,智能小车进行循迹运动。
{
BEEP = 1; Mh_Ctl = 1;
if((XJ_LEFT == 0)&&(XJ_RIGHT == 0))
{forward();}
else if((XJ_LEFT == 1)&&(XJ_RIGHT == 1))
{forward();}
else
{
if((XJ_LEFT == 1)&&(XJ_RIGHT == 0)) //左边感应到黑线
{
delay_ms(3);
if((XJ_LEFT == 1)&&(XJ_RIGHT == 0))
{left_turn();} //左转
}
if((XJ_RIGHT == 1)&&(XJ_LEFT == 0)) //右边感应到黑线
{
delay_ms(3);
if((XJ_RIGHT == 1)&&(XJ_LEFT == 0))
{right_turn();} //右转
}
}
}
else //探测到火源
{
//如果感应到火源,智能小车进行灭火。
loop:stop(); //智能小车停止
Mh_Ctl = 0; //启动灭火风扇
BEEP = 0; //蜂鸣器响
for(i=0;i<30;i++)
{delay_ms(1000);}
if(Hy_Sig == 0) //火焰没有被吹灭
{
goto loop; //继续灭火
}
}
}
5 实验
在设计完成系统的电路后,将编写好的程序下载到单片机中。分别进行了智能小车全速前进实验、智能小车PWM调速前进实验、智能小车红外循迹实验、智能小车红外避障实验、智能小车跟随障碍物实验、智能小车超声波避障实验、智能小车红外遥控实验、智能小车测速实验、智能小车灭火实验。智能小车能实现这些功能,基本达到设计预定的目标。
6 结论
6.1 总结与展望
智能小车的设计主要是嵌入式方面的内容,用到的知识有STM32F103C8T6单片机知识,电路图绘制知识,C语言编程知识。通过本课题的设计过程很好地将这些知识联系统一起来,做到融会贯通。最重要的是在此次设计中,解决了很多平时理论学习很少遇到的实际问题。
随着科技的迅猛发展,智能化是大势所趋,而智能车作为智能机器人中一类必不可少的组成部分,最近几年发展更是迅速,各个国家更是投入大量资金。它广泛涉及人工智能、计算机视觉、自动控制、精密仪器、传感和信息等一系列学科的创新研究,其研究成果可广泛应用于工业、农业、医药、军事、航空、信息技术等实际领域。
标签:循迹,智能,小车,void,单片机,红外,毕业设计,left From: https://blog.csdn.net/m0_53305793/article/details/144633175