• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

汽车智能辅助数据采集探测系统

05/29 08:55
999
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

共1个文件

一、项目名称:

汽车智能辅助数据采集探测系统

二、项目背景:

现在人们对生活质量的需求越来越高,尤其是在衣食住行方面,汽车属于人们出行中必不可少的一种交通工具之一,随着汽车工业的快速发展,智能化和网联化成为主要趋势。自动驾驶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、        关于BMI160传感器程序部分代码:
Bsp_Spi_Init();
        Bsp_Bmi160_Init();
        App_Bmi160_Init();
int8_t fifo_gyro_header_time_data(struct bmi160_dev *dev)
{
        int8_t rslt = 0;
        //uint16_t index = 0;

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

        if (rslt == BMI160_OK) {
                printf("n AVAILABLE FIFO LENGTH : %dn",dev->fifo->length);
                /* Print the raw FIFO data */
                /*for (index = 0; index < dev->fifo->length; index++) {
                        printf("n FIFO DATA INDEX[%d] = 0x%02x", index,
                                dev->fifo->data[index]);
                }
                */
                
                /* ##################################GYRO DATA######################################### */                        
                /* Parse the FIFO data to extract gyro data from the FIFO buffer */
                printf("n REQUESTED GYRO DATA FRAMES : %dn ",gyro_frames_req);
                rslt = bmi160_extract_gyro(gyro_data, &gyro_frames_req, dev);

                if (rslt == BMI160_OK) {
                        printf("n AVAILABLE GYRO DATA FRAMES : %dn ",gyro_frames_req);
                        
                        /* Print the parsed gyro data from the FIFO buffer */
                        for (gyro_index = 0; gyro_index < gyro_frames_req; gyro_index++) {
                                printf("nFIFO GYRO FRAME[%d]",gyro_index);
                                printf("nGYRO X: %.2f°/st Y: %.2f°/st Z: %.2f°/s"
                                        ,GYRO_SWITCH_UNIT(gyro_data[gyro_index].x),GYRO_SWITCH_UNIT(gyro_data[gyro_index].y)
                                        ,GYRO_SWITCH_UNIT(gyro_data[gyro_index].z));
                        }
                } else {
                        printf("n Gyro data extraction failed");
                }


                /* ##################################ACCEL DATA######################################### */                        
                printf("n REQUESTED ACCEL DATA FRAMES : %dn ",accel_frames_req);
                rslt = bmi160_extract_accel(accel_data, &accel_frames_req, dev);        
                if (rslt == BMI160_OK) {
                        printf("n AVAILABLE ACCEL DATA FRAMES : %dn ",accel_frames_req);
                        
                        /* Print the parsed accel data from the FIFO buffer */
                        for (accel_index = 0; accel_index < accel_frames_req; accel_index++) {
                                printf("nFIFO ACCEL FRAME[%d]",accel_index);
                                printf("nACCEL X: %.2fg/s t Y: %.2fg/s t Z: %.2fg/s"
                                        ,ACCEL_SWITCH_UNIT(accel_data[accel_index].x), ACCEL_SWITCH_UNIT(accel_data[accel_index].y)
                                        ,ACCEL_SWITCH_UNIT(accel_data[accel_index].z));
                        }
                } else {
                        printf("n Accel data extraction failed");
                }
        } else {
                printf("n Reading FIFO data failed");
        }

        return rslt;
}

2、雷达部分的程序代码:
        if(Radar_Flag)
        {
            Radar_Flag = 0;
            memcpy(Radar_buf, USART2_RX_BUF, 50);
            memset(USART2_RX_BUF, 0, 50);

            for(i = 0; i < 50; i++)
            {
                if(memcmp(Radar_Distance, &Radar_buf[i], 4) == 0)
                {                
                                                                                for(j = 0; j < 5; j ++)
                                                                                {
                                                                                        if(0x0d == Radar_buf[i + 4 + j])
                                                                                        {
                                                                                                switch(j)
                                                                                                {
                                                                                                        case 1:
                                                                                                                Radar = (Radar_buf[i + 4] - 0x30);
                                                                                                                break;
                                                                                                        case 2:
                                                                                                                Radar = (Radar_buf[i + 4] - 0x30) * 10 + (Radar_buf[i + 5] - 0x30);
                                                                                                                break;                                                                                                        
                                                                                                        case 3:
                                                                                                                Radar = (Radar_buf[i + 4] - 0x30) * 100 + (Radar_buf[i + 5] - 0x30) * 10 + (Radar_buf[i + 6] - 0x30);
                                                                                                                break;
                                                                                                        case 4:
                                                                                                                Radar = (Radar_buf[i + 4] - 0x30) * 1000 + (Radar_buf[i + 5] - 0x30) * 100 + (Radar_buf[i + 6] - 0x30) * 10 + (Radar_buf[i + 7] - 0x30);
                                                                                                                break;
                                                                                                        case 5:
                                                                                                                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);
                                                                                                                break;                                                                                                        
                                                                                                }                                                                                        
                                                                                        }
                                                                                }
                    

                    if (Radar > 1000)                //有人
                    {
                    }
                    else        
                    {
                    }
                }
            }
        }

七、成品照片:

分别为整体运行状态,上位机接收数据效果与手动控制模式(手动控制继电器的功能)
系统整体结构
传给上位机的数据
手动控制模式(按键控制继电器)
手动模式下关闭继电器
参考附件
  • 《2024 DigiKey 汽车应用创意挑战赛》汽车智能辅助数据采集探测系统.zip.zip
    下载
DigiKey得捷

DigiKey得捷

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。收起

查看更多

相关推荐