jjzjj

【毕业设计】基于 STM32 的自动泊车系统 -智能小车 - 物联网单片机

Mdc_stdio 2023-10-03 原文

文章目录


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

基于 STM32 的自动泊车系统

大家可用于 课程设计 或 毕业设计


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


1 背景

目前我们所能见到的汽车企业大多数都控制在 L2 级半自动驾驶, 其中包括半自动泊车系统: 传感器技术的组成配合下收集精确的环境信息实现“泊车路径规划” 、 系统进行“车辆控制” 等功能, 在部分自动泊车(高级泊车辅助 APA)系统的辅助下驾驶员可以在监控下实现泊车动作。 现实中, 车辆激增带来的停车问题变得更加复杂, 大城市停车空间有限, 将汽车驶入各式各样的停车位置是每个驾驶员一项必备的技能。 与之相随而来的交通压力、 复杂多样的停车环境、 有限苛刻的停车空间, 停车难成为众多驾驶员的一大难题。 泊车过程中出现的轻微碰撞以及剐蹭事件的频繁发生, 市场需求的增长, 环境检测基础的相对成熟, 推进了自动泊车系统研究的技术发展。

2 设计概要

自动泊车系统(Automated Parking System,简称 APS)是一项属于无人驾驶的重要技术,随着车辆的激增, 汽车自动驾驶技术的不断创新与发展, 自动泊车系统尚未普及, 为降低当下人工停车的难度, 设计了一种基于 STM32F103ZET6 实现自动倒车入库和侧方位停车的智能化小车系统。

该自动泊车系统利用红外光感 HJ-IR2 传感器、 超声波 HC-SR04 模块、 循迹 TCRT5000模块、 标准的 IEEE 802.11nd 的 WIFI 模块组成进行环境检测, 实现了障碍物识别, 并将采集到的数据传送到处理器, 处理器将数据转换为电信号驱动小车的控制 L298N 驱动模块, 这些模块在 Keil uVsion5 编译环境下整合到一起, 在路径规划下对小车进行速度控制和转向控制。

系统根据停车位识别在模拟停车环境下控制小车进行入库操作, 满足了在不同的停车环境下进行智能化自动泊车, 此系统属于嵌入式系统兼容于多数汽车实现侧方位泊车和倒车入库并自行细微调整, 实现更稳定的入库停车。

3 硬件选型

3.1 主控 - STM32

意法半导体公司中的 STM32 系列芯片


3.2 电机驱动

为了更真实模拟汽车运作状态, 本设计安装了四个电机, 如下图所示。 本设计通过 PWM 占空比来调节直流电机的转速, 并通过控制前后轮的不同速度完成小车的转向。


电机用到了主控板的 8 个 IO 口, 通过对电机的高低电平控制使之正反转, 电机分有正负极, 前进时: 先将正极的电平置 1, 负极复位 0; 后退则正极复位 0, 负极置 1; 停止则都复位 0。

电机与芯片管脚配置表

小车由于左右两边各用一个驱动, 所以 A 和 C 两个电机只需要 C 电机控制, B 和 D电机只需 B 控制, 这里将 D 电机控制脚当电机使能: 将 DUP 和 DDOWN 的电平置 1。

3.3 红外遥控设计

学长设计的系统采用红外遥控来实现对小车的初步控制, 红外线遥控是目前使用最广泛的一种通信和遥控手段, 具有体积小、 功耗低、 功能强、 成本低的优点。 通用红外遥控系统由发射和接收两大部分组成, 应用编/解码专用集成电路芯片来进行控制操作, 发射部分包括键盘、 编码调制、 LED、 红外发送器; 接收部分包括光、 电转换放大器、 解调、 解码电路。

红外遥控器

红外接收及解码


相关技术原理:

    1. 引导码: MCU 检测到正确的引导码之后确认接收后面的数据, 以此来保证数据的稳定性和正确性,
    1. 客户码: 区分不同红外遥控设备
    1. 操作码: 客户操作时产生的编码, 通过操作的不同产生不同的码值, 等待红外接收头接收。
    1. 解码: 芯片通过接收到的电平信号, 解析操作码的码值, MCU 在根据码值做出相应动作。

根据遥控器提供的键码, 优先满足小车的基本运动, 前进、 后退、 左转、 右转、 以及停止, 设计算法, 短按则为 200MS 运作, 长按则持续运行。 预留其他按钮进入自动驾驶状态, 即: 循迹模式、 避障模式、 超声波模式、 摄像头模式、 侧方位自动泊车, 倒车入库自动泊车等。

3.4 传感器部分

3.4.1 循迹模块


遵循既有的道路现状, 给定小车相关的循迹算法, 基于一个三路循迹和两个二路循迹的循迹模块, 使得小车自动行驶在路劲规划下, 称为循迹技术。

3.4.2 红外避障模块


红外光电传感器(HJ-IR2), 发射出探测的脉冲, 当在一定距离中探测到物体会重新输入到 MCU 中进行处理, 它相当于一个红外开关, 检测到障碍物输出低电平, 未检测到则反之。 在得知在停车过程中遇到的障碍物可以依据此对小车进行控制避免碰撞, 此为避障功能。

接收管接收到信号之后, 经集成电路进行放大, 会点亮模块的 LED 灯管, 并同时输出给 MCU 一个低电平信号。

3.4.3 超声波模块

HC-SR04 超声波测距可提供 2cm-40cm 的非接触式距离感测功能测距精度可达高到3mm; 模块包括超声波发射器、 接收器与控制电路。 本设计利用超声波传感器来达到对自动泊车中精细调整。 小车在进入自动泊车模式后, 环境检测部分会通过超声波收集左右部掐障碍物的具体位置, 在侧方位泊车中可以利用检测前后车辆的停车距离,倒车入库泊车中可以检测左右车辆的精准距离, 实现更完美的泊车路径规划。 超声波模块如图

3.4.4 WIFI 视频模块

设计模拟倒车途中的后视摄像头, 将倒车时的情景展示在与上位机的屏幕当中,模拟出更真实的停车环境, 实时监控倒车时的情况, 并通过 WIFI 模块, 在上位机编写好指定代码传送给小车上的 WIFI 模块, WIFI 模块中的芯片进行解码并发送电信号给 MCU进行控制, MCU 根据 WIFI 模块中的信号对小车进行控制。

PC控制软件

软件中的界面基本满足对小车的基本控制, 附带有打开摄像头的指令, 在设置中也可以按照需求编写新指令发送给主控芯片。 操作界面如下图所示

这里的设计需要注意, 同时开启数据的收发, 根据收到的 WIFI 信号进行判断, 串口 WIFI 解码代码如下:

unsigned char rec_data;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
/* Read one byte from the receive data register */
rec_data = USART_ReceiveData(USART3);
if(start!=0&&rec_data!=0xff) //如果已收到包头并且当前收到的不是包尾
{
buf[start-1]=rec_data; //缓存数据
start++;
}
else if(start!=0&&rec_data==0xff)//如果收到包尾
{
mode[0]=buf[0]; //给状态存储数组赋值
mode[1]=buf[1];
mode[2]=buf[2];
start=0;
mode1=1; //指示主函数循环检测一次
}
else if(rec_data==0xff&&start==0) //如果收到的是包头
start++;
}

4 小车成品展示

摄像头则安装在车尾处, 可以观察倒车时后视的环境, 也适用于作为图像处理的后续功能推进, WIFI 模块在开发板的下方, 不影响信号的前提下也得到了合理的空间放置。

5 泊车算法设计

常见的泊车方式有: 侧方位泊车和倒车入库泊车, 本设计根据两种泊车方式设计了不同的算法。

5.1 侧方位泊车

侧方位停车位的设置主要是为了道路的宽度而设置, 机动车驾驶证考试中的科目二就有一项侧方位停车法。 本设计由科目二驾驶中的侧方停车为标准, 侧方位泊车如图所示。

根据停车的不同场景, 本设计通过收集的环境信息进行了不同的处理, 并作出不同的控制电信号。

如果未扫描到障碍物和相邻小车, 系统主要通过循迹模块对停车线反射的强度不同来定位停车位的具体位置。 具体算法逻辑如流程图所示:

算法步骤:

  • 1、 按下遥控器按钮平行泊车模式, 开始检测周围环境信息, 如果超声波反射回来的距离小于 10CM 则判断为障碍物, 大于 10CM 则判断为无障碍物。
  • 2、 减速后退直到超声波判断距离大于 10CM 且红外避障无感应。
  • 3、 红外避障有感应则继续后退, 重复(1)(2)步骤。
  • 4、 左循迹模块感应到停车线, 系统收集到此时车辆左转角度, 然后继续左转。
  • 5、 右循迹模块感应到停车线, 系统收集到此时车辆位置信息, 由于小车左转角度还不足, 系统此时再给予一个 200MS 的左转信号。
  • 6、 车辆左转角度已经足够, 停车时的车辆速度不能过快, 修改高电平的占比, 降低速度, 给出一个持续前进的电信号
  • 7、 中循迹模块感应到边缘停车线, 小车停止。
  • 8、 开始摆正车身, 根据左转的角度, 给出相同延时右转信号摆正车身
  • 9、 右转进行时, 对中循迹模块进行判定, 如果收集到电信号, 对小车进行后退调整,然后完成整个系统泊车操作。

关键代码

if(LL_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
auto_flag = 1;
}
CarRight();
}
else if (auto_flag == 1)
{
if(RR_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
CarRight();
delay_ms(6000);
CarStop();
delay_ms(18000);
auto_flag = 2;
}
CarRight();
}
else if(auto_flag == 2)
{
SPEED_DUTY = 10;
if(SEARCH_M_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
CarBack();
delay_ms(6000);
back_time = 0;
back_flag = 0;
auto_flag = 3;
}
CarGo();
}
else if(auto_flag == 3)
{
SPEED_DUTY = 30;
if(back_time <= 600)
{
CarLeft();
if(SEARCH_M_DATA == BLACK_AREA)
{
back_flag = 1;
}
if(back_time == 599)auto_flag = 4;
}
}
else if (auto_flag == 4)
{
if(back_flag == 0)sensor_flag = 0;
else if(back_flag == 1)
{
SPEED_DUTY = 20;
CarBack();
delay_ms(4000);
CarStop();
sensor_flag = 0;
}
}

5.2 倒车入库

倒车入库是多数停车场中的停车建设, 停停车场都有较为规范的停车线规划和停车建设, 对于线条的感应也更容易, 倒车入库示意图如图所示

算法设计

算法流程:

  • 1、 按下遥控器按钮垂直泊车模式, 开始检测周围环境信息, 如果超声波反射回来的距离小于 10CM 则判断为障碍物, 大于 10CM 则判断为无障碍物。
  • 2、 减速后退直到超声波判断距离大于 10CM, 且红外避障未感应到障碍物, 开始左转
  • 3、 左循迹模块感应到停车线, 系统收集到此时车辆左转角度, 然后继续左转
  • 4、 右循迹模块感应到停车线, 系统收集到此时车辆位置信息,
  • 5、 车辆左转角度已经足够,调整车身, 左转至车身垂直。
  • 6、 根据车身调整位置, 三路循迹在同一条直线上, 给出前进信号。
  • 7、 倒车入库完成。
void AUTO_Vertical(void)
{
if (auto_flag == 0 )
{
if(obstacle_flag == 0)
{
if(distance_cm < 15 )
{
SPEED_DUTY = 10;
CarGo();
return;
}
else if(distance_cm >= 15 )
{
CarStop();
obstacle_flag = 1;
}
}
if( obstacle_flag == 1)
{
SPEED_DUTY = 30;
CarRight();
if(LL_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
auto_flag = 1;
}
}
}
else if (auto_flag == 1)
{
if(SEARCH_L_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
auto_flag = 2;
}
CarRight();
}
else if(auto_flag == 2)
{
SPEED_DUTY = 10;
CarGo();
if(SEARCH_M_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
CarBack();
delay_ms(8000);
auto_flag = 3;
back_time = 0;
}
}
else if(auto_flag == 3)
{
SPEED_DUTY = 30;
if(back_time >= 12)auto_flag = 4;
if(back_time <= 14)
{
CarRight();
}
}
else if(auto_flag == 4)
{
if(SEARCH_M_DATA == BLACK_AREA)
{
CarStop();
delay_ms(18000);
CarBack();
delay_ms(6000);
sensor_flag = 0;
}
SPEED_DUTY = 10;
CarGo();
}
}

6 测试效果

优先模拟的周围无障碍物的情形, 会通过判断停车线然后根据算法步骤将车停进去车位。 经过多次测试, 小车多次稳定的停入车位, 但若控制者将车驶在与停车位平行的位置, 会导致停车缓慢且容易出错, 车位可供停车的范围需对小车的位置有限制。 运行完侧方位泊车之后小车的位置如图




单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


7 最后

有关【毕业设计】基于 STM32 的自动泊车系统 -智能小车 - 物联网单片机的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  5. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  9. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐