回答

收藏

《2024 DigiKey 汽车应用创意挑战赛》汽车智能辅助数据采集...

#竞赛 #竞赛 607 人阅读 | 0 人回复 | 2025-02-26

本帖最后由 yangjiaxu 于 2025-3-2 22:19 编辑

一、项目名称:汽车智能辅助数据采集探测系统
二、项目背景:现在人们对生活质量的需求越来越高,尤其是在衣食住行方面,汽车属于人们出行中必不可少的一种交通工具之一,随着汽车工业的快速发展,智能化和网联化成为主要趋势。自动驾驶、ADAS等技术的普及,使得车辆对环境和自身状态的感知需求大幅增加。智能辅助数据采集探测系统通过传感器和算法实时采集并处理数据,为驾驶决策提供支持。
三、功能简述:本次设计的基于单片机的汽车智能辅助数据采集探测系统采用单片机——传感器——执行器——通讯模组组合的硬件架构,后续单片机可以升级为单板机(如树莓派5,或者其他高性能处理器)这样可以支持更多的车机智能娱乐方面的需求。在传感器方面,采用常用且稳定的传感器模组,比如24G雷达模组实现前方障碍检测,六轴传感器实现对车辆的稳定性检测,使用环境传感器针对车部的内外环境进行检测,保证用户可以实时了解周围的环境情况。通过执行器实现空气气囊/车内外灯光的控制;利用cat1通讯模组实现对采集到的数据进行云端通信,后续会扩展成将车辆的状态,比如是否稳定停车,车门是否正常关闭,车辆最后停车的位置信息等进行数据推送。
四、硬件介绍:本次设计的主控器暂定采用为STM32F103,传感器模组中,环境传感器采用DS18B20温度传感器、MQ2烟雾传感器、环境光传感器;针对碰撞监测传感器采用24GHz毫米波雷达模块CEM5826-M11(CEM5826-M11利用电磁波多普勒效应对运动目标进行探测。通过发射天线发射出24GHz 电磁波信号,该电磁波信号遇到运动物体时会反射回带有频偏的24GHz 电磁波信号,此频偏即为多普勒频偏,反射回的信号被接收天线接收,通过对多普勒频偏及中频IQ 相位的采集计算分析可以较为灵敏地探测出附近的运动物体以及运动物体是靠近还是远离。当探测到有运动物体靠近时VO 输出高电平,无运动物体靠近时VO 输出低电平。)在速度传感器模组方面,采用BMI160六轴加速度+2合1陀螺仪功能,其陀螺仪可以支持实时监测车辆速度与是否有侧翻的危险情况发生。在执行器方面,采用继电器来实现控制一些需要开关量的设备,比如空气气囊,控制灯光等等。在与外界通讯方面,采用cat1方案,该方案可以很稳定的运行且成本可观。并且该cat1模块支持GNSS定位功能,保证可以获取车辆的最后位置信息并回传至后台。
五、方案设计:

1、硬件框图:
2、程序框图:
六、程序部分代码:
  1. 1、        关于BMI160传感器程序部分代码:
  2. Bsp_Spi_Init();
  3.         Bsp_Bmi160_Init();
  4.         App_Bmi160_Init();
  5. int8_t fifo_gyro_header_time_data(struct bmi160_dev *dev)
  6. {
  7.         int8_t rslt = 0;
  8.         //uint16_t index = 0;

  9.         struct bmi160_sensor_data accel_data[12]; // 300 bytes / ~7bytes per frame ~ 42 data frames        
  10.         uint8_t accel_frames_req = 12;
  11.         uint8_t accel_index;
  12.         
  13.         /* Declare instances of the sensor data structure to store the parsed FIFO data */
  14.         struct bmi160_sensor_data gyro_data[12]; // 300 bytes / ~7bytes per frame ~ 42 data frames        
  15.         uint8_t gyro_frames_req = 12;
  16.         uint8_t gyro_index;
  17.         
  18.         /* Read data from the sensor's FIFO and store it the FIFO buffer,"fifo_buff" */
  19.         printf("\n USER REQUESTED FIFO LENGTH : %d\n",dev->fifo->length);
  20.         rslt = bmi160_get_fifo_data(dev);

  21.         if (rslt == BMI160_OK) {
  22.                 printf("\n AVAILABLE FIFO LENGTH : %d\n",dev->fifo->length);
  23.                 /* Print the raw FIFO data */
  24.                 /*for (index = 0; index < dev->fifo->length; index++) {
  25.                         printf("\n FIFO DATA INDEX[%d] = 0x%02x", index,
  26.                                 dev->fifo->data[index]);
  27.                 }
  28.                 */
  29.                
  30.                 /* ##################################GYRO DATA######################################### */                        
  31.                 /* Parse the FIFO data to extract gyro data from the FIFO buffer */
  32.                 printf("\n REQUESTED GYRO DATA FRAMES : %d\n ",gyro_frames_req);
  33.                 rslt = bmi160_extract_gyro(gyro_data, &gyro_frames_req, dev);

  34.                 if (rslt == BMI160_OK) {
  35.                         printf("\n AVAILABLE GYRO DATA FRAMES : %d\n ",gyro_frames_req);
  36.                         
  37.                         /* Print the parsed gyro data from the FIFO buffer */
  38.                         for (gyro_index = 0; gyro_index < gyro_frames_req; gyro_index++) {
  39.                                 printf("\nFIFO GYRO FRAME[%d]",gyro_index);
  40.                                 printf("\nGYRO X: %.2f°/s\t Y: %.2f°/s\t Z: %.2f°/s"
  41.                                         ,GYRO_SWITCH_UNIT(gyro_data[gyro_index].x),GYRO_SWITCH_UNIT(gyro_data[gyro_index].y)
  42.                                         ,GYRO_SWITCH_UNIT(gyro_data[gyro_index].z));
  43.                         }
  44.                 } else {
  45.                         printf("\n Gyro data extraction failed");
  46.                 }


  47.                 /* ##################################ACCEL DATA######################################### */                        
  48.                 printf("\n REQUESTED ACCEL DATA FRAMES : %d\n ",accel_frames_req);
  49.                 rslt = bmi160_extract_accel(accel_data, &accel_frames_req, dev);        
  50.                 if (rslt == BMI160_OK) {
  51.                         printf("\n AVAILABLE ACCEL DATA FRAMES : %d\n ",accel_frames_req);
  52.                         
  53.                         /* Print the parsed accel data from the FIFO buffer */
  54.                         for (accel_index = 0; accel_index < accel_frames_req; accel_index++) {
  55.                                 printf("\nFIFO ACCEL FRAME[%d]",accel_index);
  56.                                 printf("\nACCEL X: %.2fg/s \t Y: %.2fg/s \t Z: %.2fg/s"
  57.                                         ,ACCEL_SWITCH_UNIT(accel_data[accel_index].x), ACCEL_SWITCH_UNIT(accel_data[accel_index].y)
  58.                                         ,ACCEL_SWITCH_UNIT(accel_data[accel_index].z));
  59.                         }
  60.                 } else {
  61.                         printf("\n Accel data extraction failed");
  62.                 }
  63.         } else {
  64.                 printf("\n Reading FIFO data failed");
  65.         }

  66.         return rslt;
  67. }

复制代码
  1. 2、雷达部分的程序代码:
  2.         if(Radar_Flag)
  3.         {
  4.             Radar_Flag = 0;
  5.             memcpy(Radar_buf, USART2_RX_BUF, 50);
  6.             memset(USART2_RX_BUF, 0, 50);

  7.             for(i = 0; i < 50; i++)
  8.             {
  9.                 if(memcmp(Radar_Distance, &Radar_buf[i], 4) == 0)
  10.                 {               
  11.                                                                                 for(j = 0; j < 5; j ++)
  12.                                                                                 {
  13.                                                                                         if(0x0d == Radar_buf[i + 4 + j])
  14.                                                                                         {
  15.                                                                                                 switch(j)
  16.                                                                                                 {
  17.                                                                                                         case 1:
  18.                                                                                                                 Radar = (Radar_buf[i + 4] - 0x30);
  19.                                                                                                                 break;
  20.                                                                                                         case 2:
  21.                                                                                                                 Radar = (Radar_buf[i + 4] - 0x30) * 10 + (Radar_buf[i + 5] - 0x30);
  22.                                                                                                                 break;                                                                                                        
  23.                                                                                                         case 3:
  24.                                                                                                                 Radar = (Radar_buf[i + 4] - 0x30) * 100 + (Radar_buf[i + 5] - 0x30) * 10 + (Radar_buf[i + 6] - 0x30);
  25.                                                                                                                 break;
  26.                                                                                                         case 4:
  27.                                                                                                                 Radar = (Radar_buf[i + 4] - 0x30) * 1000 + (Radar_buf[i + 5] - 0x30) * 100 + (Radar_buf[i + 6] - 0x30) * 10 + (Radar_buf[i + 7] - 0x30);
  28.                                                                                                                 break;
  29.                                                                                                         case 5:
  30.                                                                                                                 Radar = (Radar_buf[i + 4] - 0x30) * 10000 + (Radar_buf[i + 5] - 0x30) * 1000 + (Radar_buf[i + 6] - 0x30) * 100 + (Radar_buf[i + 8] - 0x30) * 10 + (Radar_buf[i + 9] - 0x30);
  31.                                                                                                                 break;                                                                                                        
  32.                                                                                                 }                                                                                       
  33.                                                                                         }
  34.                                                                                 }
  35.                     

  36.                     if (Radar > 1000)                //有人
  37.                     {
  38.                     }
  39.                     else        
  40.                     {
  41.                     }
  42.                 }
  43.             }
  44.         }
复制代码
七、成品照片:分别为整体运行状态,上位机接收数据效果与手动控制模式(手动控制继电器的功能)
系统整体结构

传给上位机的数据

手动控制模式(按键控制继电器)

手动模式下关闭继电器
《2024 DigiKey 汽车应用创意挑战赛》汽车智能辅助数据采集探测系统.zip.zip (2.26 MB, 下载次数: 1)


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条