一、项目概述
随着城市化进程的加快,垃圾分类变得越来越重要。本文设计了一套基于STM32F103单片机、图像处理技术和传感器技术的智能垃圾分类系统。该系统能够自动识别垃圾类型,并通过机械装置进行准确分类,有效提升垃圾分类的效率和准确性。
项目目标和用途
项目旨在开发一款智能垃圾分类系统,能够实现对不同类型垃圾的自动识别与分类,降低人工分类的工作量。主要应用于社区、学校、企业等场所,促进环保和资源回收利用。
技术栈关键词
-
STM32F103单片机
-
OpenMV图像处理模块
-
SSD目标检测算法
-
舵机控制
-
传感器技术
-
无线通信模块(如Wi-Fi、蓝牙)
二、系统架构
系统架构设计
-
主控单元:STM32F103单片机,负责系统的整体控制和数据处理。
-
图像处理单元:OpenMV模块,负责实时图像采集和垃圾类型识别。
-
执行单元:舵机控制,负责根据识别结果控制垃圾桶的开关。
-
传感器单元:用于获取垃圾的相关信息(如重量、体积等)。
-
无线通信模块:用于与外部设备(如手机或电脑)进行数据交互。
选择的单片机和通信协议
-
单片机:STM32F103,具有高性能、低功耗的特点,适合嵌入式应用。
-
通信协议:使用UART与OpenMV模块通信,Wi-Fi模块用于数据上传。
架构图
控制 控制 获取数据 通信 STM32F103单片机 OpenMV模块 舵机 传感器 无线模块
三、环境搭建和注意事项
开发环境
- 硬件环境:
-
STM32F103开发板
-
OpenMV摄像头模块
-
舵机电机
-
各类传感器(如重量传感器、红外传感器等)
-
电源模块
- 软件环境:
-
STM32CubeIDE:用于STM32单片机的开发。
-
OpenMV IDE:用于OpenMV模块的编程和调试。
-
Python:图像处理和算法实现。
注意事项
-
确保电源稳定,避免因电压不稳导致系统异常。
-
选择合适的舵机,确保其控制精度和响应速度满足要求。
-
在实际环境中测试时,确保光照条件适宜,以提高图像识别的准确性。
四、代码实现过程
4.1 系统模块划分
整个系统主要由以下几个功能模块组成:
-
图像采集模块:使用OpenMV进行图像捕捉和垃圾类型识别。
-
数据处理模块:STM32F103单片机接收OpenMV发送的垃圾识别结果并进行相应处理。
-
执行控制模块:通过舵机控制垃圾桶的开关,确保垃圾被正确分类。
-
传感器模块:获取垃圾的额外信息,提升分类精度。
-
通信模块:实现与外部设备的数据交互。
4.2 代码实现
4.2.1 OpenMV模块代码
OpenMV模块负责垃圾的图像识别,下面将详细介绍其代码实现过程。
步骤1:初始化摄像头
py
import sensor, image, time
# 初始化摄像头
sensor.reset() # 重置摄像头
sensor.set_pixformat(sensor.RGB565) # 设置图像格式
sensor.set_framesize(sensor.QVGA) # 设置图像分辨率
sensor.skip_frames(time=2000) # 等待摄像头初始化
- 解释:此部分代码主要用于配置摄像头的基本参数。首先重置摄像头,然后设置图像格式为RGB565,分辨率设置为QVGA(320x240),最后等待摄像头稳定。
步骤2:加载SSD模型
py
# 加载SSD模型
net = load_model("ssd_model.tflite") # 加载预训练的SSD模型
- 解释:此行代码用于加载事先训练好的SSD模型,该模型将用于识别不同类型的垃圾。模型文件"ssd_model.tflite"需要存储在OpenMV模块的存储器中。
步骤3:实时图像处理和垃圾识别
py
while True:
img = sensor.snapshot() # 捕获一帧图像
objects = net.detect(img) # 使用SSD模型检测图像中的物体
for obj in objects:
img.draw_rectangle(obj.rect()) # 在识别的物体周围画出矩形框
print("Detected: ", obj.class_id) # 输出识别到的物体类别
-
解释:
-
捕获图像:使用
sensor.snapshot()
方法捕获实时图像。 -
物体检测:调用
net.detect(img)
进行物体识别,返回识别到的物体信息,包括位置和类别。 -
绘制矩形框:使用
img.draw_rectangle(obj.rect())
在识别到的垃圾周围绘制矩形框,方便观察。 -
输出类别:
print("Detected: ", obj.class_id)
将识别结果输出到控制台。
-
4.2.2 STM32F103单片机代码
STM32F103负责根据OpenMV模块的识别结果进行舵机控制和垃圾分类。下面详细介绍其代码实现。
步骤1:初始化舵机和通信
c
#include "stm32f1xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
void ControlServo(uint8_t position);
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化GPIO
MX_TIM2_Init(); // 初始化定时器
// 初始化UART通信
UART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart1); // 初始化UART
-
解释:
-
HAL库初始化:使用
HAL_Init()
初始化硬件抽象层库。 -
时钟配置:
SystemClock_Config()
用于配置系统时钟。 -
GPIO和定时器初始化:通过
MX_GPIO_Init()
和MX_TIM2_Init()
初始化GPIO和定时器,以控制舵机和读取传感器。 -
UART初始化:设置UART通信参数以便与OpenMV模块进行数据交互。
-
步骤2:舵机控制函数
c
void ControlServo(uint8_t position) {
TIM2->CCR1 = position; // 设置舵机的PWM占空比,以控制角度
}
- 解释:此函数通过设置定时器的比较值来控制舵机的角度。
position
参数决定舵机的目标位置。
步骤3:主循环中的垃圾分类控制
c
while (1) {
uint8_t buffer[10];
HAL_UART_Receive(&huart1, buffer, sizeof(buffer), HAL_MAX_DELAY); // 接收OpenMV发送的数据
// 根据接收到的垃圾类型进行分类
if (buffer[0] == '1') { // 如果识别到可回收物
ControlServo(30); // 打开可回收垃圾桶
} else if (buffer[0] == '2') { // 如果识别到厨余垃圾
ControlServo(60); // 打开厨余垃圾桶
} else { // 其他垃圾
ControlServo(90); // 打开其他垃圾桶
}
HAL_Delay(1000); // 延时1秒,确保舵机有足够时间完成动作
}
-
解释:
-
'1'
表示可回收物,调用ControlServo(30)
将舵机转到可回收垃圾桶位置。 -
'2'
表示厨余垃圾,调用ControlServo(60)
将舵机转到厨余垃圾桶位置。 -
其他情况下,控制舵机转到其他垃圾桶位置(
ControlServo(90)
)。 -
条件判断:根据接收到的字符判断垃圾类型:
-
延时控制:使用
HAL_Delay(1000)
函数让程序等待1秒,确保舵机有足够的时间完成相应的动作,避免舵机连续快速切换导致的机械损伤。
-
4.3 时序图
为了更清晰地展示系统各个模块之间的交互和时序关系,这里提供一个时序图,展示垃圾分类系统的工作流程。
User OpenMV STM32 Servo 识别垃圾 捕获图像 处理图像 发送识别结果 控制舵机打开相应垃圾桶 打开垃圾桶 等待1秒 准备下一次识别 User OpenMV STM32 Servo
4.4 代码逻辑分析
- OpenMV模块:
-
实时捕获图像并通过SSD模型进行垃圾识别。
-
识别后,数据发送给STM32单片机,完成从图像到分类信息的转换。
- STM32F103模块:
-
接收来自OpenMV的数据,并解析识别到的垃圾类型。
-
根据垃圾类型控制舵机,将垃圾桶打开,以便垃圾被投放到正确的桶中。
-
处理完成后,设置延时,确保舵机完成动作。
4.5 调试和测试
在开发过程中,调试和测试是非常重要的环节。以下是调试和测试的一些重要步骤:
-
OpenMV模块调试:
-
确保摄像头能够正确捕获图像,并在OpenMV IDE中测试SSD模型的识别效果。
-
输出识别结果到控制台,验证识别的准确性。
-
-
STM32模块调试:
-
验证UART通信是否正常,可以通过串口调试工具发送数据并确认STM32能够接收。
-
测试舵机控制逻辑,确保舵机能够根据接收的命令正确转动。
-
-
系统集成测试:
-
将OpenMV模块和STM32F103集成在一起,进行整体测试。
-
在实际环境中放置不同类型的垃圾,观察系统的识别和分类效果,记录分类准确率。
-
五、项目总结
本文设计的智能垃圾分类系统实现了以下主要功能:
-
实时图像采集与处理:通过OpenMV模块实时捕获图像,并使用SSD算法进行目标识别,能够识别多种类型的垃圾(如可回收物、厨余垃圾等)。
-
自动垃圾分类:STM32F103单片机根据识别结果控制舵机,实现垃圾的自动分类,提升了垃圾分类的效率。
-
模块化设计:系统采用模块化设计,确保各个部分可以独立开发和测试,便于后续的功能扩展和维护。