zfw152666 发表于 2024-10-26 16:46

【2024 DigiKey创意大赛】基于STM32MP157的智能垃圾桶

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;基于STM32MP157的智能垃圾桶</p>

<p>一、作品简介</p>

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

<p><span style="font-size:12px;">多功能智能垃圾桶,主要用了k210开发板来做识别和控制以及用stm32mp157来做传感器数据采集以及图像传输。主要功能如下</span></p>

<p><span style="font-size:12px;">垃圾分类识别+舵机控制</span></p>

<p><span style="font-size:12px;">语音控制垃圾桶开关</span></p>

<p><span style="font-size:12px;">检测垃圾桶的满溢程度</span></p>

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

<div style="text-align: center;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;</p>

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

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

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

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

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

<p></p>

<p><br />
接下来就是把它上手玩起来。</p>

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

<p>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部署到自己的运营商板上。</p>

<p>双核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 &amp; I2C) 1 x SD卡接口(在董事会)]权力| 1 x直流接口(12 v / 2电源输入推荐)1 x USB类型- C键|1 x复位键1 x用户键1 x拨号码键|尺寸|56mm x 85mm| |工作温度|0~ 75℃|应用工业(can -以太网网关等)白色家电(冰箱、微波炉等)医疗(数据记录仪等)高端可穿戴设备(VR设备等)智能家居设备</p>

<h2>垃圾分类识别+舵机控制</h2>

<p>垃圾分类使用的开发板是K210</p>

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

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

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

<p>&nbsp;</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>识别控制</p>

<p>&nbsp;</p>

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

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

<h2><a id="_19"></a>语音控制</h2>

<p>语音控制</p>

<h2><a id="1_20"></a>ld3320语音模块控制垃圾桶的开关(也就是ld3320跟K210通信,K210控制舵机转动)</h2>

<p>ld3320跟K210通过UART串口通信</p>

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

<pre>
<code>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;</code></pre>

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

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

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

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

<p>以下为传感器数据读取的代码</p>

<pre>
<code>QString Ap3216c::readPsData()
{
    char const *filename = "/sys/class/misc/ap3216c/ps";
    int err = 0;
    int fd;
    char buf;

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

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

    QString psValue = buf;
    QStringList list = psValue.split("\n");
    return list;
}</code></pre>

<p><strong>四、图像获取以及传输(STM32MP157)(UDP)</strong></p>

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

<p><strong>在QT中使用UDP传输流程:</strong></p>

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

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

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

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

<p><strong>服务器端的代码</strong></p>

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

/* QByteArray类型 */
   QByteArray byte;

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

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

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

<p>客户端代码</p>

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

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


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

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

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

<p>源码链接:<a href="https://bbs.eeworld.com.cn/my/home.php?cur=myhome&amp;act=download" target="_blank">https://bbs.eeworld.com.cn/my/home.php?cur=myhome&amp;act=download</a></p>

<p>项目源码说明 &nbsp;</p>

<p> &nbsp;</p>

<p>五、作品功能演示视频</p>

<p>400c87126566c898a331d64ab3227628<br />
&nbsp;</p>

<p>六、项目总结</p>

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

<div><strong>​</strong></div>

<p><!--importdoc--></p>
页: [1]
查看完整版本: 【2024 DigiKey创意大赛】基于STM32MP157的智能垃圾桶