Hi,大家好,学长今天向大家介绍一个 单片机项目
基于 STM32 的自动泊车系统
大家可用于 课程设计 或 毕业设计
目前我们所能见到的汽车企业大多数都控制在 L2 级半自动驾驶, 其中包括半自动泊车系统: 传感器技术的组成配合下收集精确的环境信息实现“泊车路径规划” 、 系统进行“车辆控制” 等功能, 在部分自动泊车(高级泊车辅助 APA)系统的辅助下驾驶员可以在监控下实现泊车动作。 现实中, 车辆激增带来的停车问题变得更加复杂, 大城市停车空间有限, 将汽车驶入各式各样的停车位置是每个驾驶员一项必备的技能。 与之相随而来的交通压力、 复杂多样的停车环境、 有限苛刻的停车空间, 停车难成为众多驾驶员的一大难题。 泊车过程中出现的轻微碰撞以及剐蹭事件的频繁发生, 市场需求的增长, 环境检测基础的相对成熟, 推进了自动泊车系统研究的技术发展。
自动泊车系统(Automated Parking System,简称 APS)是一项属于无人驾驶的重要技术,随着车辆的激增, 汽车自动驾驶技术的不断创新与发展, 自动泊车系统尚未普及, 为降低当下人工停车的难度, 设计了一种基于 STM32F103ZET6 实现自动倒车入库和侧方位停车的智能化小车系统。
该自动泊车系统利用红外光感 HJ-IR2 传感器、 超声波 HC-SR04 模块、 循迹 TCRT5000模块、 标准的 IEEE 802.11nd 的 WIFI 模块组成进行环境检测, 实现了障碍物识别, 并将采集到的数据传送到处理器, 处理器将数据转换为电信号驱动小车的控制 L298N 驱动模块, 这些模块在 Keil uVsion5 编译环境下整合到一起, 在路径规划下对小车进行速度控制和转向控制。
系统根据停车位识别在模拟停车环境下控制小车进行入库操作, 满足了在不同的停车环境下进行智能化自动泊车, 此系统属于嵌入式系统兼容于多数汽车实现侧方位泊车和倒车入库并自行细微调整, 实现更稳定的入库停车。
意法半导体公司中的 STM32 系列芯片
为了更真实模拟汽车运作状态, 本设计安装了四个电机, 如下图所示。 本设计通过 PWM 占空比来调节直流电机的转速, 并通过控制前后轮的不同速度完成小车的转向。
电机用到了主控板的 8 个 IO 口, 通过对电机的高低电平控制使之正反转, 电机分有正负极, 前进时: 先将正极的电平置 1, 负极复位 0; 后退则正极复位 0, 负极置 1; 停止则都复位 0。
电机与芯片管脚配置表
小车由于左右两边各用一个驱动, 所以 A 和 C 两个电机只需要 C 电机控制, B 和 D电机只需 B 控制, 这里将 D 电机控制脚当电机使能: 将 DUP 和 DDOWN 的电平置 1。
学长设计的系统采用红外遥控来实现对小车的初步控制, 红外线遥控是目前使用最广泛的一种通信和遥控手段, 具有体积小、 功耗低、 功能强、 成本低的优点。 通用红外遥控系统由发射和接收两大部分组成, 应用编/解码专用集成电路芯片来进行控制操作, 发射部分包括键盘、 编码调制、 LED、 红外发送器; 接收部分包括光、 电转换放大器、 解调、 解码电路。
红外遥控器
红外接收及解码
相关技术原理:
根据遥控器提供的键码, 优先满足小车的基本运动, 前进、 后退、 左转、 右转、 以及停止, 设计算法, 短按则为 200MS 运作, 长按则持续运行。 预留其他按钮进入自动驾驶状态, 即: 循迹模式、 避障模式、 超声波模式、 摄像头模式、 侧方位自动泊车, 倒车入库自动泊车等。
遵循既有的道路现状, 给定小车相关的循迹算法, 基于一个三路循迹和两个二路循迹的循迹模块, 使得小车自动行驶在路劲规划下, 称为循迹技术。
红外光电传感器(HJ-IR2), 发射出探测的脉冲, 当在一定距离中探测到物体会重新输入到 MCU 中进行处理, 它相当于一个红外开关, 检测到障碍物输出低电平, 未检测到则反之。 在得知在停车过程中遇到的障碍物可以依据此对小车进行控制避免碰撞, 此为避障功能。
接收管接收到信号之后, 经集成电路进行放大, 会点亮模块的 LED 灯管, 并同时输出给 MCU 一个低电平信号。
HC-SR04 超声波测距可提供 2cm-40cm 的非接触式距离感测功能测距精度可达高到3mm; 模块包括超声波发射器、 接收器与控制电路。 本设计利用超声波传感器来达到对自动泊车中精细调整。 小车在进入自动泊车模式后, 环境检测部分会通过超声波收集左右部掐障碍物的具体位置, 在侧方位泊车中可以利用检测前后车辆的停车距离,倒车入库泊车中可以检测左右车辆的精准距离, 实现更完美的泊车路径规划。 超声波模块如图
设计模拟倒车途中的后视摄像头, 将倒车时的情景展示在与上位机的屏幕当中,模拟出更真实的停车环境, 实时监控倒车时的情况, 并通过 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++;
}
摄像头则安装在车尾处, 可以观察倒车时后视的环境, 也适用于作为图像处理的后续功能推进, WIFI 模块在开发板的下方, 不影响信号的前提下也得到了合理的空间放置。
常见的泊车方式有: 侧方位泊车和倒车入库泊车, 本设计根据两种泊车方式设计了不同的算法。
侧方位停车位的设置主要是为了道路的宽度而设置, 机动车驾驶证考试中的科目二就有一项侧方位停车法。 本设计由科目二驾驶中的侧方停车为标准, 侧方位泊车如图所示。
根据停车的不同场景, 本设计通过收集的环境信息进行了不同的处理, 并作出不同的控制电信号。
如果未扫描到障碍物和相邻小车, 系统主要通过循迹模块对停车线反射的强度不同来定位停车位的具体位置。 具体算法逻辑如流程图所示:
算法步骤:
关键代码
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;
}
}
倒车入库是多数停车场中的停车建设, 停停车场都有较为规范的停车线规划和停车建设, 对于线条的感应也更容易, 倒车入库示意图如图所示
算法设计
算法流程:
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();
}
}
优先模拟的周围无障碍物的情形, 会通过判断停车线然后根据算法步骤将车停进去车位。 经过多次测试, 小车多次稳定的停入车位, 但若控制者将车驶在与停车位平行的位置, 会导致停车缓慢且容易出错, 车位可供停车的范围需对小车的位置有限制。 运行完侧方位泊车之后小车的位置如图