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

单位:江汉大学

指导老师:侍中楼 李巍

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

一、作品简介

1. 概述

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

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

1.1设计背景及意义

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

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

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

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

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

(2)特殊背景调研

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


arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox

人口老龄化

arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_02

老年人产业发展趋势

1.2设计方案

arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_03

2. 场景调研

2.1 市场调研

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

如下图所示:


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_04

触控式垃圾桶

arduino语音识别voiceBox arduino语音识别垃圾分类_机器人_05

感应开盖垃圾桶

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

2.2 比赛场地调研

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


arduino语音识别voiceBox arduino语音识别垃圾分类_开源_06

家用垃圾桶图

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

3.1创新点

① 自动打包套袋

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

② 箱盖设计

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

③ 智能管理

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

3.2 应用前景

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

4. 作品难点及解决方案

4.1垃圾箱主体的平稳移动

① 平稳移动的难点

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

② 平稳移动的解决方案

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


arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_07

四轮成面示意图

4.2 移动切断杆的顺滑移动

① 顺滑移动的难点

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_08

滑动连接件实物图

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


arduino语音识别voiceBox arduino语音识别垃圾分类_机器人_09

改进模型图

② 顺滑移动的解决方案

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


arduino语音识别voiceBox arduino语音识别垃圾分类_机器人_10

角码实物图

arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_11

安装示意图

4.3 垃圾箱内腔的密封

① 密封的难点

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


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_12

初始箱体实物图

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_13

最终箱体实物图

② 密封的解决方案

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


arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_14

橡胶垫密封图

arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_15

受力下压密封图

4.4 超声波测距避障

① 超声波测距避障的难点

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


arduino语音识别voiceBox arduino语音识别垃圾分类_机器人_16

超声波测距数值图

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

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

如下图所示。


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_17

改进后数据图

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

二、技术说明


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_18

技术路线示意图

1. 移动避障

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

1.1简单运动

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_19

底部示意图

1.2 自动避障

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

1.3 语音呼唤

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

2. 箱盖开合

2.1 投物

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_20

开小盖机构简图

arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_21

开小盖模型图

齿面弯矩强度计算:

      将盖子看成悬臂梁,重约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)箱盖的工作流程

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


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_22

开小盖流程图

arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_23

开小盖示意图

2.2 取袋

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_开源_24

开大盖机构简图

arduino语音识别voiceBox arduino语音识别垃圾分类_机器人_25

开大盖模型图

机械手弯矩强度计算:

      将盖子看成悬臂梁,重约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)箱盖的工作流程

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_26

开大盖流程图

arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_27

开大盖示意图

3. 打包套袋

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

3.1自动套袋

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_28

自动套袋流程图

气压传动真值表

Y

in(负压泵进气口)

out(负压泵出气口)

0

0

0

1

1

1

3.2 自动打包

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_开源_29

打包前机构示意图

arduino语音识别voiceBox arduino语音识别垃圾分类_arduino语音识别voiceBox_30

打包后机构示意图

4. 所用电子元件展示

4.1 距离测量传感器

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_31

距离测量传感器

4.2 人体红外感应电子模块

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_32

人体红外感应电子模块

4.3 语音识别模块

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_33

语音识别模块

4.4 超声波传感器

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_人工智能_34

超声波传感器

4.5 升压模块

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

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


arduino语音识别voiceBox arduino语音识别垃圾分类_舵机_35

升压模块

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语音识别voiceBox arduino语音识别垃圾分类_舵机_36

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;   //cm

  float minDistance;   //cm

  float offset; //cm

  float distance; //cm,

  int frequency;   //Hz

  int pin;

}SHARP;

SHARP Sharp = {150, 20, 0, 0, 20, A0};

//小盖子

Servo myservo_2;   // create servo object to control a servo

int pos = 0;    // variable to store the servo position

//检测垃圾是否满的超声波,以及大盖子的开关

#define ECHOPIN A12

#define TRIGPIN A13

#define red_ A14

#define green_ A15

int 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 A4

int 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 position

      if(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 degree

          myservo_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;

    }

  }  

}

//超声波控制led

int 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μs

  delayMicroseconds(2);

  digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10μs,这里是至少10μs

  delayMicroseconds(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.