333|0

9

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【2024 DigiKey创意大赛】基于STM32MP157的智能垃圾桶 [复制链接]

 

基于STM32MP157的智能垃圾桶

作者:zfw152666

一、作品简介

作品照片;作品功能介绍;物料清单及简介,如使用的板卡、芯片、模块等;100-200 字

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

垃圾分类识别+舵机控制

语音控制垃圾桶开关

检测垃圾桶的满溢程度

摄像头读取图像信息并通过UDP传输至客户端使用视觉识别垃圾种类,通过 STM32F4通过RTOS控制舵机与电机实现垃圾倾倒,并将垃圾数据以及传感器数据发送给MP157,再由MP157使用socket编程上传数据到后端服务器并在网页可视化显

                  

 

二、系统框图 设计思路、系统软硬件介绍及实现框图,以图文结合的方式展示

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

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

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

使用CAN协议进行M2006大疆电机控制 配合PS2手柄可以做到远程控制垃圾桶前进、后退、加减速,自旋等


接下来就是把它上手玩起来。

三、各部分功能说明 各部分实现的功能说明及讲解,以图文结合的方式展示

ODYSSEY - STM32MP157C是一款基于STM32MP157C的单板计算机,STM32MP157C是一款双核Arm-Cortex-A7处理器,工作频率为650Mhz。该处理器还集成了Arm Cortex-M4协处理器,使其适合于实时任务。ODYSSEY - STM32MP157C以SoM(系统模块)和载波板的形式创建。SoM由MPU、PMIC、RAM和树莓派形式的载体板组成。承载板包括所有必要的外设,包括千兆以太网,WiFi/BLE,直流电源,USB主机,USB - c, MIPI-DSI, DVP用于相机,音频等。通过该板,客户可以快速评估SoM,并方便快捷地将SoM部署到自己的运营商板上。

双核Arm-Cortex-A7核心处理器与Cortex-M4集成som(系统模块)包括MPU, PMIC, RAM。树莓派40针兼容载波板。紧凑的尺寸和powerfulopen源硬件/ SDK / API / BSP / OSSpecification | |项值 | |----------| | 外围接口USB Host1 | 2 x x千兆以太网interface1x 3.5毫米音频interface1 MIPI DSI显示interface1 x DVP相机interface2格罗夫(GPIO & I2C) 1 x SD卡接口(在董事会)][WiFi /蓝牙| WiFi 802.11 b / g / n 2.4 ghzbluetooth 4.1)车载LED | 1 x重置LED3定义LED1功率LED]权力| 1 x直流接口(12 v / 2电源输入推荐)1 x USB类型- C键|1 x复位键1 x用户键1 x拨号码键|尺寸|56mm x 85mm| |工作温度|0~ 75℃|应用工业(can -以太网网关等)白色家电(冰箱、微波炉等)医疗(数据记录仪等)高端可穿戴设备(VR设备等)智能家居设备

垃圾分类识别+舵机控制

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

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

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

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

 

 

 

识别控制

 

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

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

下载附件  保存到相册

2024-10-26 20:36 上传

 

检测垃圾桶有没有满,距离检测主要用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));


CC := aarch64-linux-gnu-gcc
SRC := $(shell find src -name "*.c")
INC := ./inc \
       ./3rd/usr/local/include \
       ./3rd/usr/include \
       ./3rd/usr/include/python3.10 \
       ./3rd/usr/include/aarch64-linux-gnu/python3.10 \
       ./3rd/usr/include/aarch64-linux-gnu
 
OBJ := $(subst src/,obj/,$(SRC:.c=.o))
 
TARGET=obj/garbage
 
CFLAGS := $(foreach item,$(INC),-I$(item)) #-I./inc -I./3rd/usr/local/include
LIBS_PATH  := ./3rd/usr/local/lib \
                 ./3rd/lib/aarch64-linux-gnu \
                 ./3rd/usr/lib/aarch64-linux-gnu \
                 ./3rd/usr/lib/python3.10    
 
LDFLAGS := $(foreach item,$(LIBS_PATH),-L$(item))#-L./3rd/usr/local/lib
LIBS := -lwiringPi -lpython3.10 -pthread -lexpat -lz -lcrypt
 
obj/%.o:src/%.c
    mkdir -p obj
    $(CC) -o $@ -c $< $(CFLAGS)
 
$(TARGET) : $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(LIBS)
    scp obj/garbage src/garbage.py orangepi@192.168.0.113:/home/orangepi/garbage
 
compile: $(TARGET)
 
clean: rm $(TARGET) obj $(OBJ) -rf
 
debug:
    echo $(CC)
    echo $(SRC)
    echo $(INC)
    echo $(OBJ)
    echo $(TARGET)
    echo $(CFLAGS)
    echo $(LDFLAGS)
    echo $(LIBS)

由于本作品代码上传到了下载·中心,就不浪费篇幅在此粘贴具体代码,感兴趣的朋友可去下载中心查阅,有完整详细的代码,在此仅仅列举文件目录结构。

源码链接:https://bbs.eeworld.com.cn/my/home.php?cur=myhome&act=download

项目源码说明  

 

五、作品功能演示视频

30083d47bc59cd6e859c16685c35adf6

 

六、项目总结

          使用视觉识别垃圾种类,通过 STM32F4通过RTOS控制舵机与电机实现垃圾倾倒,并将垃圾数据以及传感器数据发送给MP157,再由MP157使用socket编程上传数据到后端服务器并在网页可视化显示                   

DigiKey2024STM32MP157智能垃圾桶.doc

475 KB, 下载次数: 4

点赞 关注
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
2007年嵌入式系统设计师考试试题下载

2007年下半年的嵌入式系统设计师考试大纲及试题

空中鼠标-MSP-EXP430FR5739实验板实现

玩跑跑卡丁车突发奇想,可不可以用团购来的MSP-EXP430FR5739实验板来控制赛车!基本思路是这样的,利用EXP430FR5739实验板上的三 ...

【LPC54100】 万坑板折腾 + J-Link折腾 + 欢快的LEDs

本帖最后由 shinykongcn 于 2015-3-26 13:35 编辑 好吧,万坑板 LPC54102收到一个星期了,才出了一个晒板吐槽贴,罪过,到现 ...

分享 JLink 软件复位、Halt及运行小工具

本帖最后由 sblpp 于 2016-1-15 09:47 编辑 调试硬件时常常需要复位目标芯片,每次断电上电太麻烦,又不喜欢总打开segger的 ...

ST MEMS传感器创意设计大赛火热报名中,大疆无人机、GoPro摄像机、Kindle 等你来拿...

2020年ST MEMS 传感器创意设计大赛启动啦: ST MEMS各类传感器驾到 内嵌“有限状态机和机器学习内核”的传感 ...

颁奖:5月20日TI最新C2000实时控制器直播活动

活动详情:点此查看 领奖期限:即日起至7月2日 领奖说明:请查看您的常用邮箱(您观看直播时登记的),并填写领奖信息表, ...

【润和Neptune测评】五 PWM

PWM:脉冲宽度调制 就是周期性的控制IO拉高拉低的时间(占空比),来控制开关管的通断,实现功率的控制,比如LED调光,直流电 ...

世界上第一颗由 Pi 驱动的卫星

593713 犹他州立大学 (USU) 的本科生已成功将第一颗由 Pi 驱动的卫星送入轨道。 由 NASA 赞助的 GASPACS CubeSat 配备了 Ras ...

分享两份FreeRTOS学习教程

《FreeRTOS操作系统教程》 全面介绍了在Keil及IAR下操作系统的移植;以及全方位介绍了操作系统的原理!调试方法!适合初学者 ...

免费申请:Luckfox幸狐 RV1106 Linux 开发板

测评型号:Luckfox Pico Max(5套) 来源:幸狐科技 767417 Luckfox Pico Max 是一款基于瑞芯微 RV1106 芯片具有高 ...

关闭
站长推荐上一条 1/8 下一条

 
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
快速回复 返回顶部 返回列表