背景:
随着人们的生活水平不断提高, 家居生活现代化是个必然的趋势. 智能垃圾桶很好的解决了无需接触垃圾桶就可投放垃圾, 防止交叉感染等问题. 减少生活当中各种病菌交叉感染的几率; 无异味溢出. 但其存在需要经常更换电池, 电池寿命问题.
目的:
第一: 通过这篇文章, 大致能了解目前市面上智能垃圾桶的工作原理.
第二: 当使用电池供电, 可能对于此产品来讲, 功耗会偏大. 采用外部供电方式, 是否能满足需求.
第三: 设计一个产品模型可能不需要考虑很多因素, 但设计一款产品考虑因素还有哪些, 讨论一下.
实验材料
Arduino 控制板 9G 舵机 超声波模块
什么是 Arduino 控制板
它是一款便捷灵活, 方便上手的开源型平台. 对于初学者是一款极易上手的硬件.
超声波模块的工作原理
通过 Trig 引脚发一个 10US 以上的高电平, 就可以在 Echo 接收口等待高电平输出; 一有输出就可以开定时器计时, 当此口变为低电平时就可以读定时器的值, 此时就为此次测距的时间, 方可算出距离. 如此不断的周期测, 就可以达到你移动测量的值了.
可能您对此还有疑惑, 我们将其换成程序流程:
a. 单片机引脚触发 Trig 测距, 给至少 10us 的高电平信号;
b. 模块自动发送 8 个 40khz 的方波, 自动检测是否有信号返回;
c. 有信号返回, 通过 IO 输出一高电平, 并单片机定时器计算高电平持续的时间;
d. 超声波从发射到返回的时间.
计算公式: 测试距离 =(高电平时间 * 声速 (340M/S))/2;
接下来, 我们来上系统连接图
舵机连接图如下:
橙色: 信号线 D9 红色: 5V 灰色: GND
超声波模块连接如下:
GND--GND
Echo-- 数字信号 D2
Trig-- 数字信号 D3
GND--GND
连接好以后, 就要编写程序了
- #include <Servo.h> // 调用库函数
- Servo servo; // 定义舵机变量名
- int servoPin = 9; // 定义舵机接口 9, 只有 9 或者 10 可用
- int trigPin =2; // // trig 接 2 端口
- int echoPin = 3; // echo 接 3 端口
- long duration, distance; // 定义变量, 用于存取数据
- long aver[3]; // 定义数组, 用于存取数据
- void setup() {
- servo.attach(servoPin); // 设定舵机的接口, 9 或者 10 接口可利用
- pinMode(trigPin, OUTPUT); // 设置为输出模式 触发
- pinMode(echoPin, INPUT); // 设置其为输入模式 回声
- servo.write(0); // 用于设定舵机旋转角度的语句, 可设定的角度范围是 0° 到 180°.
- delay(1000); // 延时 1S;
- servo.detach(); // 使舵机与其接口分离, 该接口 9 可继续被用作 PWM 接口.
- }
- // 超声波测距, 子程序
- void measure() {
- digitalWrite(trigPin, LOW);// 给一个低电平
- delayMicroseconds(5);// 时间为 5 毫秒
- digitalWrite(trigPin, HIGH);// 给一个高电平
- delayMicroseconds(15);// 时间为 15 毫秒
- digitalWrite(trigPin, LOW);// 再给一个低电平
- duration = pulseIn(echoPin, HIGH);// 接收高电平时间
- distance = duration *0.034 / 2;// 计算距离
- }
- void loop() {
- // 将测量数值记录在数组里面
- for (int i=0;i<=2;i++) {
- measure();
- aver[i]=distance;
- delay(50);
- }
- // 算三次的平均值
- distance=(aver[0]+aver[1]+aver[2])/3;
- Serial.println(distance); // 打印
- // 如果距离小于 40, 转动舵机 70°
- if (distance<40) {
- servo.attach(servoPin); // 设定舵机的接口, 9 接口可利用
- delay(1);
- servo.write(70); // 转动舵机 70°
- delay(5000); // 延时 5 秒
- servo.write(0); // 转回 0°
- delay(1000);// 延时 1 秒
- servo.detach(); // 使舵机与其接口分离, 该接口 9 可继续被用作 PWM 接口.
- }
- }
以上写有程序及注释, 可根据自己需求修改参数 (主要是修改舵机角度以及延时时间 - servo.write(70); // 转动舵机 70° delay(5000); // 延时 5 秒)
根据上述描述过程, 我们就可以实现自动感应扔垃圾的需求. 当然, 我们可以将超声波检测模块更换成热释红外模块, 触摸模块.
感想
通过制作智能垃圾桶模型, 我们知道了智能垃圾桶的实现原理, 在垃圾桶上安装一个传感器模块, 用来检测外部环境的变化, 当外部环境发生变化时, 做出反应, 以达到智能的效果.
在制作模型时, 选用模块安装固定还相对容易, 但用在现实生活中就相对比较困难, 首先, 普通垃圾桶没有盖子, 有盖子的垃圾桶舵机安装有问题等, 还有就是供电问题, Arduino 可采用 9V 或 12V 充电器进行外部供电, 但会受地方限制; 如采用电池供电, 由于模块耗电量大而容易经常更换电池.
思考
智能的真正目的是使人们的生活更加方便, 而采用 Arduino 控制板, 能否将产品做出来, 解决我们生活当中的痛点, 以方便我们的生活吗?
来源: https://www.cnblogs.com/fqhy/p/12287903.html