【E803】红外遥控黑线循迹自动泊车(STM32智能车)

2021-09-05 13:48:04      索炜达电子      1207     

项目编号:E803

文件大小:343K

源码说明:带中文注释

开发环境:C编译器

简要概述:

整体方案结构

1.1  总体设计方案及其论证

本设计要实现的功能是:实现红外遥控器对智能车进行行驶控制,并能使用遥控器切换各种行驶状态。第二个功能是实现智能车的自动倒车入库功能,智能车自动检测车库墙壁,并且通过内部算法,实现智能车的车速自动切换,完成自动泊车。第三个功能是实现智能车红外循迹功能,能够沿地面黑线自动行驶。

1、红外遥控:实现智能车的遥控功能,用于模拟汽车驾驶。

2、自动泊车:利用七路红外避障模块,并结合调试成功的倒车算法,进行自动泊车。

3、红外循迹:使用两路红外光对管传感器,检测地面黑线并实现自动行驶。

4、显    示:TFT LCD用于模拟仪表盘,显示当前驾驶模式、行驶速度等数据。


系统硬件设计

【E803】红外遥控黑线循迹自动泊车(STM32智能车)

【E803】红外遥控黑线循迹自动泊车(STM32智能车)


2.1  器件选定


各类汽车逐渐在现代家庭普及,停车场的车位设计要求越来越严苛,日益拥挤的泊车环境和窄小车位,要求人们泊车时对汽车的操纵必须更加娴熟。因此,市场对于自动泊车等汽车智能化功能的要求也日益增加。目前自动泊车系统的设计大多是基于DSP、FPGA等的控制处理平台,系统设计复杂,价格昂贵。由于STM32较于DSP、FPGA系统设计简单,价格低廉,故而本文以无人驾驶智能汽车自动泊车系统为应用背景,以红外线技术为依托,完成基于STM32F103控制平台的智能车研究与应用。


将单片机用作测控系统时,总要有被测信号输入通道,由计算机拾取必要的输入信息。对于测量系统而言,其核心任务是怎么样获得准确的被测信号;而对测控系统来说,不可缺少的环节是对条件的监测和对被控对象状态的测试,传感器是实现测量与控制的第一环节,是测控系统的关键部分,一切准确的测量和控制都将在传感器对原始信号的准确可靠的转换和捕捉,工业生产过程的自动化测量和控制,基本主要依赖各种传感器来控制和检测生产过程中的各种量,使系统和设备在最佳状态正常运行,从而保证生产的高质量和高效率。


2.2 主控系统电路和各硬件模块


2.1.1  STM32F103ZET6开发平台


本研究采ARM cortex-M3内核的32位处理器STM32F 103ZET6作为主控制器,LQFP-144封装,该芯片内部采用哈佛结构、其中集成有64KB的RAM和512KB的FLASH,运算速度快,并且具有体积小和低功耗的特点,在工业控制方面具有较高的应用前景。


STM32F103ZET6芯片介绍:


1、基于ARM Cortex-M3核心的32位微控制器,LQFP-144封装;


2、512K片内FLASH(相当于硬盘),64K片内RAM,片内FLASH支持在线编程;


3、高达72M的频率,数据、指令分别走不同的流水线,以确保CPU运行速度达到最大;


4、通过片内BOOT区,可实现串口下载程序(ISP);


5、片内双RC晶振,提供8M和32K的频率;


6、支持片外高速晶振(8M),和片外低速晶振(32K)。其中片外低速晶振可用于CPU的实时时钟,带后备电源引脚,用于掉电后的时钟行走;


7、42个16位的后备寄存器,利用外置的纽扣电池,和实现掉电数据保存功能;


8、支持JTAG,SWD调试.配合廉价的J-LINK,实现高速低成本的开发调试方案;


9、多达80个IO(大部分兼容5V逻辑),4个通用定时器,2个高级定时器,2个基本定时器,3路SPI接口,2路I2S接口,2路I2C接口,5路USART,一个USB从设备接口,一个CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash接口的16位总线-FSMC;


10、3路共16通道的12位AD输入,2路共2通道的12位DA输出。


11、CPU操作电压范围:2.0-3.6V;支持片外独立电压基准。


2.1.2  L298N电机驱动模块


驱动模块使用L298N作为主驱动芯片,具有驱动能力强,发热量低,抗干扰能力强的特点。模块可以使用内置的78M05通过驱动电源部分取电工作,但是为了避免稳压芯片损坏,当使用大于12V驱动电压的时候,需使用外置的5V逻辑供电。使用大容量滤波电容,续流保护二极管,可以提高可靠性。


L298N是一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电


压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载,采用标准逻辑电平信号控制,具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端。使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。


2.1.3  TFT LCD显示器


本文所研究的智能车采用以ILI9341为驱动器的TFT LCD作为显示器,用于模拟汽车的驾驶仪表盘,显示驾驶模式和车速等信息。


ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有262,144色的240RGB X 320 像素显示解决方案。它的组成包括一个720通道的源极驱动器,一个320通道的栅极驱动器,172800字节用于图形显示的GRAM,以及供电电路。


ILI9341支持8/9/16/18位数据总线的MCU接口,6/16/18位数据总线的RGB接口,以及3/4线的SPI接口。移动图像区域可以通过窗口地址功能在内部GRAM来指定。指定的窗口区域可以选择性地更新,因此,可以在图像区域同时独立地显示移动图像。


ILI9341可以使用1.65-3.3V的I/0接口电压和一个对应的电压跟随电路来产生驱动LCD的电压。ILI9341有精确的电压控制,来支持全色,8色显示模式和睡眠模式,这使得ILI9341成为一个理想的中小型手提产品的LCD驱动器,比如数字电话,智能手机,MP3和PMP。


2.1.4  红外无线遥控套件


红外无线遥控套件由Mini红外遥控器和38KHz红外接收模块组成,Mini红外遥控器具有17个功能键,发射距离远可达8米,适合在室内操控多种设备。红外接收模块可接收标准38KHz调制的遥控器信号,通过对进行编程,即可实现对遥控器信号的、解码操作,从而可制作多种遥控机器人以及互动作品。


红外线简介:人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。红外线遥控是利用波长为0.76~1.5μm之间的近红外线来传送控制信号。


通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36kHz、40kHz、56kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。二进制脉冲码的形式有多种,其中最为常用的是NEC Protocol的PWM码(脉冲宽度调制)和Philips RC-5 Protocol的PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。若需要开发红外接收设备,一定要了解红外遥控器的编码方式和载波频率,才能选取一体化红外接收头和制定解码方案。


NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲 + 560us低电平)。而红外接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低 + 1680us高,逻辑0应该是560us低 + 560us高。所以可以通过计算高电平时间判断接收到的数据是0还是1。

NEC遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。引导码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下图

NEC码还规定了连发码(由 9ms 低电平 +2.5ms 高电平 +0.56ms 低电平 +97.94ms 高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发射连发码,可以通过统计连发码的次数来标记按键按下的长短或次数。


2.1.5  红外避障与循迹模块


本设计采用了七路红外避障模块和两路TCRT5000红外反射传感器。七路红外避障模块主要用作自动泊车功能的探测传感器,两路TCRT5000红外反射传感器则是应用于黑线循迹功能。


红外避障传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距离范围2~30cm,工作电压为3.3V-5V。该传感器的探测距离可以通过电位器调整、具有干扰小、便于装配、使用方便等特点,可以广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等众多场合。


模块参数说明:


1、当模块检测到前方障碍物信号时,电路板上绿色指示灯点亮电平,同时OUT端口持续输出低电平信号,该模块检测距离2~30cm,检测角度35°,检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。


2、传感器主动红外线反射探测,因此目标的反射率和形状是探测距离的关键。其中黑色探测距离最小,白色最大;小面积物体距离小,大面积距离大。


3、传感器模块输出端口OUT可直接与单片机IO口连接即可,也可以直接驱动一个5V继电器;连接方式:VCC-VCC;GND-GND;OUT-IO;


4、比较器采用LM393,工作稳定;


5、可采用3-5V直流电源对模块进行供电。当电源接通时,红色电源指示灯点亮;


6、具有3mm的螺丝孔,便于固定和安装;

    7、电路板尺寸:3.2cm*1.4cm。


智能车使用12V 18650锂电池组作为电源,为MCU及各个模块进行供电。采用LM2596S DC-DC可调降压稳压电源模块和AMS1117-3.3V 降压稳压模块对驱动电路及控制电路进行降压稳压保护。在实验过程中,多次使用万用表对各个模块的电压进行测量,以防烧毁元器件。


3 系统软件设计


3.1  软件设计思路


在软件设计部分,本设计主要分成了五大部分,其中包括LED控制程序、TFT LCD驱动程序、按键驱动程序、电机控制程序、红外遥控程序。在电机控制程序部分,包括了PWM配置函数、红外传感器输入信号配置函数、TIM3初始化程序、自动泊车程序、黑线循迹程序、测速程序,并且编写了13种不同占空比的小车前进、后退、转向函数。在红外遥控程序部分,先用红外解码获得遥控器键值的编码数据,再对所需要的键值进行定义,从而实现固定按键控制相应的功能。TFT LCD显示的数据依次为:设计名称、车速、遥控器键值、按键连续按下次数、智能车行驶状态。


3.2  系统调试


若要实现本设计中的自动泊车及黑线循迹两大功能,除了传感器的选用及调试外,更为重要的是如何在不同的路况下改变智能车的行驶速度。本设计使用PWM输出实现对电机转动速度的控制。PWM是Pulse Width Modulation的缩写,中文意思是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此学习PWM具有十分重要的现实意义。也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电为完全有(ON),或完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上。通(ON)的时候即是直流供电被加到负载上的时候,断(OFF)的时候即是供电被断开的时候。若带宽足够,任何模拟值都可以使用 PWM 进行编码。


为了实现智能车正常倒入车库和自动循迹的功能,笔者在制作小车时进行了多次试验,详细记录各类情况,淘汰掉不合适的数据,最终获得较为稳定的车速变化数据,并对自动泊车的算法进行了多次优化,观察到了较为理想的实验现象。


    黑线循迹功能采用反射式光电开关来识别轨迹上的黑线标记信号,这种光电开关的红外发射管和接收管位于同一侧,光敏三极管只能接收反射回的红外光。当车身下面是黑线时,由于黑线吸收部分光,光敏三极管接收到的红外光不能使光敏三极管导通,光电开关输出高电平,经非门输出低电平。反之,当车身下面是白色的地面时,红外发射管发射的光经其反射后,被接收管接受,光电开关输出低电平,经非门整形后输出高电平。将非门的输出接至单片机IO口。车在前进和后退过程中,小车每过一道黑线,便产生一次电平变化,主程序从而调用相应的子程序,随着小车的不断行驶,相应的程序依次被调用执行,使小车在跑道上按设计要求时快、时慢、时前进、时转向。

【E803】红外遥控黑线循迹自动泊车(STM32智能车)

目录│文件列表:

 └ 红外遥控循迹自动泊车智能车程序

    │ keilkilll.bat

    │ README.TXT

    │ REMOTE.lnk

    ├ CORE

    │  │ core_cm3.c

    │  │ core_cm3.h

    │  └ startup_stm32f10x_hd.s

    ├ HARDWARE

    │  │ motor_control.c

    │  │ motor_control.h

    │  ├ 24CXX

    │  │  │ 24cxx.c

    │  │  └ 24cxx.h

    │  ├ BEEP

    │  │  │ beep.c

    │  │  └ beep.h

    │  ├ KEY

    │  │  │ key.c

    │  │  └ key.h

    │  ├ LCD

    │  │  │ font.h

    │  │  │ lcd.c

    │  │  └ lcd.h

    │  ├ LED

    │  │  │ led.c

    │  │  └ led.h

    │  └ REMOTE

    │     │ remote.c

    │     └ remote.h

    ├ OBJ

    │  └ REMOTE.hex

    ├ STM32F10x_FWLib

    │  ├ inc

    │  │  │ misc.h

    │  │  │ stm32f10x_adc.h

    │  │  │ stm32f10x_bkp.h

    │  │  │ stm32f10x_can.h

    │  │  │ stm32f10x_cec.h

    │  │  │ stm32f10x_crc.h

    │  │  │ stm32f10x_dac.h

    │  │  │ stm32f10x_dbgmcu.h

    │  │  │ stm32f10x_dma.h

    │  │  │ stm32f10x_exti.h

    │  │  │ stm32f10x_flash.h

    │  │  │ stm32f10x_fsmc.h

    │  │  │ stm32f10x_gpio.h

    │  │  │ stm32f10x_i2c.h

    │  │  │ stm32f10x_iwdg.h

    │  │  │ stm32f10x_pwr.h

    │  │  │ stm32f10x_rcc.h

    │  │  │ stm32f10x_rtc.h

    │  │  │ stm32f10x_sdio.h

    │  │  │ stm32f10x_spi.h

    │  │  │ stm32f10x_tim.h

    │  │  │ stm32f10x_usart.h

    │  │  └ stm32f10x_wwdg.h

    │  └ src

    │     │ misc.c

    │     │ stm32f10x_adc.c

    │     │ stm32f10x_bkp.c

    │     │ stm32f10x_can.c

    │     │ stm32f10x_cec.c

    │     │ stm32f10x_crc.c

    │     │ stm32f10x_dac.c

    │     │ stm32f10x_dbgmcu.c

    │     │ stm32f10x_dma.c

    │     │ stm32f10x_exti.c

    │     │ stm32f10x_flash.c

    │     │ stm32f10x_fsmc.c

    │     │ stm32f10x_gpio.c

    │     │ stm32f10x_i2c.c

    │     │ stm32f10x_iwdg.c

    │     │ stm32f10x_pwr.c

    │     │ stm32f10x_rcc.c

    │     │ stm32f10x_rtc.c

    │     │ stm32f10x_sdio.c

    │     │ stm32f10x_spi.c

    │     │ stm32f10x_tim.c

    │     │ stm32f10x_usart.c

    │     └ stm32f10x_wwdg.c

    ├ SYSTEM

    │  ├ delay

    │  │  │ delay.c

    │  │  └ delay.h

    │  ├ sys

    │  │  │ sys.c

    │  │  └ sys.h

    │  └ usart

    │     │ usart.c

    │     └ usart.h

    └ USER

       │ JLinkSettings.ini

       │ main.c

       │ REMOTE.uvguix.Administrator

       │ REMOTE.uvguix.VULCAN

       │ REMOTE.uvoptx

       │ REMOTE.uvprojx

       │ stm32f10x.h

       │ stm32f10x_conf.h

       │ stm32f10x_it.c

       │ stm32f10x_it.h

       │ system_stm32f10x.c

       └ system_stm32f10x.h

TAG自动泊车
  • 16 次
  • 1 分