简单介绍超声波测距模块
SR04超声波传感器:
是利用超声波特性检测距离的传感器,其带有两个超声波探头,分别用作于发射和接收超声波。范围在3-450cm。
工作原理:
超声波发射器向某一方向发射超声波,在发射的同时开始计时;
超声波在空气中传播,途中遇到障碍物则立即返回,超声波接收器收到反射波则立即停止计时。
声波在空气中传播速度为340m/s,根据计时器记录时间t,即可算出发射点距离障碍物的距离S,
即S=340m/s*t/2,这就是所谓的时间差测距法。
代码:
int trigPin = 8; //发出信号
int echoPin = 7; //接收信号
float v = 331.5+0.6*20;// 若不考虑温度的影响,声波在空气中传播速度为340m/s
void setup() {
Serial.begin(115200);//设置波特率
pinMode(trigPin,OUTPUT);//设置输出状态。或者写成:pinMode(8,OUTPUT);
pinMode(echoPin,INPUT);//设置输入状态
pinMode(6,OUTPUT);//蜂鸣器pin6,输出状态
}
float distanceM()
{
digitalWrite(trigPin,LOW);//
delayMicroseconds(3);//延时3微秒
digitalWrite(trigPin,HIGH);
delayMicroseconds(5);
digitalWrite(trigPin,LOW);
/*float tUS = pulseIn(echoPin,HIGH);
float t = tUs / 1000.0 / 1000.0 / 2;
float d = t*v;
return d*100;*/
float d =pulseIn(echoPin,HIGH)/58.00; //检测脉冲宽度,并计算出距离**cm.
/*pulseIn()单位为微秒,声速340m/s,单片机的晶振频率约为14MHZ,所以距离cm=340*100/(1000000-14000)*pulseIn()/2,及化简为pulseIn()/[(1000000-14000)*2/(340*100)]等于pulseIn()/58.0.*/
return d;
}
void loop()
{
while(1)
{
int d = distanceM();
Serial.println(d,DEC);//BIN、OCT、HEX、DEC分别代表二、八、十六、十进制~~
if(d>10)
{
digitalWrite(6,HIGH);//蜂鸣器
delay(200);
digitalWrite(6,LOW);
}
delay(200);
}
}
米思齐:
(2021.04.14更新)
2021全国青少年机器人技术等级考试实操考题:
主题:超声波测距
器件:LED灯模块3个,超声波传感器1个,结构件若干(也可以使用普通电子元件结构面包板搭建)
搭建要求:
1、本项目由LED灯,超声波传感器组成;
2、当障碍物距离超声波传感器大于30厘米时,3盏LED灯均处于熄灭状态;
3、当障碍物逐渐接近超声波传感器时,随着距离的减小,3盏LED灯依次点亮(触发距离值由考生自行决定);
4、当障碍物逐渐远离超声波传感器时,3盏LED灯依次熄灭;
5、将超声波传感器返回的当前距离值,显示在串口监视器上。
电路原理图:
示例代码1:
volatile int Tpin;
volatile int Epin;
volatile int dISTANCE;
float checkdistance_Tpin_Epin() {
digitalWrite(Tpin, LOW);
delayMicroseconds(2);
digitalWrite(Tpin, HIGH);
delayMicroseconds(10);
digitalWrite(Tpin, LOW);
float distance = pulseIn(Epin, HIGH) / 58.00;
delay(10);
return distance;
}
void setup(){
Tpin = 3;
Epin = 2;
dISTANCE = 0;
pinMode(Tpin, OUTPUT);
pinMode(Epin, INPUT);
Serial.begin(9600);
}
void loop(){
dISTANCE = checkdistance_Tpin_Epin();
Serial.print(dISTANCE);
Serial.println("CM");
}
示例代码2:
volatile int Tpin;
volatile int Epin;
volatile int R;
volatile int G;
volatile int B;
volatile int dISTANCE;
float checkdistance_Tpin_Epin() {
digitalWrite(Tpin, LOW);
delayMicroseconds(2);
digitalWrite(Tpin, HIGH);
delayMicroseconds(10);
digitalWrite(Tpin, LOW);
float distance = pulseIn(Epin, HIGH) / 58.00;
delay(10);
return distance;
}
void setup(){
Tpin = 3;
Epin = 2;
R = 7;
G = 8;
B = 9;
dISTANCE = 0;
pinMode(Tpin, OUTPUT);
pinMode(Epin, INPUT);
Serial.begin(9600);
}
void loop(){
dISTANCE = checkdistance_Tpin_Epin();
Serial.print(dISTANCE);
Serial.println("CM");
delay(10);
if (dISTANCE < 30) {
pinMode(R, OUTPUT);
digitalWrite(R,HIGH);
delay(1000);
pinMode(G, OUTPUT);
digitalWrite(G,HIGH);
delay(1000);
pinMode(B, OUTPUT);
digitalWrite(B,HIGH);
}
if (dISTANCE > 30) {
pinMode(R, OUTPUT);
digitalWrite(R,LOW);
delay(1000);
pinMode(G, OUTPUT);
digitalWrite(G,LOW);
delay(1000);
pinMode(B, OUTPUT);
digitalWrite(B,LOW);
}
}