智能垃圾分类垃圾桶(K210+stm32mp157)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

有需要源码参考的可以点赞在评论区留邮箱

K210识别垃圾

k210识别2

文章目录

  • 前言
  • 一、垃圾分类识别+舵机控制(K210)
  • 二、语音控制(K210+ld3320)(UART通信)
  • 三、满溢度距离传感器数据获取(STM32MP157)
  • 四、图像获取以及传输(STM32MP157)(UDP)
  • 总结


前言

最近做了一个多功能智能垃圾桶,主要用了k210开发板来做识别和控制以及用stm32mp157来做传感器数据采集以及图像传输。主要功能如下

垃圾分类识别+舵机控制

语音控制垃圾桶开关

检测垃圾桶的满溢程度

摄像头读取图像信息并通过UDP传输至客户端

一、垃圾分类识别+舵机控制

垃圾分类使用的开发板是K210

模型训练可以用mxyolov3平台,也可以用官方的训练平台(这个比较容易使用,但有数据集20M大小的限制),使用开发板前需要用KFLASH烧录.bin后缀的固件包,将训练完成的kmodel文件烧录至开发板,然后需要一段执行代码,后续的功能联调也是需要在识别代码基础上添加

识别完需要进行一些控制,不然结果也就只是结果。我在项目中通过pwm信号控制舵机转动,来识别垃圾桶的识别功能。

为了防止误判,我在识别代码里加了连续10帧检测同一物体才驱动舵机

识别控制

以下是舵机转动角度的函数,主要是改变PWM信号的占空比

def Servo(servo,angle):
    servo.duty((angle+90)/180*10+2.5)

二、语音控制

语音控制

ld3320语音模块控制垃圾桶的开关(也就是ld3320跟K210通信,K210控制舵机转动)

ld3320跟K210通过UART串口通信

ld3320模块,识别到垃圾桶打开的指令,就通过串口向K210发送‘aa’的数据,在K210端进行UART串口信息的检测,若收到的信息为‘aa’ 就控制舵机转动

read_data = uart_wifi.read()
#下面是开盖 并进入检测 servo是转动角度的函数

if(read_data == b'bb'):
        Servo(S3,-30)
        flag = 1;
if(read_data == b'aa'):
        Servo(S3,60)
        flag = 0;
 

三、满溢度距离传感器数据获取(STM32MP157)

检测垃圾桶有没有满,距离检测主要用stm32mp157开发板上的ap3216c传感器。

对传感器数据的读取是读取设备文件数据,是通过文件 I/O 的方式来实现。在应用层编写代码读取设备下的数据即可

以下为传感器数据读取的代码

QString Ap3216c::readPsData()
{
    char const *filename = "/sys/class/misc/ap3216c/ps";
    int err = 0;
    int fd;
    char buf[10];

    fd = open(filename, O_RDONLY);
    if(fd < 0) {
        close(fd);
        return "open file error!";
    }

    err = read(fd, buf, sizeof(buf));
    if (err < 0) {
        close(fd);
        return "read data error!";
    }
    close(fd);

    QString psValue = buf;
    QStringList list = psValue.split("\n");
    return list[0];
}

四、图像获取以及传输(STM32MP157)(UDP)

获取开发板摄像头的数据,并通过UDP传输至客户端

在QT中使用UDP传输流程:

服务器端创建socket,就可以直接使用writeDatagram函数发送信息,在函数的参数中需要写入数据,数据大小接收端的IP,端口号

(使用TCP的话一般服务器端是需要创建socket,bind,listen监听,并accept客户端的connect,我们这里传输视频信息,用UDP延时会比较小,当然只是理论,我并没有测试过)

客户端创建socket,绑定自己的IP和端口号,就可以用readDatagram函数接收数据

这里就用自己的电脑作为客户端,来获取垃圾桶的实时状况。(其实这个功能只是我为了学习网络编程强加的,功能比较鸡肋,主要是学习)

服务器端的代码

//摄像头通过调用opencv库获取到的数据类型为mat 需要先转成QImage类型
//QImage类型的图像放入QByteArray中,然后进行base64编码的压缩
//接收端在进行base64解码
/* udp套接字 */
     QUdpSocket udpSocket;

/* QByteArray类型 */
     QByteArray byte;

/* 建立一个用于IO读写的缓冲区 */
     QBuffer buff(&byte);
    
/* image转为byte的类型,再存入buff */
     qImage.save(&buff, "JPEG", -1);

/* 转换为base64Byte类型 */
     QByteArray base64Byte = byte.toBase64();

/* 由udpSocket以单播的形式传输数据,端口号为8888 */
     udpSocket.writeDatagram(base64Byte.data(), base64Byte.size(), QHostAddress("192.168.10.200"), 8888);

客户端代码

udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress("192.168.10.200"), 8888);
QByteArray datagram;
udpSocket->readDatagram(datagram.data(), datagram.size());

//String-Base64编码转QByteArray
 QByteArray decryptedByte;
decryptedByte = QByteArray::fromBase64(datagram.data());


//比如读入一张BMP格式的文件到QByteArray对象中,再调用该函数,那么该函数就会根据QByteArray中数据进行解析,分析图像的格式等
QImage image;
image.loadFromData(decryptedByte);
videoLabel->setPixmap(QPixmap::fromImage(image));

总结

整个的项目用了2个架构的开发板K210(RISV-C)和stm32mp157(cortex-A)

主要是为了学习一些嵌入式方面的知识,并把他实际运用上。

### K210芯片在垃圾分类中的应用与实现方案 #### 一、背景介绍 随着环境问题的加剧,垃圾分类逐渐成为城市管理的关键环节之一。传统的手工分类方式已经难以应对日益增长的垃圾量和复杂度。为此,智能化技术被引入到垃圾分类领域,旨在提升其效率和精确性。基于K210芯片的智能垃圾分类系统因其高效的计算能力和低功耗特性,在这一领域展现出显著优势[^1]。 #### 二、K210芯片的功能特点及其适用场景 K210是一款由 Kendryte 开发的 RISC-V 架构 AI 芯片,具有双核处理器架构,并集成了专门用于神经网络推理的 KPU(Kernel Processing Unit)。它支持多种机器学习框架,适用于边缘端设备上的实时图像处理任务。具体功能如下: - **高性能AI运算能力**:内置专用硬件加速单元,可快速完成卷积神经网络(CNN)等算法的推断操作; - **低能耗设计**:适合电池供电型产品或者对能源消耗敏感的应用场合; - **丰富的外设接口资源**:便于连接各类传感器和其他外围组件,构建完整的解决方案体系结构[^3]。 #### 三、基于K210垃圾分类系统组成 整个系统的硬件部分主要包括以下几个核心元件: - STM32微控制器负责整体流程协调管理以及执行具体的动作指令(如驱动马达打开垃圾桶盖子); - K210作为主控单元承担起视觉分析工作——通过搭载OV5640摄像头获取待检测物体图片数据后利用预训练好的深度学习模型对其进行类别判断; - 其他辅助设施还包括但不限于显示屏用来显示当前状态信息给用户查看、舵机控制投放口方向调整等等[^2]. 以下是关于如何使用Python编写一段简单的程序来加载预先训练完毕后的模型并对新输入样本做出预测的一个例子: ```python from maix import nn, image, camera # 加载模型文件 model_path = "/path/to/your/model_file" interpreter = nn.Interpreter(model_path) # 准备输入张量形状匹配模型需求 input_shape = interpreter.get_input_tensor()[0].shape print("Input tensor shape:", input_shape) while True: frame = camera.capture() # 获取单帧画面 img_resized = frame.resize(input_shape[2], input_shape[1]) # 缩放至合适尺寸 img_normalized = (img_resized - mean)/std # 归一化处理 output_data = interpreter.run(img_normalized)[0] # 执行前向传播得到结果 predicted_class_index = np.argmax(output_data) # 寻找最大概率对应的索引号 label_map = ["Plastic", "Paper", "Metal"] # 定义标签映射表 print(f"Predicted class is {label_map[predicted_class_index]}") ``` 上述代码片段展示了从捕获视频流直至得出最终判定结论的整体逻辑链条。其中涉及到几个重要步骤包括但不限于读取每一帧图像内容;按照特定规格裁剪缩放到适配目标网络层期望接收的数据形式;最后调用解释器对象运行一次正向传递过程从而获得可能属于各个类别的可能性数值列表。 #### 四、总结说明 综上所述,借助于像K210这样具备强大算力同时兼顾节能特性的嵌入式人工智能平台可以有效解决目前面临的一些挑战比如提高识别精度减少误判率等方面均能取得不错的效果。与此同时还需要注意配合其他配套软硬件共同协作才能达成预期目的即全自动化的高效精准分拣作业模式^.
评论 289
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值