|
超声波测距模块制作自动开盖的垃圾桶
本帖最后由 topdog 于 2022-1-22 09:06 编辑
还缺一个垃圾桶、三组机械连杆和一个舵机呀!
超声波测距模块HC04装配于垃圾桶正面中部,人走到20厘米处,垃圾桶盖子打开。舵机安装在垃圾桶内侧上口延中部,带动一组动力连杆开合盖子,左右各两个支撑连杆分散盖子的重量。
接线注意的事项:
舵机选择可以控制180度的,舵机接线有三根线,信号线连到第4管脚,正极线接5V,负极线接GND。
超声波测距模块HC04,Trig接第2管脚,Echo接第3管脚,正极线接5V,负极线接GND。
原理如下图:
(1)超声波发射器(trig pin)发出高频声音(40 kHz)。
(2)声音在空气中传播。如果它找到一个对象,它会返回到模块。
(3)超声波接收器(echo pin)接收反射的声音(回声)。
信号从发射到接收之间的时间允许我们计算到一个物体的距离。这是可能的,因为我们知道声音在空气中的速度。在20ºC (68ºF)条件下,音速在空气中的速度每秒343m。这是公式:
到对象的距离 = ((声音在空气中的速度)*echo测得高电平持续时间)/2
声音在空气中的速度的常量计算:343m/s = 0.0343 cm/uS = 1/29.1 cm/uS
如果需要换算成英寸: 13503.9in/s = 0.0135in/uS = 1/74in/uS
程序如下:
[pre]#include <Servo.h>
volatile unsigned int Distance = 0;
const int TrigPin = 2;
const int EchoPin = 3;
const int ServoPin = 4;
Servo myservo;
int checkdistance() {
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
int distance = pulseIn(EchoPin, HIGH) / 58.2; // 29.1*2=58.2 等式右侧有一个小数是float类型,左侧是int类型,赋值时会自动取整int类型,此处直接赋值58或者59也OK
return distance;
}
void setup() {
Serial.begin(9600);
myservo.attach(ServoPin);
}
void loop() {
Distance = checkdistance();
//Serial.println(Distance);
if (Distance <= 20 ) {
myservo.write(90);
delay(200);
} else {
myservo.write(0);
}
}[/pre]
当然也可以使用new ping库:
[pre]#include <NewPing.h>
#include <Servo.h>
const int TRIGGER_PIN = 2;
const int ECHO_PIN = 3 ;
const int ServoPin = 4 ;
const int MAX_DISTANCE = 200;
unsigned int Distance;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
void setup() {
Serial.begin(9600);
myservo.attach(ServoPin);
}
void loop() {
delay(50); // ping之间等待50ms(大约20 ping /sec)。29ms应该是ping之间的最短延迟。
Distance = sonar.ping_cm();
//Serial.println(Distance);
if (Distance <= 20 ) {
myservo.write(90);
delay(200);
} else {
myservo.write(0);
}
}[/pre]
(完)
|
|