超声波传感器与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"); }