源代码是从网上找的,超声波模块应该都是差不多一样的,接5V和GND,然后Trig接A0,Echo接A1,代码如下:
int TrgPin = A0;
int EcoPin = A1;
float dist;
void setup()
{
Serial.begin(9600);
pinMode(TrgPin, OUTPUT);
pinMode(EcoPin, INPUT);
}
void loop()
{
digitalWrite(TrgPin, LOW);
delayMicroseconds(10);
digitalWrite(TrgPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrgPin, LOW);
dist = pulseIn(EcoPin, HIGH) / 58.00;
if (dist > 0) {
Serial.print("Distance:");
Serial.print(dist);
Serial.println("cm");
}
delay(100);
}
用编译器自带的串口监视器就可以看到距离的变化了
注意:
有人提到triger, echo需要接到模拟引脚,编号A开头的都是模拟引脚
原理解释:
其实我看上面这个图没看懂,原理应该是计算发射与回波间隔时间,所以这个输出回响信号不能误以为是接受到的信号长度(接收到的信号在模块内被处理了,对外看不到),而是直接将其时间长度理解成发射与接受时间间隔就好。
距离计算:
声音在干燥、摄氏 20℃的空气中传播速度大约为340米/秒。进行单位换算后得出距离1厘米需要29微秒,但是发送到接收到回波,声音走过的是2倍的距离。所以实际距离就是1厘米对应58微秒。
问题:
刚开始使用一个超声波模块发现距离总是归零,然后不再变化,检查发现是模块有问题。论坛上有人说更换3.3V供电就好,但实测会输出很小的0.05cm左右的距离,可能和晶振供电不足频率降低有关,增加供电稳定性也不行,最后发现是模块有问题。
更换模块后发现虽然测距没问题,但是依然会间隔输出0距离,猜测由于这个程序判断高电平时间,但是如果没有高电平是不是也会在一次循环内输出一个高电平时间为0,或者短暂的干扰(小于模块的反应时间)应该会导致一个错误的0距离。所以简单粗暴写了个If(dist>0) 判断距离不为零然后在输出,这个问题就解决了。
参考文章:
带你走进Arduino世界之超声波测距
基于arduino超声波测距学习
Arduino—数字信号引脚和模拟信号引脚
|