# 2.测量距离学会超声波传感器 你好,我是爱吃鱼香ROS的小鱼。上一节简单的介绍了超声波传感器,但是没有介绍如何通过代码使用,本节我们尝试使用并封装超声波模块。 我们使用的超声波模块一共有四个引脚,分别是 - `TRIG` 即发送引脚,用于发送超声波 - `ECHO 即接收引脚,用于接收反射回来的超声波` - `VCC` 电源接5V - `GND` 电源地 ## 一、新建工程 新建`example18_sr04` ![image-20230123182325277](2.%E6%B5%8B%E9%87%8F%E8%B7%9D%E7%A6%BB%E5%AD%A6%E4%BC%9A%E8%B6%85%E5%A3%B0%E6%B3%A2%E4%BC%A0%E6%84%9F%E5%99%A8/imgs/image-20230123182325277.png) ## 二、编写代码 带注释的代码如下 ```c++ #include #define Trig 27 // 设定SR04连接的Arduino引脚 #define Echo 21 void setup() { Serial.begin(115200); pinMode(Trig, OUTPUT); // 初始化舵机和超声波 pinMode(Echo, INPUT); // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态 } void loop() { static double mtime; digitalWrite(Trig, LOW); // 测量距离 delayMicroseconds(2); // 延时2us digitalWrite(Trig, HIGH); delayMicroseconds(10); // 产生一个10us的高脉冲去触发SR04 digitalWrite(Trig, LOW); mtime = pulseIn(Echo, HIGH); // 检测脉冲宽度,注意返回值是微秒us float detect_distance = mtime / 58.0 / 100.0; // 计算出距离,输出的距离的单位是厘米cm Serial.printf("distance=%f\n", detect_distance); delay(500); } ``` ## 三、代码注解 核心代码分为两部分 ### 3.1发送超声 方波产生,低-高-低 ![image-20230123183006024](2.%E6%B5%8B%E9%87%8F%E8%B7%9D%E7%A6%BB%E5%AD%A6%E4%BC%9A%E8%B6%85%E5%A3%B0%E6%B3%A2%E4%BC%A0%E6%84%9F%E5%99%A8/imgs/image-20230123183006024.png) ```c++ digitalWrite(Trig, LOW); // 测量距离 delayMicroseconds(2); // 延时2us digitalWrite(Trig, HIGH); delayMicroseconds(10); // 产生一个10us的高脉冲去触发SR04 digitalWrite(Trig, LOW); ``` ### 3.2 检测回响计算距离 ```c++ mtime = pulseIn(Echo, HIGH); // 检测脉冲宽度,注意返回值是微秒us float detect_distance = mtime / 58.0 / 100.0; // 计算出距离,输出的距离的单位是米m ``` 58是一个时间系数,根据声音在空气中传播速度计算而来。`pulseIn`函数用于检测某个引脚从当前时间跳变到高电平之间持续的时间。 ## 四、下载测试 将超声波模块连接到开发板上的超声波接口上 ![image-20230123191703562](2.%E6%B5%8B%E9%87%8F%E8%B7%9D%E7%A6%BB%E5%AD%A6%E4%BC%9A%E8%B6%85%E5%A3%B0%E6%B3%A2%E4%BC%A0%E6%84%9F%E5%99%A8/imgs/image-20230123191703562.png) 下载代码,打开串口,查看距离不断变化 ![image-20230123183325678](2.%E6%B5%8B%E9%87%8F%E8%B7%9D%E7%A6%BB%E5%AD%A6%E4%BC%9A%E8%B6%85%E5%A3%B0%E6%B3%A2%E4%BC%A0%E6%84%9F%E5%99%A8/imgs/image-20230123183325678.png) ## 五、总结 本节我们成功实现使用超声波实现距离测量功能,下一节我们尝试使用第三方库驱动舵机。