博士
最后登录1970-1-1
在线时间 小时
注册时间2018-3-16
|
本帖最后由 Juggernaut 于 2024-11-16 19:38 编辑
一、作品简介
电池广泛应用于遥控器、手电筒、手机、电动汽车、电动自行车等方方面面。废旧电池含有重金属和化学物质,若随意丢弃会严重污染环境并危害人类健康。因此,正确处理废旧电池至关重要。常见的处理方式包括回收处理、填埋处理、焚烧处理以及家庭垃圾分类。其中,回收处理是目前较为普遍且有效的废旧电池处理方式。把废旧电池送到指定的回收点或回收站,由专业公司进行处理。这些专业公司会对废旧电池进行分类、拆解和提炼,分离出有用的金属和化学物质,减少对环境的污染,回收处理需将废旧电池集中放在回收废旧电池的垃圾桶里,等待环卫工人来回收和处理。但在实际使用中,专门回收废旧电池的垃圾桶经常被投入其它无关垃圾,严重的影响了废旧电池回收效率。
本项目主要设计一个智能识别电池的垃圾箱,采用野火启明RA6T2电机开发板作为主控板,外接OpenMV摄像头执行采集图像和智能识别功能,同时外接MG90S舵机用于模拟垃圾箱门打开和关闭,通过OpenMV摄像头进行识别,如果是则打开垃圾箱门并亮灯。
二、系统设计
野火启明RA6T2电机开发板负责接收来自OpenMV摄像头的信号,控制舵机和LED灯,OpenMV摄像头循环采集图像,比对电池模型特征差异度,如果成功则通知野火启明RA6T2电机开发板,具体业务流程图如下。
[size=16.0000pt]
三、项目硬件
[size=16.0000pt]
(一)野火启明RA6T2电机开发板
瑞萨的 RA (Renesas Advanced)产品家族单片机 (MCU) 于 2019 年 10 月推出,丰富了瑞萨的 32 位 MCU 系列产品。RA6T2 MCU采用 7mm x7mm 的 48 引脚 QFN 封装,模拟集成了电源管理和电源驱动器,可编程性允许为逆变器进行最佳调谐,提供优化后的电流矢量控制、滤波操作和减少主 CPU 内核 (Cortex®-M33) 负载,旨在最大限度地降低整体 BOM 成本、缩减尺寸并替换在电机中占用大量空间且价格高昂的光学编码器。
(二)OpenMV摄像头
OpenMV摄像头用的是RT-Thread跟瑞萨联合推出的Vision Board,其搭载全球首颗 480 MHz Arm Cortex-M85芯片,拥有Helium和TrustZone技术的加持。SDK包里集成了OpenMV机器视觉例程,配合MicroPython 解释器,MicroPython的高级数据结构使得很容易在机器视觉算法中处理复杂的输出,使其可以流畅地开发机器视觉应用。
Vision Board的MCU为瑞萨(跟主控板一样都是瑞萨的芯片)的R7FA8D1 ARM Cortex M85处理器,480 MHz,集成2MB闪存和1MB SRAM。
(三)MG90S舵机
MG90S是一个360度舵机,本质上都是通过输出PWM波来控制的,舵机的工作原理非常简单,就是通过单片机输出的PWM波来控制,舵机会根据信号的占空比来计算需要转动的角度,而MG90S是不能控制转动的角度,因此它的占空比是用来控制舵机转动的速度和方向。
四、具体实现
(一)电池模型训练
本项目使用Edge Impulse进行模型的训练。Edge Impulse是一个端到端的开发平台,专为构建和部署嵌入式机器学习模型而设计。它使开发人员能够使用传感器数据来构建自定义的机器学习模型,并在边缘设备上运行这些模型,而无需互联网连接。Edge Impulse提供了一系列的工具和库,使开发人员能够快速有效地构建和部署自定义的嵌入式机器学习应用程序。
基本流程,先包括导入200张左右的训练图片。
在Create impulse 进行模型配置。
在Edge Impulse中生成特征。
在Object Detection 中配置训练参数并训练。
最后生成OpenMV工程库,包括一个tflite模型文件、一个labels文件,还有个可以在OpenMV运行的py脚本。
注意,因为模型训练不是本项目的重点,这里仅仅贴了几张在Edge Impulse中训练模型的关键节点的截图,基于Edge Impulse训练嵌入式平台模型的具体细节指南请参考官方文本,写的很详细:Adding sight to your sensors | Edge Impulse Documentation 和 OpenMV | Edge Impulse Documentation。
[size=21.3333px]
(二)电池识别
瑞萨R7FA8D1处理器基于ARM Cortex M85内核,具备强大的性能,可以轻松处理此项工作。为了实现与野火启明RA6T2电机开发板的串口通信,根据OpenMV摄像头的硬件设计,选择了UART2。然后通过“uart = UART(2, 115200)”将其初始化成buadrate为115200的串口。
电池识别的基本实现思路就是先拍照,再加载tflite模型进行分析分类,一旦确定是电池后,向串口2发出信息“x”,此处模型分类留了后续扩展升级余地,譬如后续可以训练加上纽扣电池灯标签的模型,方便后续功能扩展。基于训练好的电池模型识别电池的具体源码(MicroPython)如下:
[size=16.0000pt]
(三)舵机控制
配置好野火启明RA6T2电机开发板的PWM,开发板提供2组PWM控制接口,对应的针脚分别为PB4和PB5,项目只用PB4作为PWM输出,在FSP Smart Configurator中配置好即可。
同时,配置好UART串口,用于接收来自OpenMV的信号,野火启明RA6T2电机开发板上有个串口屏的接口,PB12/PB13针脚,是UART3,直接拿来用了,同样在FSP Smart Configurator中配置好。
野火启明RA6T2电机开发板接收来自OpenMV摄像头的信息实现源码如下:
- void g_uart3_callback (uart_callback_args_t * p_args)
- {
- switch (p_args->event)
- {
- case UART_EVENT_RX_CHAR:
- {
- switch(p_args->data)
- {
- case 'x':
- uart_get_action_flag = true;
- break;
- default:
- break;
- }
- break;
- }
- case UART_EVENT_TX_COMPLETE:
- {
- uart_send_complete_flag = true;
- break;
- }
- default:
- break;
- }
- }</font>
复制代码
野火启明RA6T2电机开发板通过PWM控制舵机函数实现如下:
- uint8_t Angle_Num = 0;//角度变量
-
- /* 定时器初始化函数 */
- void initMotor(void)
- {
- fsp_err_t err = FSP_SUCCESS;
- /* 初始化 GPT 模块 */
- err = R_GPT_Open(&gear_pwm_ctrl, &gear_pwm_cfg);
- assert(FSP_SUCCESS == err);
-
- /* 启动 GPT 定时器 */
- err = R_GPT_Start(&gear_pwm_ctrl);
- assert(FSP_SUCCESS == err);
- }
-
- void setGearAngle(uint32_t angle)
- {
- timer_info_t info;
- uint32_t current_period_counts;
-
- /* 获得GPT的信息 */
- R_GPT_InfoGet(&gear_pwm_ctrl, &info);
-
- /* 获得计时器一个周期需要的计数次数 */
- current_period_counts = info.period_counts;
- if(0 <= angle && 180 >= angle)
- {
- /*将脉宽角度转换为定时器计数器数值*/
- angle = (uint32_t)((0.5 + angle / 180.0 * (2.5 - 0.5)) / 20.0 * current_period_counts);
-
- /*将期望角度的数值输入以PWM方式实现*/
- R_GPT_DutyCycleSet(&gear_pwm_ctrl, current_period_counts - angle, GPT_IO_PIN_GTIOCA_AND_GTIOCB);
- }
- }</font>
复制代码
(四)LED控制
直接用野火启明RA6T2电机开发板上的2个LED,一个红色一个蓝色,为PD1和PD3,老办法,直接在FSP Smart Configurator中配置好针脚。
直接用宏来实现LED控制:
- /* LED引脚置低电平 LED灯亮 */
- #define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_01, BSP_IO_LEVEL_LOW)
- #define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_03, BSP_IO_LEVEL_LOW)
-
- /* LED引脚置高电平 LED灯灭 */
- #define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_01, BSP_IO_LEVEL_HIGH)
- #define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_13_PIN_03, BSP_IO_LEVEL_HIGH)</font>
复制代码
(五)总体业务实现
在野火启明RA6T2电机开发板main()中,循环检查是否从串口3收到“x”这个特殊字符,一旦收到立即控制舵机旋转90度模拟垃圾箱盖打开,同时点亮蓝色LED,3秒后,舵机回旋90度模拟垃圾箱盖关闭,同时熄灭蓝色LED,具体代码如下:
- void executeAction(void)
- {
- LED2_ON;
- //逆时针转90度
- Angle_Num = ((180 - Angle_Num) >= 90) ? (Angle_Num + 90) : Angle_Num;
- setGearAngle(Angle_Num);
- //等待3S
- R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
-
- //复位
- Angle_Num = ((Angle_Num - 0) >= 90) ? (Angle_Num - 90) : Angle_Num;
- setGearAngle(Angle_Num);
- LED2_OFF;
-
- //等待完成
- R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);
- }
-
- void event_loop(void)
- {
- if (uart_get_action_flag == true)
- {
- uart_get_action_flag = false;
- executeAction();
- R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);
- }
- }
-
- void hal_entry(void)
- {
- IRQ_Init();//按键中断初始化
- LED_Init(); // LED 初始化
- Debug_UART9_Init();//调试串口初始化
- UART3_Init();
- initMotor(); //初始化定时器
- setGearAngle(0);//上电使舵机回到0度位置
-
- while(1)
- {
- event_loop();
- }
- }</font>
复制代码
五、运行测试
先来张全家福,因为野火启明RA6T2电机开发板直接提供单独的PWM接口,M90S舵机直接插上即可,此外电机板的串口3需要跟OpenMV的串口2连接起来。
来个测试,找了个干电池在摄像头前晃下,可以看出系统已经识别出电池,舵机打开的同时蓝色LED灯亮,3S后舵机关闭同时关闭蓝色LED,具体看视频。
视频已经上传B站,传送URL:https://www.bilibili.com/video/B ... F7AAF9547C704CF6F03
最后,感谢野火组织的活动!
|
|