香橙派 “智能垃圾分类识别垃圾桶” 代码示例

文章:OrangePi Zero2 全志H616 开发初探 🔗点此打开 智能垃圾分类识别垃圾桶代码示例

main.c 主函数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <wiringPi.h>
#include <pthread.h>

#include "serial.h"
#include "garbage.h"
#include "pwm.h"
#include "myoled.h"
#include "socket.h"

int serial_fd = -1;
pthread_cond_t cond;
pthread_mutex_t mutex;

/* 检查 process_name 进程是否存在、运行 */
static int detect_process(const char *process_name)
{
   
   
	int n = -1;
	FILE *strm;
	char buf[128]={
   
   0};
	
	sprintf(buf,"ps -ax | grep %s|grep -v grep", process_name);
	// 构造 ps -ax | grep process_name|grep -v grep 终端命令
	
	if((strm = popen(buf, "r")) != NULL)		// 使用 popen 执行 buf 命令
	{
   
   											// 返回值不为 -1 表明存在该进程
		if(fgets(buf, sizeof(buf), strm) != NULL)	// 取出输出的信息存放到 buf
		{
   
   
			printf("buf=%s\n",buf);		// 将信息打印出来
			n = atoi(buf);				// 取出进程 ID 号,因为输出的信息最前方就是进程 ID 号
			printf("n=%d\n",n);			// 打印进程 ID 号
		}
	}
	else		// 进程不存在
	{
   
   
		return -1;
	}
	
	pclose(strm);		// 关闭文件流
	return n;			// 返回进程 ID 号,不为 -1
}

/* 语音指令接收线程 */
void *pget_voice(void *arg)
{
   
   
	unsigned char buffer[6] = {
   
   0xAA, 0x55, 0x00, 0x00, 0X55, 0xAA};	// 初始化接收串口信息的内存空间
	int len = 0;
	printf("%s|%s|%d\n", __FILE__, __func__, __LINE__);		// 调试信息
	
	if (-1 == serial_fd)		// 串口打开失败
	{
   
   
		printf("%s|%s|%d: open serial failed\n", __FILE__, __func__, __LINE__);
		pthread_exit(0);
	}
	printf("%s|%s|%d\n", __FILE__, __func__, __LINE__);		// 调试信息
	
	while(1)
	{
   
   
		len = serialGetstring(serial_fd, buffer);		// 获取串口信息,语音模块发送的信息
		printf("%s|%s|%d, len=%d\n", __FILE__, __func__, __LINE__,len);		// 调试信息
		
		/* 语音模块识别到 “开始识别垃圾”,会向串口发送 0xAA 0x55 0x46 0x00 0x55 0xAA 的数据 */
		if (len > 0 && buffer[2] == 0x46)
		{
   
   
			printf("%s|%s|%d\n", __FILE__, __func__, __LINE__);		// 调试信息
			
			/* 
				与阿里云线程、网络指令接收线程的互斥条件
				一次只能通过一种方式(语音或网络)命令垃圾桶开启一次识别
				与网络指令接收线程互斥、与阿里云线程互为条件变量
			*/
			pthread_mutex_lock(&mutex);		 
			buffer[2] = 0x00;				// 初始化接收串口信息的内存空间
			pthread_cond_signal(&cond);		// 触发条件,唤醒 “阿里云垃圾分类识别” 线程
			pthread_mutex_unlock(&mutex);
		}
	}
	
	pthread_exit(0);		// 语音线程退出
}

/* 语音播报线程 */
void *psend_voice(void *arg)
{
   
   
	// 线程脱离,如果阿里云线程等待该线程退出,那么将失去创建该线程的意义
	pthread_detach(pthread_self());
	
	unsigned char *buffer = (unsigned char *)arg;
	
	if (-1 == serial_fd)		// 串口打开失败
	{
   
   
		printf("%s|%s|%d: open serial failed\n", __FILE__, __func__, __LINE__);
		pthread_exit(0);
	}
	
	if (NULL != buffer)		// 传递过来的参数不为空
	{
   
   
		serialSendstring(serial_fd, buffer, 6);
		// 向串口发送 buffer 数据,语音模块根据数据进行播报
	}
	
	pthread_exit(0);	// 线程退出
}

/* 垃圾桶开关控制线程 */
void *popen_trash_can(void *arg)
{
   
   
	// 线程脱离,如果阿里云线程等待该线程退出,那么将失去创建该线程的意义
	pthread_detach(pthread_self());
	
	unsigned char *buffer = (unsigned char *)arg;
	
	if (buffer[2] == 0x41 || buffer[2] == 0x42 || buffer[2] == 0x43)
	{
   
   	// 识别为干垃圾、湿垃圾、可回收垃圾,由于硬件模块数量有限,此处打开同一个垃圾桶盖

		printf("%s|%s|%d: buffer[2]=0x%x\n", __FILE__, __func__, __LINE__, buffer[2]);
		
		pwm_write(PWM_RECOVERABLE_GARBAGE);		// 打开垃圾桶
		delay(2000);							// 延时两秒
		pwm_stop(PWM_RECOVERABLE_GARBAGE);		// 关闭垃圾桶
	}
	else if (buffer[2] != 0x44)		// 识别为有害垃圾
	{
   
   

		printf("%s|%s|%d: buffer[2]=0x%x\n", __FILE__, __func__, __LINE__, buffer[2]);
		
		pwm_write(PWM_GARBAGE);		// 打开垃圾桶
		delay(2000);				// 延时两秒
		pwm_stop(PWM_GARBAGE
### 关于工创赛中使用香橙进行垃圾分类垃圾桶项目的开发资料 #### 使用香橙作为硬件平台的优势 香橙(Orange Pi)是一款基于ARM架构的单板计算机,具有成本低、性能强的特点,在嵌入式系统开发中有广泛应用。对于工创赛中的垃圾分类垃圾桶项目来说,香橙可以提供足够的计算能力来支持图像识别算法和其他必要的功能实现。 #### 图像识别技术的应用 为了使垃圾箱能够自动区分不同类型的废弃物并引导投放者正确分类,通常会采用机器视觉方法。这涉及到训练神经网络模型以识别各种物品类别,并将其部署到边缘设备上运行。由于香橙具备一定的GPU加速能力,因此非常适合执行此类任务[^1]。 #### 数据集准备与模型训练 构建有效的物体检测/分类器之前需要收集大量标注过的图片样本构成数据集;之后利用深度学习框架如TensorFlow Lite或PyTorch Mobile等工具完成本地化优化后的轻量化版本迁移至目标平台上测试验证效果如何。 #### 软件环境搭建指南 针对上述需求,开发者可能还需要安装一些额外软件包以及库文件以便顺利完成整个流程。例如OpenCV用于处理视频流输入输出操作,而Python则是编写应用程序的主要编程语言之一。具体步骤如下所示: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install python3-pip libopencv-dev build-essential cmake git pkg-config yasm checkinstall -y pip3 install opencv-python numpy tensorflow==2.5.0 # 安装所需依赖项 ``` #### 修改配置脚本示例 当完成了初步设置以后,则要着手调整底层驱动程序参数确保摄像头正常工作并且能获取清晰度较高的画面质量。编辑`sun50iw9.conf`文件内的相应选项即可满足这一目的[^2]: ```diff --- a/external/config/sources/families/sun50iw9.conf +++ b/external/config/sources/families/sun50iw9.conf @@ -1,7 +1,8 @@ CONFIG_VIDEOBUF2_DMA_CONTIG=y CONFIG_VIDEOBUF2_VMALLOC=m +# Enable camera support here. CONFIG_MEDIATEK_VCU=n CONFIG_SUNXI_CEDAR_VPU=y CONFIG_VIDEO_SUNXI_TVP514X=y ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~莘莘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值