Skip to main content

Grove - 超声波测距仪

pir

这款 Grove - 超声波测距仪是一个工作在 40KHz 的非接触式距离测量模块。当我们通过信号引脚提供一个超过 10uS 的脉冲触发信号时,Grove_Ultrasonic_Ranger 将发出 8 个周期的 40kHz 循环电平并检测回声。回声信号的脉冲宽度与测量距离成正比。公式如下:距离 = 回声信号高电平时间 * 声速 (340M/S)/2。Grove_Ultrasonic_Ranger 的触发和回声信号共享 1 个 SIG 引脚。

warning

请勿热插拔 Grove-超声波测距仪,否则会损坏传感器。测量区域必须不少于 0.5 平方米且表面平滑。

版本

产品版本变更发布日期
Grove-超声波测距仪 V1.0初始版本2012年3月
Grove-超声波测距仪 V2.0改进了低压主板的电源稳定性,具体变更如下:1. 增加了电容 C14 2. 重新设计布局使其更加整洁 3. 兼容 3.3V 电压系统2017年7月

规格参数

参数数值/范围
工作电压3.2~5.2V
工作电流8mA
超声波频率40kHz
测量范围2-350cm
分辨率1cm
输出PWM
尺寸50mm X 25mm X 16mm
重量13g
测量角度15度
工作温度-10~60摄氏度
触发信号10uS TTL
回声信号TTL
tip

更多关于 Grove 模块的详细信息请参考 Grove 系统

支持的平台

ArduinoRaspberryArduPy
note

上述提到的支持平台是/是该模块软件或理论兼容性的指示。在大多数情况下,我们只为 Arduino 平台提供软件库或代码示例。不可能为所有可能的 MCU 平台提供软件库/演示代码。因此,用户必须编写自己的软件库。

开始使用

note

如果这是您第一次使用Arduino,我们强烈建议您在开始之前先查看Arduino入门指南

与Arduino一起使用

硬件

  • 步骤1. 准备以下物品:
Seeeduino V4.2Base ShieldGrove - 超声波测距仪
enter image description hereenter image description hereenter image description here
立即获取立即获取立即获取
  • 步骤2. 将超声波测距仪连接到Grove-Base Shield的D7端口。

  • 步骤3. 将Grove - Base Shield插入Seeeduino。

  • 步骤4. 通过USB线将Seeeduino连接到PC。

note

如果我们没有Grove Base Shield,我们也可以直接将Grove_Ultrasonic_Ranger连接到Seeeduino,如下所示。

SeeeduinoGrove-超声波测距仪
5V红色
GND黑色
未连接白色
D7黄色

软件

#include "Ultrasonic.h"

Ultrasonic ultrasonic(7);
void setup()
{
Serial.begin(9600);
}
void loop()
{
long RangeInInches;
long RangeInCentimeters;

Serial.println("The distance to obstacles in front is: ");
RangeInInches = ultrasonic.MeasureInInches();
Serial.print(RangeInInches);//0~157 inches
Serial.println(" inch");
delay(250);

RangeInCentimeters = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(RangeInCentimeters);//0~400cm
Serial.println(" cm");
delay(250);
}
  • 步骤4. 我们将在终端上看到距离显示如下。
The distance to obstacles in front is:
2 inches
6 cm
The distance to obstacles in front is:
2 inches
6 cm
The distance to obstacles in front is:
2 inches
6 cm

与Codecraft一起使用

硬件

步骤1. 将Grove - 超声波测距仪连接到Base Shield的D7端口。

步骤2. 将Base Shield插入您的Seeeduino/Arduino。

步骤3. 通过USB线将Seeeduino/Arduino连接到您的PC。

软件

步骤1. 打开Codecraft,添加Arduino支持,并将主程序拖到工作区域。

note

如果这是您第一次使用Codecraft,请参阅使用Arduino的Codecraft指南

步骤2. 按照下图拖拽积木块,或打开可在本页面末尾下载的cdc文件。

cc

将程序上传到您的Arduino/Seeeduino。

success

当代码上传完成后,您将在串口监视器中看到距离显示。

与Raspberry Pi一起使用(使用Grove Base Hat for Raspberry Pi)

硬件

  • 步骤1. 本项目中使用的物品:
Raspberry piGrove Base Hat for RasPiGrove - 超声波测距仪
enter image description hereenter image description hereenter image description here
立即获取立即获取立即获取
  • 步骤2. 将Grove Base Hat插入Raspberry。

  • 步骤3. 将Grove - 超声波测距仪连接到Base Hat的D5端口。

  • 步骤4. 通过USB线将Raspberry Pi连接到PC。

note

对于步骤3,您可以将超声波测距仪连接到任何GPIO端口,但请确保您使用相应的端口号更改命令。

软件

note

如果您使用的是Raspberry Pi with Raspberrypi OS >= Bullseye,您必须仅使用Python3运行此命令行。

  • 步骤1. 按照设置软件配置开发环境。

  • 步骤2. 通过克隆grove.py库下载源文件。

cd ~
git clone https://github.com/Seeed-Studio/grove.py
  • 步骤3. 执行以下命令运行代码。
cd grove.py/grove
python3 grove_ultrasonic_ranger.py 5 6

以下是grove_ultrasonic_ranger.py代码。

import sys
import time
from grove.gpio import GPIO

usleep = lambda x: time.sleep(x / 1000000.0)

_TIMEOUT1 = 1000
_TIMEOUT2 = 10000

class GroveUltrasonicRanger(object):
def __init__(self, pin):
self.dio =GPIO(pin)

def _get_distance(self):
self.dio.dir(GPIO.OUT)
self.dio.write(0)
usleep(2)
self.dio.write(1)
usleep(10)
self.dio.write(0)

self.dio.dir(GPIO.IN)

t0 = time.time()
count = 0
while count < _TIMEOUT1:
if self.dio.read():
break
count += 1
if count >= _TIMEOUT1:
return None

t1 = time.time()
count = 0
while count < _TIMEOUT2:
if not self.dio.read():
break
count += 1
if count >= _TIMEOUT2:
return None

t2 = time.time()

dt = int((t1 - t0) * 1000000)
if dt > 530:
return None

distance = ((t2 - t1) * 1000000 / 29 / 2) # cm

return distance

def get_distance(self):
while True:
dist = self._get_distance()
if dist:
return dist

Grove = GroveUltrasonicRanger

def main():
if len(sys.argv) < 2:
print('Usage: {} pin_number'.format(sys.argv[0]))
sys.exit(1)

sonar = GroveUltrasonicRanger(int(sys.argv[1]))

print('Detecting distance...')
while True:
print('{} cm'.format(sonar.get_distance()))
time.sleep(1)

if __name__ == '__main__':
main()
success

如果一切顺利,您将能够看到以下结果


pi@raspberrypi:~/grove.py/grove $ python3 grove_ultrasonic_ranger.py 5 6
Detecting distance...
121.757901948 cm
246.894770655 cm
2.60205104433 cm
0.205533257846 cm
0.657706425108 cm
247.433267791 cm
122.485489681 cm
^CTraceback (most recent call last):
File "grove_ultrasonic_ranger.py", line 110, in <module>
main()
File "grove_ultrasonic_ranger.py", line 107, in main
time.sleep(1)
KeyboardInterrupt

您可以通过简单地按 ++ctrl+c++ 来退出此程序。

与树莓派一起使用(配合 GrovePi_Plus)

硬件

  • 步骤 1. 准备以下物品:
树莓派GrovePi_PlusGrove - 超声波测距传感器
enter image description hereenter image description hereenter image description here
立即获取立即获取立即获取
  • 步骤 2. 将 GrovePi_Plus 插入树莓派。

  • 步骤 3. 将 Grove-超声波测距传感器连接到 GrovePi_Plus 的 D4 端口。

  • 步骤 4. 通过 USB 线缆将树莓派连接到 PC。

软件

note

如果您使用的是 树莓派配合 Raspberrypi OS >= Bullseye,您必须仅使用 Python3 来运行此命令行。

  • 步骤 1. 按照 设置软件 来配置开发环境。

  • 步骤 2. Git 克隆 Github 仓库。

cd ~
git clone https://github.com/DexterInd/GrovePi.git

  • 步骤 3. 执行以下命令来使用超声波测距传感器测量距离。
cd ~/GrovePi/Software/Python
python3 grove_ultrasonic.py

这里是 grove_ultrasonic.py 代码。

# GrovePi + Grove 超声波测距传感器

from grovepi import *

# 将 Grove 超声波测距传感器连接到数字端口 D4
# SIG,NC,VCC,GND

ultrasonic_ranger = 4

while True:
try:
# 从超声波传感器读取距离值
print ultrasonicRead(ultrasonic_ranger)

except TypeError:
print "Error"
except IOError:
print "Error"
  • 步骤 4. 我们将在终端上看到距离显示如下。
pi@raspberrypi:~/GrovePi/Software/Python $ python3 grove_ultrasonic.py
9
9
9
9
9
9
9
9
9
9
9

与 Wio Terminal 一起使用(ArduPy)

硬件

  • 步骤 1. 准备以下物品:
Wio TerminalGrove - 超声波测距传感器
enter image description hereenter image description here
立即获取立即获取
  • 步骤 2. 将 Grove - 超声波测距传感器连接到 Wio Terminal 的 D0 端口。

  • 步骤 3. 通过 USB Type-C 线缆将 Wio Terminal 连接到 PC。

软件

  • 步骤 1. 按照 ArduPy 入门指南 在 Wio Terminal 上配置 ArduPy 开发环境。

  • 步骤 2. 使用以下命令确保 ArduPy 固件包含超声波测距传感器 ArduPy 库。更多信息,请参考 这里

aip install Seeed-Studio/seeed-ardupy-ultrasonic-sensor
aip build
aip flash
  • 步骤 3. 复制以下代码并保存为 ArduPy-ultrasonic.py
from arduino import grove_ultra_ranger
from machine import LCD
from machine import Sprite
import time

Ultrasonic = grove_ultra_ranger(0)
lcd = LCD()
spr = Sprite(lcd) # 创建一个缓冲区

def main():
spr.createSprite(320, 240)
while True:
spr.setTextSize(2)
spr.fillSprite(spr.color.BLACK)
spr.setTextColor(lcd.color.RED)
spr.drawString("Ultrasonic Sensor", 55, 10)
spr.drawFastHLine(40, 35, 240, lcd.color.DARKGREY)
spr.setTextColor(lcd.color.WHITE)
spr.drawString("- Centimeters: ", 20, 50)
spr.drawString("- Inches: ", 20, 80)
spr.drawNumber(Ultrasonic.cm, 200,50)
time.sleep_ms(50) # 需要等待数据再次读取
spr.drawNumber(Ultrasonic.inch, 130,80)
spr.pushSprite(0,0)
time.sleep_ms(500)

print("前方障碍物的距离是:", Ultrasonic.cm, '厘米')
print("前方障碍物的距离是:", Ultrasonic.inch, '英寸')

if __name__ == "__main__":
main()
  • 步骤 4.ArduPy-ultrasonic.py 保存在您知道的位置。运行以下命令并替换 <YourPythonFilePath> 为您的 ArduPy-ultrasonic.py 位置。
aip shell -n -c "runfile <YourPythonFilePath>"
# 示例:
# aip shell -n -c "runfile /Users/ansonhe/Desktop/ArduPy-ultrasonic.py"
  • 步骤 5. 我们将在终端上看到距离显示如下,并在 Wio Terminal LCD 屏幕上显示。
ansonhe@Ansons-Macbook-Pro ~:aip shell -n -c "runfile /Users/ansonhe/Desktop/ArduPy-ultrasonic.py"
Positional argument (/dev/cu.usbmodem1413101) takes precedence over --open.
Connected to ardupy
前方障碍物的距离是: 3 厘米
前方障碍物的距离是: 1 英寸
前方障碍物的距离是: 7 厘米
前方障碍物的距离是: 2 英寸
前方障碍物的距离是: 6 厘米
前方障碍物的距离是: 2 英寸
前方障碍物的距离是: 6 厘米
前方障碍物的距离是: 2 英寸
前方障碍物的距离是: 4 厘米
前方障碍物的距离是: 1 英寸
前方障碍物的距离是: 7 厘米
前方障碍物的距离是: 2 英寸

常见问题

Q1: Grove超声波传感器是如何工作的?

  • A1: 当我们通过信号引脚提供超过10uS的脉冲触发信号时,Grove_Ultrasonic_Ranger将发出8个40kHz周期的电平并检测回声。回声信号的脉冲宽度与测量距离成正比。公式如下:距离 = 回声信号高电平时间 * 声速 (340M/S)/2。

Q2: 为什么Grove超声波传感器只有1个信号引脚,而其他超声波传感器有Trig和Echo引脚?

  • A2: Grove_Ultrasonic_Ranger的触发和回声信号通过MCU共享1个SIG引脚。

Q3: 我们可以将多个超声波传感器连接到一个Arduino吗?

  • A4: 可以,这里是示例,一个传感器连接到D2,另一个连接到D3。
#include "Ultrasonic.h"

Ultrasonic ultrasonic1(2);
Ultrasonic ultrasonic2(3);
void setup()
{
Serial.begin(9600);
}
void loop()
{
long RangeInCentimeters1;
long RangeInCentimeters2;

RangeInCentimeters1 = ultrasonic1.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(RangeInCentimeters1);//0~400cm
Serial.println(" cm");

RangeInCentimeters2 = ultrasonic2.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(RangeInCentimeters2);//0~400cm
Serial.println(" cm");

delay(250);
}

资源

项目

改造Seeed新办公室的楼梯: 将办公室的楼梯变成一个互动装置,甚至是向访客传达"仅限员工"信息的酷炫方式。

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...