(1).会简单C语言, 了解servo库, 了解SG90舵机 ,知道超声波模块检测距离方法
(2).自己做一个垃圾桶或者买一个 小型垃圾桶
(3).了解WemosD1芯片
arduion-1.6.5
(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);(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); }声音在空气中的传播速度为343m/s,换算成34300cm/m,换算成微秒等于,0.0343cm/us;我们再换一个角度,使其除以1,等于29.15us/cm。
这就意味着每291.5微秒表示10厘米的距离。也就是说每1厘米就是29,15微秒,然后根据超声波发射与返回的原理,也就是发出到接受声波,声音经过的是2倍的距离。
所以实际距离就是1厘米,对应58.3微秒。
但在玩单片机的过程中一般直接除以58,当然为了更加精确,可以除以58.3
(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控制。