1949|0

166

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【玄铁杯第三届RISC-V应用创新大赛】基于LICHEEPI 4A的智能冷鲜柜设计 [复制链接]

  本帖最后由 电子烂人 于 2023-12-12 15:52 编辑

基于LICHEEPI 4A的智能冷鲜柜设计

一.项目介绍

1.项目背景:

在餐厅后厨和一些酒店中,食材的管理尤为重要。但是每当中午和晚上的“饭点”时,由于客流量多、订单爆满、后厨人手不足等情况,总是会出现食材耗尽的情况。本设计旨在识别冷鲜柜中的食材数量,并及时预警食材即将耗尽的情况,以避免顾客下单后无法备餐的情况。

2.项目介绍:

本设计使用LICHEEPI 4A 做为主控模块,读取温度模块数值,并显示到屏幕上。同时当接触开关打开并关闭时(对应柜门开启后关闭),使用OPENCV拍摄一张图片并处理其亮度和GAMMA值,使用nanodet检测图片里的食材类型和数量,并统计后发送到管理后台。

3.项目框架:

 

4.硬件介绍:

 

  • licheepi 4a:
  • LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板,以 TH1520 为主控核心(4xC910@1.85G, RV64GCV,4TOPS@Int8 NPU, 50GFLOP GPU),板载最大 16GB 64bit LPDDR4X,128GB eMMC,支持 HDMI+MIPI 双4K 显示输出,支持 4K 摄像头接入,双千兆网口(其中一个支持POE供电)和 4 个 USB3.0 接口,多种音频输入输出(由专用 C906 核心处理)。
  • RS485温度传感器模块

  •  

  • 显示模块:stm32f746discover

  •  

  • 微动开关

  •  

  • 自制licheepi 4A 的RS485拓展板(已更新到第三版)

  •  

  • 该PCB引出了主要接口,并讲SPI和UART用电平转换芯片转换为3.3v电平,并用MAX13487芯片将串口转换为三路RS485信号

  • spi屏幕接口连接1.8寸LCD屏幕(由于官方示例撤下,暂未完成该部分代码设计)

  •  

 

二.方案实现:

使用MAIXHUB平台进行模型训练,类型选择NCNN

平台要求较为苛刻,由于本人在平台训练的模型识别率并不理想,这里借用了@小苏努力ING 的开源NCNN模型(链接:MaixHub

在此基础上进行更改(已争取原作者同意)

 

 

 

运行程序

source ~/Desktop/python//ort/bin/activate
#进入虚拟环境
sudo python3 box.py
#使用管理员权限执行,已有管理员权限可直接执行python3 box.py

当接触开关发生变化时(对应冰箱门开启后关闭),LICHEEPI 4A从摄像头采集一张图片,传入NANODET中进行识别


def adb_shell(cmd):
    result=os.popen(cmd,'r',1).read()
    return result
    #执行调用程序
    
def img_change(img,brightness,gamma):
    img_hsv= cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    img_hsv[:,:,2]=np.clip(img_hsv[:,:,2]+brightness,0,255)
    img_output1 =cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR)
    #亮度调节
    img_output2 = np.power(img_output1/float(np.max(frame)),gamma)
    img_output2 = np.uint8(img_output2 *255)
    #GAMMA调节
    img_yuv = cv2.cvtColor(img_output2,cv2.COLOR_BGR2YUV)
    img_yuv [:,:,0] =cv2.equalizeHist(img_yuv[:,:,0])
    img_output3 = cv2.cvtColor(img_yuv,cv2.COLOR_YUV2BGR)
    #直方图均值化
    
    return img_output3  
    #图像数据处理
      
while(1):

    mem.write(0x0,[0x00402078])
    io=mem.read(0x0, 32).hexdump(4)
    print(io)
    #io="".join(io)
    #re=re.findall('0xffec006050:   ........',io)
    #re=re.findall('\d\d\d\d\d\d\d\d',io)
    #re=re.findall('0xffec006050:   \d\d\d\d\d\d\d\d',io)
    #print(re[0])
    #if (re[0]=='0xffec006050:   7d49ffee'):
    if('0xffec006050:   7d49bfff'in io):
    	ret,frame = cap.read()
    	#读取一帧图像
    	current_time = time.localtime()
    	formatted_time = time.strftime("%Y-%m-%d_%H:%M:%S", current_time)
    	#设定图片名称为时间,格式年月日时分秒
    	nanodet_cmd='./nanodet {}.jpg'.format(formatted_time)
    	#调用NANODET的指令
    
    	img_change(frame,50,1)    
    	cv2.imwrite(r"/home/sipeed/ncnn/build/examples/"+ str(formatted_time) + ".jpg",frame) 
    	#存储路径/home/sipeed/ncnn/build/examples/

同时从温度变送模块中读取实时的数据包并解析其中的温湿度


RS485=serial.Serial('/dev/ttyS1',115200,timeout=1)
RS485_Command = {
    'temp485_query'  :'010300000002C4B0',
    'temp485_address':'010300000002C4B0',
}
hum=0
temp=0

def Read_date(hum,temp):
    counter = 0
    hum_buffer=[]
    temp_buffer = []
    Read_buffer=[]
    Read_buffer = RS485.read(8)

    while (1):
        # 第1帧是否是0x01
        if (counter == 0):
            if (Read_buffer[0] == 0x01):
                counter += 1
                break
        # 第2帧是否是功能码 0x03
        elif (counter == 1):
            if (Read_buffer[1] == 0x03):
                counter += 1
                break
        # 第3帧是否是有效数值 0x04
        elif (counter == 2):
            if (Read_buffer[1] == 0x04):
                counter += 1
                break
        # 第4帧和第5帧存放湿度高位和低位
        elif (counter == 3):
            hum_buffer= Read_buffer[2]
            counter += 1
        # 第5帧和第6存放温度高位和低位
        elif (counter == 4):
            temp_buffer= Read_buffer[2]
            counter += 1
        #第78帧接受校验位
        elif (counter == 5):
            test_buffer= Read_buffer[2]
            counter += 1
        #暂未写校验位的处理
        else:
            if (counter==9):
                Recv_flag = 1

        if (Recv_flag):
            Recv_flag = 0
            try:
                unpack_data[0] = struct.unpack('<hh', temp_buffer[0:4])
                unpack_data[1]=struct.unpack('<hh', hum_buffer[0:4])
                hum  = unpack_data[0]/10
                temp = unpack_data[1]/10
                return temp
            except:    
                counter = 0

用另一路485传输温湿度数据到显示屏上

 

三.功能展示:

参考视频:

3d2fd85cc44afb48c120e8d32d9ddbbb
3d2fd85cc44afb48c120e8d32d9ddbbb

 

 

四.总结:

首先感谢这次EEWorld社区、平头哥开放社区和Sipeed提供的机会有了使用LicheePi 4A的机会。

 

本次设计由于中途负责NCNN部署部分的同学电脑出现问题,暂未做到实时检测的功能,而是使用图片识别进行下位替代。

最大的感触是RISC-V的生态环境还需要各位同学的帮助和官方的共同努力下才能完善,

本次设计一开始准备用光流法和MediaPipe进行箱内拿取物体的识别,已经在电脑上做好代码的前提下,发现RISC-v 暂未做MediaPipe的适配导致库文件不能使用。

后续小组成员在部署NCNN的时候发现vulkan驱动没有手册和使用例程,很多东西需要开发者从头摸索,中途交叉编译使用工具链又踩了很多的坑。  

另外还有许多常用的PYTHON库不能直接使用,需要用官方的XHL文件在虚拟环境里进行安装,若没有官方的支持就很头疼

希望RISC-V社区和生态可以越来越好

往期文章:

  1. 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A (1)开箱组装,点亮屏幕
  2. 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A (2)烧录镜像,试用摄像头
  3. 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A (3)ncnn训练和使用测试
  4. 【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A (3.5)ncnn的使用BUG补充

代码仓库:

链接已隐藏,如需查看请登录或者注册

                仓库后续还会持续更新上传PCB文件,并开源到硬件平台

 

 

 

点赞 关注
个人签名

没用比没有强

 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表