1.项目成果展示
2.项目要求
(1).会简单C语言, 了解servo库, 了解SG90舵机 ,知道超声波模块检测距离方法
(2).自己做一个垃圾桶或者买一个 小型垃圾桶
(3).了解WemosD1芯片
3.开发环境
arduion-1.6.5
4.SG90舵机
(1).SG90舵机简介
型号 | SG90 重量13克 角度 90-180通用 |
三线对应端口 | 红色 :正极 棕色:GND 橙色:信号线 |
无负载速度 | 0.12秒 /60度(4.8V) |
堵转扭矩 | 1.2~1.4公斤/厘米(4.8V) |
使用温度 | -30~+60摄氏度 |
死区设定 | 7微秒 |
工作电压 | 4.8V~6V(3.3V也能用) |
(2).servo 函数的用法
attach | 连接舵机(自带库仅9/10脚有效) |
write | 角度控制 |
writeMircroseconds() | 更精确的角度控制(微秒级) |
read() | 读上一次舵机转动角度 |
attach() | 检查舵机是否连接在控制板上 |
detach() | 断开舵机连接,使接口(9/10)脚可做PWM输出 |
(3).舵机核心代码(仅供参考)
#define PIN_SERVO D5
Servo myservo;
myservo.attach(PIN_SERVO);
myservo.write(30);
5.超声波模块
(1).模块简介
两个圆圈作用 | 一个用于发射,一个用于接收 |
4个引脚 | VCC(正极) Trig(触发) Echo(响应) GND(接地) |
工作电压电流 | 5V、15mA |
感应距离 | 2~400cm |
感测角度 | 不大于15度 |
测试面积 | 不小于50平方厘米 |
(2).超声波时序图(自己画的有点丑,还少画了一个脉冲)
(3).响应测距Demo代码
#define Echo D2 //echo(回应)
#define Trig D8 //Trig(触发)
long getTime(){
digitalWrite(Trig,HIGH);
delayMicroseconds(10);//发送一个10微秒(us)的脉冲
digitalWrite(Trig,LOW);
return pulseIn(Echo,HIGH);
}
void inintChaoShengBo(){
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
void setup() {
inintChaoShengBo();//超声波模块初始化(引脚初始化)
Serial.begin(115200);
}
void loop() {
//获取距离
long dis;
dis=getTime()/58;//为什么要除以58?
Serial.print(dis);//这个是不换行
Serial.println("cm");//这个输出是换行
delay(500);
}
6.为什么要除以58?
声音在空气中的传播速度为343m/s,换算成34300cm/m,换算成微秒等于,0.0343cm/us;我们再换一个角度,使其除以1,等于29.15us/cm。
这就意味着每291.5微秒表示10厘米的距离。也就是说每1厘米就是29,15微秒,然后根据超声波发射与返回的原理,也就是发出到接受声波,声音经过的是2倍的距离。
所以实际距离就是1厘米,对应58.3微秒。
但在玩单片机的过程中一般直接除以58,当然为了更加精确,可以除以58.3
7.项目总结
(1).项目完整代码
#include <Servo.h>
#define sg90_PIN D6//定义舵机名
#define Echo D2 //echo(回应)
#define Trig D8 //Trig(触发)
#define BEEP D5
Servo myDuoJi;//定义一个类,可以看做一个结构体
long getTime(){
digitalWrite(Trig,HIGH);
delayMicroseconds(10);//发送一个10微秒(us)的脉冲
digitalWrite(Trig,LOW);
return pulseIn(Echo,HIGH);
}
void inintChaoShengBo(){
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
void setup() {
// put your setup code here, to run once:
inintChaoShengBo();//超声波模块初始化(引脚初始化)
myDuoJi.attach(sg90_PIN);//完成一个舵机连接
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
//获取距离
long dis;
dis=getTime()/58;//为什么要除以58
Serial.print(dis);//这个是不换行
Serial.println("cm");//这个输出是换行
if(dis<10){
myDuoJi.write(0);//控制舵机0度,开盖
digitalWrite(BEEP,LOW);
}
else{
myDuoJi.write(180);//舵机旋转180度,闭合
digitalWrite(BEEP,HIGH);
}
delay(500);
}
(2)该项目发展
其实还可以加几个模块,比如ESP8266,语音模块,可以写个手机APP控制,后面有时间更新语音控制及手机APP控制。