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

news2024/12/24 21:27:52

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

单位:江汉大学

指导老师:侍中楼 李巍

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

一、作品简介

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

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

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

相关文章

基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)

Stream流 Stream流1.体验Stream流2.Stream流的常见生成方式3.Stream流中间操作方法4.Stream流终结操作方法5.Stream流的收集操作6.Stream流综合练习 Stream流 1.体验Stream流 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中…

GO-日志分析

GO-日志分析 log包简介 Go提供了logger包来做日志记录。使用方式如下所示 package mainimport ("log""os" )func main() {// 创建一个新的日志文件.默认是stdOutfile, err : os.Create("app.log")if err ! nil {log.Fatal(err)}defer file.Cl…

Linux系统远程访问另一台Windows系统的解决方案

SSH方法 在windows上安装openssh server&#xff0c;在 linux上安装openssh。通常linux会自带openssh&#xff0c;故这里只讲解windows上安装openssh server的方法 1、检查openssh server是否存在 以管理员身份进入Powershell&#xff0c;输入以下命令 Get-WindowsCapabili…

Win10、Win11家庭版开启远程桌面

Win11家庭版开启远程桌面 在windows家庭版中&#xff0c;是不提供远程桌面服务的&#xff0c;你没有办法使用远程桌面连接到windows家庭版中。当然&#xff0c; 你可用升级windows 版本到专业版&#xff0c;这样就可用享受到windows自带的远程桌面服务了。 我的电脑是win11家庭…

【Linux基础】第27讲:Linux查找和过滤命令(二)——grep命令

Grep命令 grep是根据文件的内容进行查找&#xff0c;会对文件的每一行按照给定的模式&#xff08;patter&#xff09;进行匹配查找 基本格式&#xff1a; grep [options]范围 [options] 主要参数 -c: 只输出匹配行的计数 -i : 不区分大小写 -n: 显示匹配行及行号 -w: 显示整个…

【鸽鸽送书第一期】 | 实现可观测性平台的技术要点是什么?文末参与送书哦!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言实现可观测性平台的技术要点是什么&#xff1f;1.兼容全域信号量2.所谓全域信号量有哪些&#x…

除了天地图,还有哪些平台可以标绘地图?

想要在地图上标绘业务数据或制作个人地图&#xff0c;却难以找到一款得心应手的地图标绘平台。 在经过一番探索查找之后&#xff0c;发现天地图的标注功能还比较适用。 天地图中的标注 在天地图中&#xff0c;可以将现有的数据导入与地图进行叠加&#xff0c;也可以将绘制的地…

计算机网络工程师多选题系列——计算机网络

2 计算机网络 2.1 网络技术基础 题型1 TCP/IP与ISO模型的问题 TCP/IP由IETF制定&#xff0c;ISO由OSI制定&#xff1b; TCP/IP分为四层&#xff0c;分别是主机-网络层、互联网络层、传输层和应用层&#xff1b;OSI分为七层&#xff0c;分别是物理层、数据链路层、网络层(实…

Visual Studio 更新:远程文件管理器

Visual Studio 中的远程文件管理器可以用来访问远程机器上的文件和文件夹&#xff0c;通过 Visual Studio 自带的连接管理器&#xff0c;可以实现不离开开发环境直接访问远程系统&#xff0c;这确实十分方便。 自从此功能发布以来&#xff0c;VS 开发团队努力工作&#xff0c;…

【2023年11月第四版教材】第13章《资源管理》(合集篇)

第13章《资源管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础2.1 术语2.2 项目经理的权力有5种来源2.3 优秀团 队的建设5个阶段2.4 激励理论2.4.1 马斯洛需求层次理论2.4.2 赫茨伯格双因素理论&#xff1a;★★★2.4.3 X理论&#xff08;不好&#xff09;步丫理论&…

一些真实的app渗透与算法hook

app1 apk文件下载到电脑&#xff0c;adb install 安装到真机上&#xff0c;打开是一个注册页面 真机把SocksDroid打开&#xff0c;随便输个电话号&#xff0c;电脑开charles抓包&#xff1a; 我们放到burp重发器里&#xff0c;改参数重发&#xff0c;不出意外&#xff0c;果然…

低代码开发平台的优点和缺点

随着数字化转型的加速&#xff0c;企业需要更快速地开发和交付应用程序&#xff0c;以适应市场需求和客户需求的变化。在这种情况下&#xff0c;低代码平台成为了企业的首选方案之一。 想象一下&#xff0c;你可以用一个可视化工具构建自己的应用程序&#xff0c;而无需编写繁琐…

面试官:Vue3.0 性能提升主要是通过哪几方面体现的?

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、编译阶段 diff算法优化 静态提升 事件监听缓存 SSR优化 二、源码体积 三、响应式系统 一、编译阶段 回顾…

jeecg-boot 基础使用

一 。 页面增加基础使用 先在数据库进行数据定义 然后在页面属性修改显示方式 保存 同步数据库 然后测试 没有问题 选取需要的数据然后生成代码 然后保存 效果 如果需要关联的话 视频 JeecgBoot低代码开发—零基础入门视频_哔哩哔哩_bilibili 文档 如何配置报表菜…

MQ - 07 基础篇_消费者客户端SDK设计(上)

文章目录 导图概述消费模型的选择Pull 模型1. 服务端 hold 住请求2. 服务端有数据的时候通知客户端Push 模型Broker 内置 Push 功能Broker 外独立实现 Push 功能的组件在客户端实现伪 Push 功能Pop 模型分区消费模式的设计独占消费共享消费广播消费灾备消费总结导图

【Linux系统编程】进程概念与基本创建

文章目录 1. 进程的概念2. 进程描述—PCB3. task_struct—PCB的一种4. task_ struct内容分类5. 查看进程 这篇文章我们来学习下一个概念——进程 1. 进程的概念 那什么是进程呢&#xff0c;我们该如何理解它呢&#xff1f; 如果我们打开电脑的任务管理&#xff1a; 我们看到这…

7.zigbee开发,低功耗,通信加密开发

一。低功耗 1.低功耗应用场景 1、不利于更换电池的设备 2、手持便携设备 3、实时性要求不高的设备 2.低功耗工作原理 1、时钟降至最低 2、暂时不用的外设关闭、需要在启动 3、I/O配置 用电情况可以简化为&#xff1a; 等一会运行一下。 3.zigbee实现低功耗 1.协调器路由器终端…

【性能优化上】第三方组织结构同步优化一,分状态,分步骤的设计,你 get 到了吗?

在工作中&#xff0c;云产品之间自然少不了各种系统的对接&#xff0c;系统对接自然会涉及到各种鉴权&#xff0c;以及需要将对方系统的组织结构同步到己方内部系统中来 当然&#xff0c;有的产品可能会去对接实际的第三方认证源和同步源&#xff0c;但是成本相对比较高&#…

【数据结构】对称二叉树 另一颗树的子树(六)

目录 一&#xff0c;对称二叉树 题目详情&#xff1a; 解题思路&#xff1a; 思路实现&#xff1a; 源代码&#xff1a; 二&#xff0c;另一颗树的子树 题目详情&#xff1a; 解题思路&#xff1a; 思路实现&#xff1a; 源代码&#xff1a; 前言&#xff1a; 接下来…