• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

RISC-V MCU--嵌入式AI的智能防疫机器人

武飞扬头像
water.rv
帮助1

一、设计概念

1、主要技术特点

基于嵌入式AI的智能防疫机器人以CH32V307为主控负责各个模块的通信控制,人员测温方面采用的是GY614红外测温模块,主控通过IIC通信协议控制红外测温模块实现人员测温功能,配置模块相关寄存器数据,控制数据帧,起始寄存器07即从发射率寄存器开始,寄存器数量7即07 08 09 0A 0B 0C 0D这7个寄存器的数据依次输出。团队成员自己设计体温优化算法,将测得体温大量计算处理,计算出最优温度。破坏报警方面,实现原理首先是采集IMU六轴数据,三轴分量计算去算他的总加速度与总角速度,然后再根据总加速度去判断是否触发报警。受到破坏,屏幕会出现报警动画。同时本项目测温过程中视觉模块会对人员进行人脸拍照,实现人脸与体温一个一个地对应。本项目使用物联网模块,进行蜂窝网络组网或者连接云端,通过MQTT协议(消息队列遥测传输)以数据包形式实时上传机器人测得的人体体温、人脸信息以及破坏报警信息至局域网终端或者IOT物联网平台,云端实时记录上传的数据信息绘制测温曲线,并且可通过上位机进行异常报警。本项目移植了lvglv8系统,应用强大的构建块,例如按钮、图表、列表、滑块、图像等,并且带有动画、抗锯齿、不透明度、平滑滚动的高级图形。

2、关键性能指标

本项目测温过程中,每个数据帧能测的十个体温数据,并且会根据发射率、环境温度、目标温度计算值,共同得出人体真实温度。体温准确率达到90%以上。同时通过MQTT协议,以十秒的频率依次上传数据。视觉模块测得人脸图像帧率平均情况是30帧。

二、系统组成及功能说明

1、整体介绍

本项目由CH32V307单片机作为主控核心,物联网模块、视觉模块、语音播报模块通过串口与主控芯片通信,地磁陀螺仪与红外测温模块通过IIC通信协议由主控控制。物联网模块连接局域网通过MQTT协议将数据上传云端,然后工作人员可以在云端数据下发。LVGL嵌入式图形系统进行图形界面设置起到防疫宣传的作用。本项目采用了多种通信方式,旨在充分利用CH32V307单片机的各种资源,达到降低成本的目的。本项目所有的功能都旨在实现智能化、无人化、高效的防疫,减轻人力资源。

系统结构图
学新通

2、测温模块

红外测温模块采用非接触式检测测温物体表面红外能量进行测温,分辨率可达±0.02℃,最大检测距离约1米,采用IIC协议进行通信,低功耗、低成本。

测温计算中的重要公式

学新通

3、口罩佩戴检测功能的设计

采用嵌入式设备与深度学习技术检测摄像头视频流的方式实现其口罩佩戴检测功能,使用Keras深度学习框架复现更适合嵌入式移动设备的轻量化目标检测网络YoloV4-tiny,以实现实时高准确率地识别出未佩戴口罩的人脸,通过树莓派的WiFi模块即可将人脸图像传至云端。

4.数据可视化与云端报警功能的设计

使用物联网模块,进行蜂窝网络组网或者连接云端,通过MQTT协议(消息队列遥测传输)以数据包形式实时上传机器人测得的人体体温以及人员身份卡卡号至局域网终端或者IOT物联网平台,通过云端后台或上位机实现数据可视化,云端实时记录上传的数据信息绘制测温曲线,并且可通过上位机进行异常报警。

三、代码展示

1、测温系统

void USART1_IRQHandler(void)
{
    static uint8_t i=0,rebuf[30]= {0};
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断接收标志
    {
        rebuf[i  ]=USART_ReceiveData(USART1);//读取串口数据,同时清接收标志
        if (rebuf[0]!=add)//帧头不对
            i=0;
        else if ((i==2)&&(rebuf[1]!=0x03))//帧头不对
            i=0;
        else if ((i==3)&&(rebuf[2]>16))//帧头不对
            i=0;
        else if ((i==4)&&(rebuf[3]>16))//帧头不对
            i=0;
        if(i>3)//i等于4时,已经接收到数据量字节rebuf[3]
        {
            if(i<21)
            {
                if(i==(rebuf[3] 5))//判断是否接收一帧数据完毕
                {

                    if(!Receive_ok)//当数据处理完成后才接收新的数据
                    {
                        memcpy(usart_rx_data,rebuf,i);//拷贝接收到的数据
                        Receive_ok=1;//接收完成标志
                    }
                    i=0;//缓存清0

                }
            }
                        else
                        i=0;
        }
    }

}
学新通
void temp()
{
if(Receive_ok)//串口接收完毕
 {   
for(sum=0,i=0;i<(usart_rx_data[3] 4);i  )//rgb_data[3]=3
sum =usart_rx_data[i];
if(sum==usart_rx_data[i])//校验和判断
 {
my_ir.to=(usart_rx_data[5]<<8)|usart_rx_data[6];
my_ir.ta=(usart_rx_data[7]<<8)|usart_rx_data[8];
my_ir.bo=(usart_rx_data[9]<<8)|usart_rx_data[10];
my_ir.e=usart_rx_data[4]; /*串口通信,将数据传输到上位机实时显示*/
printf("E: %.2f,",(float)my_ir.e/100);         //发射率
printf("  to: %.2f,",(float)my_ir.to/100);     //目标温度
printf("  ta: %.2f,",(float)my_ir.ta/100);     //环境温度
printf(" bo %.2f\r\n ",(float)my_ir.bo/100);   //额头温度转换成体温
}
学新通

2、Lvgl设计

void lv_example_meter_2(void)
{
    lv_obj_t* obj=lv_obj_create(lv_scr_act());
    static lv_style_t style_obj;
    lv_style_init(&style_obj);
    lv_style_set_bg_color(&style_obj, lv_palette_main(LV_PALETTE_PINK));
    //lv_style_set_bg_opa(&style_obj, 80);
    lv_obj_add_style(obj, &style_obj, 0);
    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 20);
    lv_obj_set_size(obj, 200,200);

    //进度条
    static lv_style_t style_indic;
    lv_style_init(&style_indic);
    lv_style_set_bg_opa(&style_indic, LV_OPA_COVER);
    lv_style_set_bg_color(&style_indic, lv_palette_main(LV_PALETTE_RED));
    lv_style_set_bg_grad_color(&style_indic, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_bg_grad_dir(&style_indic, LV_GRAD_DIR_VER);
    lv_obj_t * bar = lv_bar_create(obj);
    lv_obj_add_style(bar, &style_indic, LV_PART_INDICATOR);
    lv_obj_set_size(bar, 50, 100);
    //lv_obj_center(bar);
    lv_bar_set_range(bar, -20, 40);
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_exec_cb(&a, set_temp);
    lv_anim_set_time(&a, 3000);
    lv_anim_set_playback_time(&a, 3000);
    lv_anim_set_var(&a, bar);
    lv_anim_set_values(&a, -20, 40);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
    lv_anim_start(&a);
    lv_obj_align(bar, LV_ALIGN_OUT_LEFT_BOTTOM, 15, 70);

    //圆弧
    lv_obj_t * arc = lv_arc_create(obj);
    lv_arc_set_rotation(arc, 270);
    lv_arc_set_bg_angles(arc, 0, 360);
    lv_obj_remove_style(arc, NULL, LV_PART_KNOB);
    lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_set_size(arc, 85, 85);
    //lv_obj_center(arc);
    lv_anim_t b;
    lv_anim_init(&b);
    lv_anim_set_var(&b, arc);
    lv_anim_set_exec_cb(&b, set_angle);
    lv_anim_set_time(&b, 7000);
    lv_anim_set_repeat_count(&b, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_repeat_delay(&b, 500);
    lv_anim_set_values(&b, 0, 100);
    lv_anim_start(&b);
    lv_obj_align(arc, LV_ALIGN_CENTER, 40, 40);

    //音量图标
    lv_obj_t* label2=lv_label_create(bar);
    lv_label_set_text(label2, LV_SYMBOL_VOLUME_MAX);
    lv_obj_set_style_text_font(label2, &lv_font_montserrat_14, 0);
    lv_obj_set_style_text_color(label2, lv_color_hex(0x1e1e1e), 0);
    lv_obj_align(label2,LV_ALIGN_BOTTOM_MID,0,-20);

    //音乐图标
    lv_obj_t* label3=lv_label_create(arc);
    lv_label_set_text(label3, LV_SYMBOL_AUDIO);
    lv_obj_set_style_text_font(label3, &lv_font_montserrat_14, 0);
    lv_obj_set_style_text_color(label3, lv_color_hex(0x1e1e1e), 0);
    lv_obj_align(label3,LV_ALIGN_CENTER,0,0);

    //WIFI图标的父对象
    lv_obj_t* obj1=lv_obj_create(obj);
    static lv_style_t style_obj1;
    lv_style_init(&style_obj1);
    lv_style_set_bg_color(&style_obj1, lv_palette_main(LV_PALETTE_GREY));
    lv_style_set_border_color(&style_obj1, lv_palette_main(LV_PALETTE_GREY));
    lv_obj_add_style(obj1, &style_obj1, 0);
    //lv_obj_align(obj1, LV_ALIGN_CENTER, 0, -20);
    lv_style_set_radius(&style_obj1,360);
    lv_obj_set_size(obj1, 60,60);
    lv_obj_align(obj1,LV_ALIGN_TOP_LEFT,10,0);

    //音乐图标的父对象
    lv_obj_t* obj2=lv_obj_create(obj);
    static lv_style_t style_obj2;
    lv_style_init(&style_obj2);
    lv_style_set_bg_color(&style_obj2, lv_palette_main(LV_PALETTE_GREEN));
    lv_style_set_border_color(&style_obj2, lv_palette_main(LV_PALETTE_GREEN));
    lv_obj_add_style(obj2, &style_obj2, 0);
    lv_style_set_radius(&style_obj2,360);
    lv_obj_set_size(obj2, 60,60);
    lv_obj_align(obj2,LV_ALIGN_TOP_LEFT,90,0);


    //WIFI图标
    lv_obj_t* label4=lv_label_create(obj1);
    lv_label_set_text(label4, LV_SYMBOL_WIFI);
    lv_obj_set_style_text_font(label4, &lv_font_montserrat_14, 0);
    lv_obj_set_style_text_color(label4, lv_color_hex(0x1e1e1e), 0);
    lv_obj_align(label4,LV_ALIGN_CENTER,0,0);


    //蓝牙图标
    lv_obj_t* label5=lv_label_create(obj2);
    lv_label_set_text(label5, LV_SYMBOL_SETTINGS);
    lv_obj_set_style_text_font(label5, &lv_font_montserrat_14, 0);
    lv_obj_set_style_text_color(label5, lv_color_hex(0x1e1e1e), 0);
    lv_obj_align(label5,LV_ALIGN_CENTER,0,0);

    //字体
    lv_obj_t* text=lv_label_create(lv_scr_act());
    lv_obj_set_size(text, 200, 200);
    lv_label_set_text(text, "hello lvgl !");
    lv_obj_set_style_text_font(text, &lv_font_montserrat_14, 0);
    lv_obj_set_style_text_color(text, lv_palette_main(LV_PALETTE_LIGHT_BLUE), 0);
    //lv_obj_set_style_text_font(obj, 20, 0);
    lv_obj_align(text,LV_ALIGN_TOP_MID,60,20);



}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgekfie
系列文章
更多 icon
同类精品
更多 icon
继续加载