智能垃圾桶 是智慧城市的刚需,是传统垃转存设备的替代者。项目采用基于 MCU 的 Arduino Uno 开发板,通过伺服马达和超声波传感器实现对传统垃圾箱的智能化升级改造,可用作城市环保设备开发的原型,供开发工程师和DIY爱好者参考。 1. 项目介绍 项目中的超声波传感器安置于垃圾桶的顶部,感测来迹象的状态,其阈值设置成一个特别电平。 Arduino 编程逻辑如下:当有人靠近垃圾箱前方并伸手丢垃圾时,伺服马达开始动作,并打开垃圾桶的盖子,让人把废物丢进垃圾桶里。 由于住户不用动手开盖,并在离开时自动关闭,避免了传统垃圾桶盖子长期打开散发气味、危害环境的弊端,还能培养住户和小孩养成良好卫生习惯,保持环境干净、整洁。 通常,垃圾箱分为干、湿、可回收、有毒害四类。本项目通过检测人手的存在决定箱盖的打开、闭合,还能够识别丢进来的垃圾的种类,并区分为可生物降解,获非降解两类 。 2. 物料介绍 项目物料清单: 12v 电源适配器 Arduino Uno 开发板 Arduino Nano HC-SR04 超声波传感器 微型伺服马达 面包板 工具及软件:示波器、可变电源、数字万用表、烙铁、 PCB 打孔机 ( 1 ) 超声波传感器 超声波传感器工作时会发出一个超出人类听觉范围的超声波,其换能器相当于话筒,可接收超声波信号并转换成电信号。超声波是振动频率高于 20kHz 的机械波,具有频率高、波长短、绕射现象小、方向性好等特点。 本项目与其他一样,也使用单换能器来发送脉冲合接收回声。如图 2 所示,传感器向某一方向发射超声波时开始计时,超声波碰到障碍物时返回,根据时间差和超声波速度可以估算出发射位置到障碍物的距离。 项目使用的 HC-SRO4 传感器模块的四个引脚分别为: Vcc(5V 电源 ) 、触发引脚、回声引脚、接地 (0V) 。工作时,采用 IO 触发测距 10us 的高电平信号,模块自动发送 8 个 40khz 的方波,自动检测是否有回声。如果有回声,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。 HC-SRO4 性能参数如下: 工作使用电压: DC5V 静态电流:小于 2mA 电平输出:高 5V 电平输出:底 0V 感应角度:不大于 15 度 探测距离: 2-450cm 高精度:可达 0.3cm ( 2 ) 伺服马达 伺服马达是可以让物体精确转动的电气元件,可以控制速度,位置精度非常准确。伺服电机转子转速受输入信号控制,并能快速反应,在自动控制系统中,用作执行元件,且具有机电时间常数小、线性度高等特性,可把所收到的电信号转换成电动机轴上的角位移或角速度输出。 伺服马达分为直流和交流两大类,当信号电压为零时无自转现象,转速随着转矩的增加而匀速下降。 Micro Servo 9G 伺服马达参数如下: 重量 : 9g 尺寸 : 22.2 x 11.8 x 31mm approx. 失速转矩 : 1.8kgf · cm 运行速度 : 0.1s/60 度 工作电压 : 4.8V(~5V) 死区宽度 : 10 μ s 工作温度 : 0 – 55 º C 模拟力矩 : 4.8V@1.80kg-cm) 旋转范围 : 180 ° 脉冲周期 : ca. 20ms 脉冲宽度 : 500-2400µs ( 3 ) Arduino UNO Arduino 是一个构架电子项目的开源平台,包括一个物理可编程电路板和一套开发环境软件( IDE ), IDE 可在 PC 运行,用来向 Arduino 板子写入代码或上传代码。 Arduino 的 Uno 版本更加普及,适合艺术家、设计师、发烧友和各种爱好 DIY 的人群,可用来控制按钮、 LEDs 、马达、喇叭、 GPS 单元、照相机,甚至于手机和电视机。 Arduino 有很多种类,但大多数板子上面的元器件是一样的。以下按标号逐一解释: 标号 1 : USB 座。可通过 USB 电缆连接电脑或者电源,为 Arduino UNO 供电。从 PC 向 Arduino 开发板上传代码,也是通过这个 USB 电缆进行的。 标号 3 : GND 引脚。 Arduino 有多个接地引脚,功能是一样的。 标号 4 : 5V 电源。提供 5V 电压。 标号 5 : 3.3V 电源。提供 3.3V 电压。 标号 6 :模拟输入引脚 (A0--A5 ),用来读取来自模拟传感器(如温度传感器)的信号,并转换成我们能够识别的数字。 标号 7 :数字输入引脚 (0--13 ),用以数字输入(如按钮被按下)信号,或者输出数字信号(如驱动一个 LED )。 标号 8 : PWM 引脚 (3, 5, 6, 9, 10, 11) 。本质上属于数字引脚,也可用作 PWM 。可用来模拟某些输出,如 LED 的亮度变化。 标号 9 : AREF 引脚,表示模拟参考,大多数情况下不用,有时用来设置一个作为上限的外部模拟电压。 标号 10 :复位按钮。按个案件非常有用,按下就立即接地,并重启任何上传到 Arduino 的代码。 标号 11 :电源 LED 指示器。只要将 Arduino 接上电源,这个 LED 就一直点亮。如果不亮,马上检查电路,看看哪里出错了? 标号 12 : TX RX LEDs 指示灯,点亮表示正在接收或发射数据。 标号 13 :主控 IC 芯片,来自爱特梅尔的 ATmega 。 标号 14 :稳压芯片。 3. 项目目标 该项目的目的是建立一个原型,在有人准备扔垃圾的时候自动打开垃圾箱盖子,并检测刚扔进来垃圾的种类,具体参考原理图。 Arduino 连接方法如下: HC-SRO4 传感器模块引脚 VCC 连接到 Arduino 引脚 +5VDC ,引脚 Trig 连接到 Arduino 引脚 7 ,引脚 Echo 连接到 Arduino 引脚 6 ,引脚 GND 连接到 Arduino 引脚 GND 。 伺服马达 SG-90 的 Red 引脚连接 Arduino 3.3v , Black 引脚连接 Arduino GND , Orange 引脚连接 Arduino Pin 8 。 4. 代码编程 按照上述说明把 Arduino 与超声波传感器、伺服马达连接好后,就开始上传代码。 该智能垃圾箱的伺服数据库为: // Download Servo Library //https://www.electroniclinic.com/arduino-libraries-download-and-projects-they-are-used-in-project-codes/ #include // Defines Tirg and Echo pins of the Ultrasonic Sensor const int trigPin = 6; const int echoPin = 7; // Variables for the duration and the distance long duration; int distance; Servo myServo; // Creates a servo object for controlling the servo motor void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); myServo.attach(9); // Defines on which pin is the servo motor attached } void loop() { // rotates the servo motor from 15 to 165 degrees for (int i = 15; i <= 165; i++) { myServo.write(i); delay(30); distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree Serial.print(i); // Sends the current degree into the Serial Port Serial.print(","); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing Serial.print(distance); // Sends the distance value into the Serial Port Serial.print("."); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing } // Repeats the previous lines from 165 to 15 degrees 15; i--) { myServo.write(i); delay(30); distance = calculateDistance(); Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print("."); } } // Function for calculating the distance measured by the Ultrasonic sensor int calculateDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds distance = duration * 0.034 / 2; return distance; } 开始 编程 前,我们先添加 Servo.h 头文件, #include 接下来,定义触发和回声引脚。 HC-SR04 超声波传感器的触发和回声引脚分别连接于 Arduino 的 pins 6 、 7 。 const int trigPin = 6; const int echoPin = 7; // Variables for the duration and the distance long duration; int distance; Servo myServo; // Creates a servo object for controlling the servo motor setup() function runs only one time with the Arduino board is turned ON. void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); myServo.attach(9); // Defines on which pin is the servo motor attached void loop() { // rotates the servo motor from 15 to 165 degrees for (int i = 15; i <= 165; i++) { myServo.write(i); delay(30); distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree Serial.print(i); // Sends the current degree into the Serial Port Serial.print( “ , ” ); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing Serial.print(distance); // Sends the distance value into the Serial Port Serial.print( “ . ” ); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing } // Repeats the previous lines from 165 to 15 degrees 15; i – ) { myServo.write(i); delay(30); distance = calculateDistance(); Serial.print(i); Serial.print( “ , ” ); Serial.print(distance); Serial.print( “ . ” ); } } // Function for calculating the distance measured by the Ultrasonic sensor int calculateDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds distance = duration * 0.034 / 2; return distance; }