超声波传感器与Arduino接口


在本教程中,我们将超声波传感器HC-SR04与Arduino连接,以厘米为单位获取到表面的距离。

电路图

如您所见,您需要将HC-SR04的Vcc引脚连接到5V,GND连接到GND,Trig引脚连接到Arduino Uno的7号引脚,Echo引脚连接到6号引脚。实际上您可以选择任何GPIO引脚,而不仅仅是7号和6号引脚。您只需要确保代码中的定义正确。

HC-SR04的工作原理

HC-SR04以40,000 Hz的频率发射超声波。为了使其发射波,我们需要在触发引脚上施加10微秒的高电平脉冲。模块会响应发射8个脉冲的声波脉冲。这8个脉冲模式有助于将模块发射的脉冲与环境噪声区分开来。一旦脉冲发射,ECHO引脚变为高电平,并保持高电平,直到所有反射脉冲都被接收。如果在此期间内未接收到所有反射脉冲,模块将在38毫秒后超时。

以下时序图解释了模块的行为:

Echo引脚保持高电平的时间可以帮助确定传感器与反射表面的距离。空气中的声速为340 m/s,或每微秒0.034厘米。如果ECHO引脚保持高电平100微秒,则波浪传播的距离为:100 * 0.034 = 3.4厘米。因此,到表面的距离为3.4 / 2 = 1.7厘米(因为波浪从表面反射回来并再次覆盖相同的距离)。

您可以此处了解更多关于超声波传感器工作原理的信息。

示例

完整的代码如下:

#define echoPin 6
#define triggerPin 7

void setup() {
   pinMode(triggerPin, OUTPUT);       // Sets the trigPin as an OUTPUT
   pinMode(echoPin, INPUT);          // Sets the echoPin as an INPUT
   Serial.begin(9600);             // Serial Communication is starting with 9600 of baudrate speed
   Serial.println("Ultrasonic Sensor HC-SR04 Test"); // print some text in Serial Monitor

   Serial.println("with Arduino UNO");
}
void loop() {
   long highPulseDuration;
   int calculatedDistanceCm;

   //Set the trigPin to low, before setting it to high for the pulse
   digitalWrite(triggerPin, LOW);
   delayMicroseconds(5);

   // Create the 10 seconds pulse on the trig pin
   digitalWrite(triggerPin, HIGH);
   delayMicroseconds(10);

   // Set the pin to low to end the pulse
   digitalWrite(triggerPin, LOW);

   // Read the duration of the high pulse on the echo pin
   highPulseDuration = pulseIn(echoPin, HIGH);

   // Calculating the distance
   calculatedDistanceCm = highPulseDuration * 0.034 / 2; // Speed of
   sound wave divided by 2 (go and back)

   // Displays the distance on the Serial Monitor
   Serial.print("Calculated Distance: ");
   Serial.print(calculatedDistanceCm);
   Serial.println(" cm");
}

如您所见,我们首先定义回波和触发引脚。

#define echoPin 6
#define triggerPin 7

在setup函数中,我们将echoPin设置为输入,触发引脚设置为输出,并初始化Serial。

void setup() {
   pinMode(triggerPin, OUTPUT); // Sets the trigPin as an OUTPUT
   pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
   Serial.begin(9600); // Serial Communication is starting with 9600 of baudrate speed
   Serial.println("Ultrasonic Sensor HC-SR04 Test"); // print some text in Serial Monitor
   Serial.println("with Arduino UNO");
}

在loop函数中,我们执行以下操作:

  • 定义用于测量高电平脉冲持续时间的变量

  • 清除触发引脚(将其设置为低电平),然后将其设置为高电平10微秒,然后再次设置为低电平。这会产生来自触发引脚的10微秒高电平脉冲。

  • 接下来,我们使用**pulseIn**函数记录回波引脚上高电平脉冲的持续时间。您可以此处阅读更多关于**pulseIn**函数的信息。

  • 根据ECHO引脚脉冲的持续时间,我们计算出到反射表面的距离,并以厘米为单位打印出来。

void loop() {
   long highPulseDuration;
   int calculatedDistanceCm;

   //Set the trigPin to low, before setting it to high for the pulse
   digitalWrite(triggerPin, LOW);
   delayMicroseconds(5);

   // Create the 10 seconds pulse on the trig pin
   digitalWrite(triggerPin, HIGH);
   delayMicroseconds(10);

   // Set the pin to low to end the pulse
   digitalWrite(triggerPin, LOW);

   // Read the duration of the high pulse on the echo pin
   highPulseDuration = pulseIn(echoPin, HIGH);

   // Calculating the distance
   calculatedDistanceCm = highPulseDuration * 0.034 / 2; // Speed of
   sound wave divided by 2 (go and back)
   
   // Displays the distance on the Serial Monitor
   Serial.print("Calculated Distance: ");
   Serial.print(calculatedDistanceCm);
   Serial.println(" cm");
}

更新于:2021年5月31日

4K+ 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告