机器人制作开源方案 | 随叫随到的智能垃圾桶

作者:卢智浩 尹宗岱 胡文珺 付文智 陈星

单位:江汉大学

指导老师:侍中楼 李巍

      本作品围绕探索者场景和应用主题,基于当今时代“智能家”的快速发展,智慧生活成为未来的一大发展趋势,因此我们设计了此款可移动式智能垃圾桶,同时增加了自动打包套袋功能,提高了人们生活的舒适度。为达到使用需求,在机械结构设计方面,本作品设计了齿轮传动、负压传动、摆动导杆、安装热熔杆等方式,从而实现开盖和自动打包套袋功能;同时运用了语音交互技术实现了人机交互功能,并能自动避障巡航移动。该设计作品是一款典型的机电融合产品,是机械设计制造、电子控制的综合应用体现,不仅可以通过人机交互系统实现垃圾桶的自动巡航移动,而且还能够自动打包套袋,在未来具有良好的市场前景。

一、作品简介

1. 概述

      通过对2022年国际青年人工智能大赛--探索者创新设计项目主题--机器人场景和应用的思考,并结合日常生活和市场调研,我们发现目前家用垃圾桶只存在于固定位置,而且还需要人工去打包套袋,既不方便也不卫生,基于以上内容我们设计了此款智能垃圾桶,以提高人类生活舒适度。

      本作品主要由打包套袋、语音呼唤和红外避障三个功能模块组成,由探索者套件为主体拼装而成,主要为铝型材框架结构,结合日常目前只设计了这三种功能,后续可根据需求继续改善。本作品源于生活的实际需求,围绕大赛机器人的场景和应用进行设计,符合实际、有效可行、市场适应性强。

1.1设计背景及意义

(1)国内外研究现状及意义

      在国外智能垃圾箱研究脉络中,2006年初步意识到废电池、废玻璃的回收利用;2007年开始探悉射频技术在垃圾箱上的应用;2014年开始展开对垃圾智能回收相关算法的初步探索;2016年转向单片机、物联网研究;而国内于2000年时开始研究垃圾箱智能化系统;2009年初步探索全自动智能垃圾分类机;2015年开始关注智能分类垃圾箱的探索;2016年、2017年拓宽智能分类的研究思路,从多角度分析智能垃圾箱的优化及改造并持续至今。

      自2019年我国正式实施、推广垃圾分类以来,智能垃圾桶运用于垃圾分类领域的进程明显加快,大大缓解了我国分类垃圾桶只是贴有标签的普通垃圾桶,需人为识别垃圾种类,垃圾分类投放的正确率较低的问题。近年来我国相关科研、专业人员就智能垃圾桶应用于垃圾分类提出了软件、硬件方面的技术性解决方案。

      对比国内外智能垃圾箱研究脉络,整体而言,国内外智能垃圾箱发展思路大致无异。国外是以射频技术打开智能垃圾箱的探索局面,而国内自始至终都在尝试解决垃圾分类问题。国内智能垃圾箱的设计较多局限于功能性的研究,尝试使用功能改变行为,较少考虑产品的交互性和用户友好层面的设计,而国外学者在关注上述问题的同时也尝试通过行为改变垃圾投放者的意识。

      然而,国内外的智能垃圾桶目前大多只停留在解决室外垃圾分类的问题,而忽视了针对智慧生活方面基于人类家居生活的智能垃圾桶方面的研究,因此如何去使人们的生活变得更加便捷是我们设计的初衷。

(2)特殊背景调研

      当今中国人口老龄化是一个普遍的社会现象,我国对老年人产业的投入也在逐年递增, 老年人消费群体体量也在逐步扩大,我们设计的这款垃圾桶也可以很好地服务于老年人的日常生活中,在未来会有着极好的发展前景

人口老龄化
老年人产业发展趋势

1.2设计方案

2. 场景调研

2.1 市场调研

      通过对市面上已有的家用垃圾桶进行调查,发现大部分垃圾桶的智能化只停留在自动感应开关盖的层面,它们的功能仍不够完善。

如下图所示:

触控式垃圾桶
感应开盖垃圾桶

      经对比后可明显看出,目前市面上缺乏一种能够移动并自动打包套袋的智能化垃圾桶,因此如果能设计出这样一款工作高效、便捷的移动式垃圾桶将有着良好的市场应用前景。

2.2 比赛场地调研

      在当今社会中,一般家庭中的垃圾桶数量可到四至五个,而我们日常对垃圾桶并没有达到如此庞大的需求量,每个垃圾桶又需要套袋和人工打包,不仅造成较大的铺张浪费而且还费时费力;同时目前市面上家用的智能垃圾桶仍然无法自行移动,只存在于一个特定的位置,且造价昂贵,人为移动较为困难,难以适应复杂的家居条件。

家用垃圾桶图

3. 作品创新点及应用前景

3.1创新点

① 自动打包套袋

      设计新型剪切机构,可连续对垃圾袋进行剪切封口,使之具有更安全、更卫生的设计。同时垃圾箱外设有气压传动回路,使垃圾袋上下产生压力差,上面压力大,箱内压力小,从而将垃圾袋压入垃圾箱内,实现自动套袋的功能。

② 箱盖设计

      垃圾箱开盖投物处,采用齿轮设计达到开盖动作平滑、流畅、及时的目的。开盖取袋处,采用摆动导杆机构,以双舵机作为动力源,使开盖取袋更加安全、平稳。

③ 智能管理

      垃圾桶内部加入电控模块以便更好地对垃圾桶自身进行智能管理和远程操作。同时采用语音识别模块和红外模块,能够对垃圾箱进行呼唤使其移动到相应位置。

3.2 应用前景

      本作品设计结构紧凑,可适用于普通居民家庭,对生活垃圾清点和整理,解决了当前社会上垃圾收集基本依赖于人工,耗费大量人力,时间成本高,效率低下的问题,同时结合人机交互系统, 实现了手机端对垃圾箱的远程通信和控制功能。作为未来智能家居的一个有机组成部分,该产品的设计开发不仅可以为人类提供生活上的便利,而且具有极强的市场应用及推广前景。在实际应用过程中,该设计作品仍存在语音识别易受环境噪声干扰等问题,未来需进一步改进。在将来的应用中,可以构建对智能垃圾桶的数据分析系统,对垃圾投放情况进行数据统计分析,为垃圾收集整理工作提供更加便捷、智能化的服务,而且更加卫生安全,有着良好的市场前景。

4. 作品难点及解决方案

4.1垃圾箱主体的平稳移动

① 平稳移动的难点

      最初,我们采用四个减速电机作为动力源,发现会增加垃圾桶运动方向的控制难度。同时,由于垃圾桶自身的重量会导致电机的输出轴和地面无法保持平行,无形中又增加了运动的不平稳性。

② 平稳移动的解决方案

      最终,我们留下垃圾桶底部后方的两个减速电机作为动力源,降低了垃圾桶运动方向的控制难度,并在动力源中间和垃圾桶底部正前方各加上一个牛眼万向轮作为支撑,防止出现电机的输出轴与地面不平行的现象,“四轮成面”使运动更加稳定。具体结构如下图所示:

四轮成面示意图

4.2 移动切断杆的顺滑移动

① 顺滑移动的难点

      最初,我们采用的是3D打印件结合光杆螺栓而成的滑动连接件(如下图所示),在铝型材的梯形槽内往复运动从而实现移动切断杆将垃圾袋聚拢到电热丝所在位点的作用。后来发现滑动连接件由于和梯形槽之间的配合度不够导致每次移动时都会在梯形槽内产生具有方向性的力从而导致切断杆锁死,无法将垃圾袋聚拢或无法正常返回到初始位置。

滑动连接件实物图

      因此,我们通过sw三维建模设计出与梯型槽完全配合的连接件(如下图所示),经过实践发现与梯型槽摩擦力过大导致其产生自锁现象,无法移动。

改进模型图

② 顺滑移动的解决方案

      在经过多次尝试之后,我们最终采用了能够在梯形槽内顺滑移动且不会产生锁死现象的零件--角码,再结合3D打印件与移动切断杆相连接,最终避免了切断杆移动时自锁现象的发生。具体结构如下:

角码实物图
安装示意图

4.3 垃圾箱内腔的密封

① 密封的难点

      最初,我们采用的是用瓦楞纸板制作而成的箱体(如下图所示),由于纸板本身存在许多肉眼不可见的间隙,再加上剪裁时的精准度不高,在理论上完全密封的情况下仍无法使垃圾袋通过压差正常套袋。

初始箱体实物图

      之后,我们采用亚克力板制作而成的箱体(如下图所示),通过热熔胶密封,在关盖之后气密性显著提高,但仍达不到预期效果。

最终箱体实物图

② 密封的解决方案

      最终,我们在用热熔胶密封亚克力板的基础上,在上盖与箱体接触面上安装一圈密封橡胶垫,并控制抬升舵机在最初时给上盖一个向下的作用力,进一步提高了密封的效果,实现了垃圾袋自动套袋的目标。

橡胶垫密封图
受力下压密封图

4.4 超声波测距避障

① 超声波测距避障的难点

      起初运用超声波进行测距避障,在测距避障过程中出现了0.00cm情况(如下图所示),在实际情况中几乎不可能出现,在反复确认零部件没有问题之后,发现程序出现问题需修改。在实际测试时,发现避障并不能更好的实现,当超声波检测到距离时,不能按照我们预想的方向去避障。

超声波测距数值图

② 超声波测距避障的解决方案

      我们通过不断的测试,发现在每次测距时,都需要有一个延时来给下一个超声波的发出和接受提供时间,解决了出现0.00cm的问题。

如下图所示。

改进后数据图

      同时在超声波下面安装了舵机,当距离到达预设值时,舵机会带动超声波左右转动,通过比较两边的长度,选择障碍物较远的那一边转弯,实现避障。

二、技术说明

技术路线示意图

1. 移动避障

      智能垃圾桶的运动是本作品的基础内容,整个垃圾桶的运动过程可分为:识别声音、开始运动、自动避障。

1.1简单运动

      整个垃圾桶是依靠两个驱动轮加两个牛眼万向轮实现运动和转向的,两个后轮是驱动轮,通过控制两后轮的转速形成转速差从而实现转向功能;两个牛眼万向轮是起支撑和传递运动的作用,使垃圾桶平稳运动。具体结构如下图所示:

底部示意图

1.2 自动避障

      采用超声波技术,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。将超声波与电机结合,转动检测周围障碍物进行判断,通过接收到的超声波反馈信号给两个后轮,改变两轮转速,使目的方向一侧的转速减小从而实现避障的功能,使垃圾桶更加智能。

1.3 语音呼唤

      采用了基于helios-adsp新一代中大词汇语音识别协处理方案的语音识别专用芯片HBR740,非特定人语音识别技术可对用户的语音进行识别,支持中文音素识别,可任意指定中文识别词条(小于8个汉字),单次识别可支持1000条以上的语音命令,安静环境下,标准普通话,识别率大于95%,可自动检测环境噪声,噪声环境下也能保证较好的识别率。

2. 箱盖开合

2.1 投物

(1)箱盖开合可行性分析

小箱盖零部件:一个M01标准舵机、主动和从动齿轮各一个、小盖子。

开小盖机构简图
开小盖模型图

齿面弯矩强度计算:

      将盖子看成悬臂梁,重约G=mg=0.05*10N=0.5N,力臂b=19cm,M01标准舵机最大扭矩Tmax=2.2kg·cm=22N·cm,主动齿轮齿数Z1=30,从动齿轮齿数Z2=16。

      扭矩的校核:盖子在最低端时,舵机臂受力是最大的,此时扭矩也最大,故取这一点进行计算即可:

      由1个舵机臂支撑则:

      F=G=0.5N

      T=F*b=0.5*19N·cm=9.5N·cm

      T 出 max=T 入 max*Z2/Z1=22*16/30N·cm=11.7N·cm

      则:T<T 出 max,故舵机能够提供相应扭矩,符合要求

      自由度的校核:P=3N-2L-H,其中P为自由度、N为机构数、L为低幅数、H为高幅数。则P=3*2-2*2-1=1,合理。

      综上所述,小箱盖可以正常开合。

(2)箱盖的工作流程

      小箱盖的设计是为了将垃圾桶封闭防止像家用传统垃圾桶那样造成异味扩散,具体的流程图如下所示:

开小盖流程图
开小盖示意图

2.2 取袋

(1)箱盖开合可行性分析

① 大箱盖零部件:两个M01标准舵机、两个舵机臂、大盖子。

开大盖机构简图
开大盖模型图

机械手弯矩强度计算:

      将盖子看成悬臂梁,重约G=mg=0.4*10N=4N,力臂a=8.5cm,M01标准舵机最大扭矩Tmax=2.2kg·cm=22N·cm

      扭矩校核:盖子在最低端时,舵机臂受力是最大的,此时扭矩也最大,故取这一点进行计算即可:

      由两个舵机臂支撑则:

      F1=F2=1/2*G=2N

      T=F1*a=2*8.5N·cm=17N·cm

      则:T<Tmax,故舵机能够提供相应扭矩,符合要求。

      自由度的校核:P=3N-2L-H,其中P为自由度、N为机构数、L为低幅数、H为高幅数。

      则 P=3*3-2*(3+1)-0=1,合理。

      综上所述,大箱盖可以正常开合。

(2)箱盖的工作流程

      大箱盖的设计是为了方便用户将打包好的垃圾袋取出,具体流程图如下所示:

开大盖流程图
开大盖示意图

3. 打包套袋

     自动套袋的执行机构采用负压泵产生气压差实现运动过程,其传动机构就是一整套气压回路装置,动力源是气泵。自动打包的执行机构是夹持杆和电热丝,其传动机构是环式的同步带传动,动力源是电机。

3.1自动套袋

     自动套袋功能:通过气压回路传动装置、垃圾袋收纳盒以及负压泵结合实现,具体流程为当人取走已打包好的垃圾并盖上箱盖后负压泵自动启动,抽走垃圾箱内部的空气,实现垃圾桶的自动套袋。流程图如下所示:

自动套袋流程图

气压传动真值表

Y

in(负压泵进气口)

out(负压泵出气口)

0

0

0

1

1

1

 3.2 自动打包

     剪切熔断装置的功能是将打包好的垃圾袋封口,等待自动打包动作结束后,垃圾箱盖自动开口,方便用户提取垃圾。

     当垃圾装满后,通过电机驱动同步带动X方向切断杆(如下图初始状态)和Y方向切断杆相对运动,最后垃圾袋被挤压到箱体角落后被箱体角落安装的电热丝熔断,形成新的封口端,装满垃圾的部分同时被封口,可以直接取出,具备很好的实用性。

打包前机构示意图
打包后机构示意图

4. 所用电子元件展示

4.1 距离测量传感器

      GP2Y0A02YK0F是由PSD(位置灵敏探测器)、IRED(红外发射二极管)和信号处理电路集成而成的测距传感器单元。由于采用三角测量方法,物体反射率的变化、环境温度和工作时间对距离检测不易产生影响,该装置输出与探测距离相对应的电压,所以这个传感器也可以用作接近传感器。

      在智能垃圾桶中该传感器用于测量人手与垃圾桶口的距离,以便在人手接近桶口去丢垃圾时及时打开垃圾桶桶盖。

距离测量传感器

4.2 人体红外感应电子模块

      HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口LHI778探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备。

      在智能垃圾桶中该模块用于检测人体位置,以便准确到达人体附近。

人体红外感应电子模块

4.3 语音识别模块

      LD3320芯片上集成了高精度的A/D和D/A接口,不再需要外接辅助的Flash和RAM,即可以实现语音识别/声控/人机对话功能。并且识别的关键词语列表是可以动态编辑的。基于LD3320,可以在任何的电子产品中,甚至包括最简单的51作为主控芯片的系统中,轻松实现语音识别/声控/人机对话功能。

      在智能垃圾桶中该模块用于进行人桶交互。

语音识别模块

4.4 超声波传感器

      HC-SR04超声波传感器配有超声波发射器和接收器模块,使用声纳来确定物体的距离,就像蝙蝠一样。它提供了非常好的非接触范围检测,准确度高,读数稳定,易于使用,其操作不受阳光或黑色材料的影响。

      在智能垃圾桶中该传感器用于使垃圾桶避开各种障碍物。

超声波传感器

4.5 升压模块

      DC-DC可调升降压电源模块可以改变输出电压的模块,通过扭动模块上的微调电位器,实现调整输出电压的大小。

      在智能垃圾桶中该模块用于调节电压大小,使电源电压满足气泵工作电压的要求。

升压模块

4.6 控制核心

      Arduino Mega 2560是基于ATmega2560的主控开发板,Arduino Mega2560是采用USB接口的核心电路板,具有54路数字输入输出,适合需要大量IO接口的设计。处理器核心是ATmega2560,同时具有54路数字输入/输出口,16路模拟输入,4路UART 接口,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header和一个复位按钮。板上有支持一个主控板的所有资源,Arduino Mega2560也能兼容为Arduino NUO设计的扩展板。可以自动选择3种供电方式:外部直流电源通过电源插座供电;电池连接电源连接器的GND和VIN引脚;USB接口直流供电。

      在智能垃圾桶中该控制核心用于控制各种元件以便满足智能垃圾桶的设计要求。

Arduino Mega 2560 控制板

三、程序代码

1. 示例程序

#include <Servo.h>//语音#include <ld3320.h>                      //LD3320语音识别模块的头文件VoiceRecognition Voice;                     //声明一个语音识别对象//人体感应int irSensor = 8;//继电器int relayPin = 13;//红外float distance[14] = {20, 30, 40, 50, 60, 70, 80, 90, 100,   110,   120,   130,   140,   150};float voltage[14] = {2.5, 2, 1.55, 1.25, 1.1, 0.85, 0.8, 0.73, 0.7, 0.65, 0.6, 0.5, 0.45, 0.4};int i=0;typedef struct {float maxDistance;   //cmfloat minDistance;   //cmfloat offset; //cmfloat distance; //cm,int frequency;   //Hzint pin;}SHARP;SHARP Sharp = {150, 20, 0, 0, 20, A0};//小盖子Servo myservo_2;   // create servo object to control a servoint pos = 0;    // variable to store the servo position//检测垃圾是否满的超声波,以及大盖子的开关#define ECHOPIN A12#define TRIGPIN A13#define red_ A14#define green_ A15int get_dis;char serial_data;int k = 0;Servo myservo_3;  Servo myservo_4;int pos_ = 0;   int pos_1=95;#define red A5#define green A4int wheel_R_1 = 5;  int wheel_R_2 = 6;int wheel_L_1 = 9;  int wheel_L_2 = 10;Servo myServo;   //舵机int inputPin=16;   // 定义超声波信号接收接口int outputPin=17;   // 定义超声波信号发出接口void setup() {//继电器pinMode(relayPin, OUTPUT);digitalWrite(relayPin, HIGH);delay(10000);digitalWrite(relayPin, LOW);//语音Voice.init();                               //初始化VoiceRecognition模块Voice.noiseTime(0x10);                      //上电噪声略过Voice.micVol(0x30);                         //调整ADC增益Voice.voiceMaxLength(0x14);                 //最长语音段时间Voice.addCommand("wo shi",0);             //"开"添加指令Voice.addCommand("wei sheng jian",1);  Voice.addCommand("ke ting",2);         Voice.addCommand("diu wan le",3);Voice.addCommand("hui qu",4);   Voice.start();//检测垃圾是否满的超声波、led,开大盖子pinMode(ECHOPIN, INPUT);pinMode(TRIGPIN, OUTPUT);pinMode(red_, OUTPUT);pinMode(green_, OUTPUT);myservo_4.attach(32);myservo_3.attach(34);  //人体感应pinMode(LED_BUILTIN, OUTPUT); //连接内置LED的引脚设置为输出模式pinMode(irSensor, INPUT);     //连接人体红外感应模块的OUT引脚设置为输入模式                           //开始识别// 配置所有控制轮的引脚为输出pinMode(wheel_L_1, OUTPUT);pinMode(wheel_L_2, OUTPUT);pinMode(wheel_R_1, OUTPUT);pinMode(wheel_R_2, OUTPUT);//内部电机pinMode(24,OUTPUT);pinMode(25,OUTPUT);pinMode(26,OUTPUT);pinMode(28,OUTPUT);//舵机引脚初始化myServo.attach(7);myservo_2.attach(4);  pinMode(inputPin, INPUT);pinMode(outputPin, OUTPUT);pinMode(red, OUTPUT);pinMode(green, OUTPUT);myServo.write(90);// put your setup code here, to run once:}void loop() {digitalWrite(green, 1);digitalWrite(green_, 1);recognise();feel();open_small();get_dis = measure();control_led(get_dis);// put your main code here, to run repeatedly:}void avoidance(){int pos;int dis[3];//距离myServo.write(90);move_ahead();dis[1]=getDistance(); //中间if(dis[1]<30){stop();for(pos = 90; pos <= 150; pos += 1){myServo.write(pos);              // tell servo to go to position in variable 'pos'delay(15);                       // waits 15ms for the servo to reach the position}dis[2]=getDistance(); //左边for (pos = 150; pos >= 30; pos -= 1){myServo.write(pos);              // tell servo to go to position in variable 'pos'delay(15);                       // waits 15ms for the servo to reach the positionif(pos==90)dis[1]=getDistance(); //中间}dis[0]=getDistance();   //右边for (pos = 30; pos <= 90; pos += 1){myServo.write(pos);              // tell servo to go to position in variable 'pos'delay(15);                       // waits 15ms for the servo to reach the position}if(dis[0]<dis[2]) //右边距离障碍的距离比左边近{//左转turn_left();delay(500);}else   //右边距离障碍的距离比左边远{//右转turn_right();delay(500);}}}// 定义直行函数void move_ahead(){digitalWrite( wheel_L_1, HIGH);digitalWrite( wheel_L_2, LOW);digitalWrite( wheel_R_1, HIGH);digitalWrite( wheel_R_2, LOW);}// 定义后退函数void move_backwards(){digitalWrite( wheel_L_1, LOW);digitalWrite( wheel_L_2, HIGH);digitalWrite( wheel_R_1, LOW);digitalWrite( wheel_R_2, HIGH);}// 定义右转函数void turn_right(){digitalWrite( wheel_L_1, LOW);digitalWrite( wheel_L_2, LOW);digitalWrite( wheel_R_1, HIGH);digitalWrite( wheel_R_2, LOW);}// 定义左转函数void   turn_left(){digitalWrite( wheel_L_1, HIGH);digitalWrite( wheel_L_2, LOW);digitalWrite( wheel_R_1, LOW);digitalWrite( wheel_R_2, LOW);}void stop(){digitalWrite( wheel_L_1, LOW);digitalWrite( wheel_L_2, LOW);digitalWrite( wheel_R_1, LOW);digitalWrite( wheel_R_2, LOW);}//语音识别void recognise(){   switch(Voice.read())                          //判断识别{case 0:avoidance();                                     //若是指令“kai deng”         break;case 1:   avoidance();                                  //若是指令“guan deng”               break;case 2:avoidance();                     break;case 3:avoidance();                   break;case 4:avoidance();                   break;default:break;}}//人体感应void feel(){bool sensorReading = digitalRead(irSensor);   //建立变量存储感应模块的输出信号if ( sensorReading ) {stop();   // 模块感应到人.输出高电平.点亮LED}}//红外开关小盖子void getDistance_(SHARP* Sharp) {float v = analogRead(Sharp->pin);v = v / 1024.0 * 5;int index = 0;for(index = 0; index < 14; index++) {if(v >= voltage[index]) {break;}}if(index == 0) {Sharp->distance = 20;} else if(index == 14) {Sharp->distance = 150;} else {Sharp->distance = map(v, voltage[index], voltage[index-1], distance[index], distance[index-1]);}}//控制关小盖void close(){for(pos = 10; pos < 70; pos += 1)   // goes from 0 degrees to 180 degrees{                                  // in steps of 1 degreemyservo_2.write(pos);              // tell servo to go to position in variable 'pos'delay(15);                       // waits 15ms for the servo to reach the position}}//控制开小盖void open(){for(pos = 70; pos>=10; pos-=1)     // goes from 180 degrees to 0 degrees{                               myservo_2.write(pos);              // tell servo to go to position in variable 'pos'delay(10);                       // waits 15ms for the servo to reach the position}}//红外开小盖子综合void open_small(){static unsigned long lastTime = millis();if(millis() - lastTime > 1000/Sharp.frequency) {lastTime = millis();getDistance_(&Sharp);// Serial.println(Sharp.distance);if(Sharp.distance<=50)i++;if(i>=20){//Serial.println("检测到20次,开盖");open();delay(8000);close();i=0;}}  }//超声波控制ledint measure(){digitalWrite(TRIGPIN, LOW);delayMicroseconds(2);digitalWrite(TRIGPIN, HIGH);delayMicroseconds(10);digitalWrite(TRIGPIN, LOW);float distance_ = pulseIn(ECHOPIN, HIGH);distance_= distance_/58;Serial.println(distance_);delay(100);return distance_;}void control_led(int dis){if(dis > 10){i++;if(i>20){come(26,28,500);come(24,25,620);           //电机闭合delay(5000);back(24,25,550);back(26,28,500);           //电机打开Open();                    //开大盖子delay(5000);Close();                   //关大盖子digitalWrite(relayPin, HIGH);   //继电极运行,开始抽气套袋delay(10000);digitalWrite(relayPin, LOW);}digitalWrite(red_, 0);}else{     digitalWrite(red, 1);delay(500);digitalWrite(red, 0);}}//内部电机前行void come(int pin_1,int pin_2,int mode){digitalWrite(pin_1,HIGH);digitalWrite(pin_2,LOW);delay(mode);digitalWrite(pin_1,LOW);digitalWrite(pin_2,LOW);}//内部电机后退void back(int pin_3,int pin_4,int mode_1){digitalWrite(pin_3,LOW);digitalWrite(pin_4,HIGH);delay(mode_1);digitalWrite(pin_3,LOW);digitalWrite(pin_4,LOW);}//控制开大盖void Open(){for(pos_ = 13; pos_ < 100; pos_ += 1){         pos_1--;                     myservo_3.write(pos_);myservo_4.write(pos_1);           delay(15);                   }}//控制关大 盖void Close(){for(pos_ = 100; pos_>=13; pos_-=1)     {   pos_1++;                             myservo_3.write(pos_);myservo_4.write(pos_1);             delay(15);                       }}//避障int getDistance(){digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2μsdelayMicroseconds(2);digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μsdelayMicroseconds(10);digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平float distance = pulseIn(inputPin, HIGH); // 读出脉冲时间distance= distance/58; // 将脉冲时间转化为距离(单位:厘米)// Serial.println(distance); //输出距离值delay(100);if (distance >=30){  //如果距离da于30厘米返回数据digitalWrite(red, 0);}//如果距离小于30厘米小灯熄灭else{digitalWrite(red, 1);}return distance;}

 2. 资料下载

 资料内容:

①程序源代码

②样机三维文件

资料下载地址:随叫随到的智能垃圾桶

四、参考文献

[1]刘鹏,伍玲玲,邹行宇,张宇涵,侍中楼,徐伟.基于语音交互功能的智能分类垃圾箱[J].中国新技术新产品 2020(19):12-16.DOI:10.13612/j.cnki.cntp.2020.19.003.18·

[2]徐伟,刘鹏,鲍威尔,赵随钦,刘文杰,刘姣,左心月,杨璐瑶. 一种垃圾分类用自动打包套袋垃圾桶[P]. 湖北省:CN211495438U,2020-09-15.

[3]徐伟,刘鹏,鲍威尔,赵随钦,刘文杰,刘姣,左心月,杨璐瑶. 一种垃圾分类用自动打包套袋垃圾桶[P]. 湖北省:CN111169840A,2020-05-19.

[4]刘珂,刁鹏飞,陈颖,胡海洋,田洪岳,蒋顺勇.一种新型智能垃圾桶的设计[J].科技创新与生产力,2022(10):92-94.

[5]陈铎,卢元烁,张幽彤.语音控制智能垃圾桶设计[J].电子技术与软件工程,2022(16):95-98.

[6]徐瑞超,线晨,胡艳凯,田雨露,郭乐乐.基于多传感器的智能垃圾桶[J].装备机械,2021(04):42-44.

[7]唐文扬,周英杰,余奔星.一种自动套袋打包的新型智能垃圾桶[J].数字技术与应用,2021,39(07):132-134.DOI:10.19695/j.cnki.cn12-136.2021.097.

[8]葛晓彤,陈西凝,孙涵,陈雨晴,柳昌林.智能垃圾桶的设计[J].现代工业经济和信息化,2018,8(16):38-39.DOI:10.16525/j.cnki.14-1362/n.2018.16.16.

[9]贾博文.室内智能垃圾桶设计[J].电子技术与软件工程,2018(23):95.

[10]陈龙,凌利,钟学洋,杨华勇.基于 WiFi 的新型智能垃圾桶设计[J].软件导刊,2018,17(09):171-174.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【刷题】蓝桥杯

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法&#xff0c;x y2 − z2&#xff08;yz)(y-z) 即xa*b&#xff0c;ayz&#xff0c;by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是&#xff08;r-l&#xff09;*x&am…

【深度学习实验】线性模型(二):使用NumPy实现线性模型:梯度下降法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 初始化参数 2. 线性模型 linear_model 3. 损失函数loss_function 4. 梯度计算函数compute_gradients 5. 梯度下降函数gradient_descent 6. 调用函数 一、实验介绍 使用Nu…

只需4步使用Redis缓存优化Node.js应用

介绍 通过API获取数据时&#xff0c;会向服务器发出网络请求&#xff0c;收到响应数据。但是&#xff0c;此过程可能非常耗时&#xff0c;并且可能会导致程序响应时间变慢。 我们使用缓存来解决这个问题&#xff0c;客户端程序首先向API发送请求&#xff0c;将返回的数据存储…

文档丢失怎么找回?学会这3个方法就足够!

场景1&#xff1a;“不是吧&#xff01;我辛辛苦苦写的文档好像忘记保存就退出了&#xff01;谁能救救我&#xff01;帮我找回丢失的文档&#xff1f;” 场景2&#xff1a;“电脑里的文档太多了&#xff0c;每次在清理时都容易误删。有什么方法可以找回我丢失的文档吗&#xff…

成集云 | 用友T+集成聚水潭ERP(用友T+主管库存)| 解决方案

源系统成集云目标系统 方案介绍 用友T是一款由用友畅捷通推出的新型互联网企业管理系统&#xff0c;它主要满足成长型小微企业对其灵活业务流程的管控需求&#xff0c;并重点解决往来业务管理、订单跟踪、资金、库存等管理难题。 聚水潭是一款以SaaS ERP为核心&#xff0c;集…

嵌入式笔试面试刷题(day15)

文章目录 前言一、Linux中的主设备号和次设备号1.查看方法2.主设备号和次设备号的作用 二、软件IIC和硬件IIC的区别三、变量的声明和定义区别四、static在C和C中的区别五、串口总线空闲时候的电平状态总结 前言 本篇文章继续讲解嵌入式笔试面试刷题&#xff0c;希望大家坚持跟…

pgzrun 拼图游戏制作过程详解(10)

10. 拼图游戏继续升级——多关卡拼图 初始化列表Photos用来储存拼图文件名&#xff0c;Photo_ID用来统计当下是第几张拼图&#xff0c;Squares储存当下拼图的24张小拼图的文件名&#xff0c;Gird储存当下窗口上显示的24个小拼图及坐标。 Photos["girl_","boy_…

基于Java+SpringBoot+Vue+Element的OA系统的设计和实现

基于JavaSpringBootVueElement的OA系统的设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的…

AI写作工具,智能ai写作工具

在信息化时代&#xff0c;内容创作已经成为了许多行业的核心。从营销广告到新闻报道&#xff0c;从博客文章到学术论文&#xff0c;人们需要不断地产生高质量的文字内容。创作是一项耗时耗力的工作&#xff0c;需要丰富的知识和创造性思维。 AI写作工具&#xff0c;是一类基于人…

基于Spring Boot的医院预约挂号系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

SAP ABAP基础知识 访问外部数据库-开发篇

前言 本文主要介绍通过ABAP语言访问外部数据库的几种方式 一、外部数据库配置 本文示例中的代码访问了两个外部数据库 MTD : 外部oracle数据库,其中示例表 ZTTEMP 字段( ZZTNO,WERKS) S4Q : 外部HANA数据库(开发系统访问测试系统的数据库), 使用表USR02,ZTTEMP 二、ABAP访问…

IDEA(2023)解决运行乱码问题

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

【计算机组成原理】读书笔记第三期:内存和磁盘的关系

目录 写在开头 内存与磁盘的关系 基本关系 磁盘缓存 虚拟内存 节约内存的编程方法 通过DLL文件实现函数共有 通过调用_stdcall来降低文件程序的大小 磁盘的物理结构 结尾 写在开头 本文继续阅读总结《程序是怎样跑起来的》这本书&#xff08;作者&#xff1a;矢泽…

操作系统(5-7分)

内容概述 进程管理 进程的状态 前驱图 同步和互斥 PV操作&#xff08;难点&#xff09; PV操作由P操作原语和V操作原语组成&#xff08;原语是不可中断的过程&#xff09;&#xff0c;对信号量进行操作&#xff0c;具体定义如下&#xff1a; P&#xff08;S&#xff09;&#…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

SpringMVC之JSR303与拦截器

目录 一.JSR303 1.什么是JSR303 2.为什么使用JSR303 3.JSR303常用注解 4.快速入门 4.1导入Maven依赖 4.2 配置校验规则 4.3 对服务端数据添加进行校验 4.4 结果测试 二.拦截器 1.什么是拦截器 2.拦截器与过滤器 3.应用场景 4.基本拦截器配置 5 案例演示&#xff0…

区块链实验室(23) - FISCO中PBFT耗时与流量特征

前面的实验(区块链实验室(11) - PBFT耗时与流量特征)用仿真的PBFT观察耗时。现在用真实的Fisco网络再次观察其特征。同样地&#xff0c;用相同的网络&#xff0c;即100个节点构成的无标度网络。在每个节点上发起10次交易&#xff0c;记录每次交易的耗时。结果见下图所示。 前半…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型&#xff08;pygame&#xff09;&#xff0c;但是我是使用 SSH 连接的&#xff0c;不能很好的显示模型训练的效果画面&#xff0c;所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注&#xff1a;我们…

Postman —— HTTP请求基础组成部分

一般来说&#xff0c;所有的HTTP Request都有最基础的4个部分组成&#xff1a;URL、 Method、 Headers和body。 &#xff08;1&#xff09;Method 要选择Request的Method是很简单的&#xff0c;Postman支持所有的请求方式。 &#xff08;2&#xff09;URL 要组装一条Request…

华为HCIA(五)

Vlan id 在802.1Q中 高级ACL不能匹配用户名和源MAC 2.4G频段被分为14个交叠的&#xff0c;错列的20MHz信道&#xff0c;信道编码从1到14&#xff0c;邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设备异常发生时会发送trap报文 D类地址是…