方案介绍
此作品使基于CH32V_EVB RISC-V开发套件以及TencentOS Tiny进行的开发。相对于传统手动分拣芒果,芒果分拣机可以快速高效的将成熟芒果和未成熟芒果进行分类,极大的减少了人力成本,农户或企业可以将资金重心转移至包装或销售上,从而提高利润。
硬件介绍
开发板
- 开发板采用沁恒RISC-V MCU CH32V307VCT6芯片,CH32V305/7系列是基于沁恒自研RISC-V架构微处理器青稞V4系列设计的32位工业级互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,定时器到10组,其中4组高级定时器。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。
- 64KB SRAM,256KB Flash
- 板载Type-C接口WCH-LINK仿真器
- 板载esp8266 WiFi模组,支持腾讯云固件
- 板载以太网接口
- 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组
- 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器以及音频模块;
- 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头;
- 板载1.54寸 IPS高清显示屏,支持240*240分辨率;
- 预留SD卡、用户按键、SPI Flash,
- 扩展IO口,方便开发者扩展硬件模块
E53扩展板
E53_IA1扩展板采用了E53标准接口,包含了一个补光灯,一个BH1750光照强度传感器,一个小的贴片电机,一个温湿度传感器SHT30,一个其中补光灯和贴片电机使用普通GPIO控制,BH1750和SHT30使用IIC接口通信。
OV2640摄像头
- CMOS UXGA图像传感器
- 支持自动曝光控制、自动增益控制
- UXGA最高15帧/秒,SVGA最高30帧/秒
- 支持输出JPEG图像数据
- 200W像素
整体架构
CH32V307作为主控,使用EasyTrace算法通过OV2640进行芒果颜色检测。检测到绿色芒果时,传送带停止运行,当人工或机械臂去除绿色芒果后传送带继续运行,可以随时通过腾讯连连小程序查看机器运行状况。
算法使用
EasyTrace算法(作者ilovepp 原文在stm32上实现颜色跟踪 (amobbs.com 阿莫电子论坛))可以对单一颜色物体进行实时跟踪识别,算法特点如下:
- 代码只有300行,非常简单
- 识别一次只需要2至5毫秒,实时性强
- 只有1个API,使用方便
- 可配置”容错率“ ”迭代次数“等参数,可在”时间“实时性”“ ”准确度“ ”识别率“ ”误识率“ 之间寻找平衡点
芒果成熟与外表颜色有关,所以选择此算法进行检测,以下是颜色参数
代码语言:javascript复制TARGET_CONDITION_t condition[TRACE_NUM]={
{
80, //目标色度,H_MIN,H_MAX 蓝色130-170 绿色80-120 红色200-270
120,
50, //目标饱和度,S_MIN,S_MAX
230,
50, //目标亮度,L_MIN,L_MAX
240,
10, //目标最小宽度,WIDTH_MIN
10, //目标最小高度,HEIGHT_MIN
120, //目标最大宽度,WIDTH_MAX
120, //目标最大高度,HEIGHT_MAX
},
};
其他颜色可以使用HSL计算器进行查找(HSL 颜色 (w3schools.cn))
TencentOS Tiny运用
这次项目运用到TencentOS Tiny组件中提供的ESP8266腾讯云固件,以及基本的task、信号量、循环队列。
连接腾讯云要使用创建设备的三元组进行注册,然后定义数据发送格式:
代码语言:javascript复制#define PRODUCT_ID "6WNFBKZBSC"
#define DEVICE_NAME "dev001"
#define DEVICE_KEY "JfCutCtSyN0 6vHwKG46iA=="
代码语言:javascript复制#define REPORT_DATA_TEMPLATE "{\"method\":\"report\"\,\"clientToken\":\"00000001\"\,\"params\":{\"color\":\"%s\"}}"
通过队列中存储的字符串进行判断并赋值到物模型的对应的值:
代码语言:javascript复制tos_sem_pend(&status_change, TOS_TIME_FOREVER);
err = tos_chr_fifo_pop(&status_fifo, &dev_status);
if (err != K_ERR_NONE) {
printf("status_fifo pop fail, err is %drn", err);
continue;
}
if (dev_status == 0) {
snprintf(payload, sizeof(payload), REPORT_DATA_TEMPLATE, "null");
} else if (dev_status == 1) {
snprintf(payload, sizeof(payload), REPORT_DATA_TEMPLATE, "green");
} else {
printf("device status unknown!");
continue;
}
腾讯云物联网平台开发
视频演示
PPT
工程代码
总结
通过此次活动,更加熟悉了TencentOS Tiny操作系统,也学到了新的视觉识别算法。另外这也是我第一次使用RISC-V的MCU,在使用方面与STM32很类似,CH32V307还拥有DVP这样的外设很方便使用摄像头设备,新手也可以快速上手。