You are currently viewing 帶有Arduino的超聲波傳感器HC-SR04完整指南

帶有Arduino的超聲波傳感器HC-SR04完整指南

本文是有關超聲波傳感器HC – SR04的指南。我們將解釋它的工作原理,向您展示其某些功能,並分享一個您可以遵循的Arduino項目範例,以將其結合到您的項目中。我們提供了有關如何連接超聲波傳感器的示意圖,以及與Arduino一起使用的範例草圖。

描述

HC-SR04超音波感測器像蝙蝠一樣使用聲納來確定到物體的距離。它以易於使用的包裝提供出色的非接觸範圍檢測,具有高精度和穩定的讀數。它帶有超音波發射器和接收器模組。

特徵

以下是HC-SR04超音波感測器的一些功能和規格列表:

  • 電源:+ 5V DC
  • 靜態電流:<2mA
  • 工作電流:15mA
  • 有效角度:<15°
  • 測距距離:2cm – 400 cm / 1“ – 13ft
  • 分辨率:0.3厘米
  • 測量角度:30度
  • 觸發輸入脈衝寬度:10uS
  • 尺寸:45mm x 20mm x 15mm

它是如何工作的?

超音波感測器使用聲納來確定到物體的距離。這是發生了什麼:

  1. 發射器(觸發針)發送信號:高頻聲音。
  2. 當信號找到一個物體時,它會被反射並…
  3. ……發射器(回波引腳)接收它。

信號發送和接收之間的時間使我們能夠計算到物體的距離。這是可能的,因為我們知道聲音在空氣中的速度。

HC-SR04超音波感測器引腳

引腳

  • VCC:+ 5VDC
  • Trig:觸發(Input)
  • Echo:迴聲(Output)
  • GND:地線

帶有HC–SR04的Arduino感測器

該感測器在Arduino 超小型單板電腦中非常受歡迎。因此,在這裡,我們提供了有關如何在Arduino上使用HC-SR04超音波感測器的範例。在該項目中,超音波感測器在串行序列監視器中讀取並寫入到對象的距離。

該項目的目的是幫助您了解該感測器的工作原理。然後,您應該能夠在自己的項目中使用此示例。

注意:有一個名為NewPing的Arduino庫,可以在使用此傳感器時使您的案件更輕鬆。

所需零件

  • Arduino UNO 
  • 超音波感測器(HC-SR04)
  • 麵包板
  • 跳線

原理圖

下表顯示了您需要建立的連接:

超音波感測器HC-SR04Arduino端
VCC5V
Trigpin 11
echopin 12
GNDGND

程式碼

/*
 * Terry Lee, http://honeststore.com.tw
 * 
 *  超音波感測器接線如下:
        VCC: +5VDC
        Trig : Trigger (INPUT) - Pin11
        Echo: Echo (OUTPUT) - Pin 12
        GND: GND
 */
 
int trigPin = 11;    // Trigger
int echoPin = 12;    // Echo
long duration, cm, inches;
 
void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop() {
  // 感測器由10或更多微秒的高脈衝觸發。
  // 預先給出短脈衝,以確保清潔高脈衝:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  // 從感測器讀取信號:高脈衝
  // 持續時間是發送中的時間(以微秒為單位)
  // ping接收其回聲的對象。
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // 將時間轉換為距離
  cm = (duration/2) / 29.1;     // 除以29.1或乘以0.0343
  inches = (duration/2) / 74;   // 除以74或乘以0.0135
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
  delay(250);
}

程式碼如何工作

首先,您為Trig和Echo引腳分別分別建立變數,稱為 trigPin 和 echoPin。trigPin引腳連接到pin 11,而echoPin連接到 pin 12

int trigPin = 11; 
int echoPin = 12;

您還將建立三個long類型的變數: duration, cm, inches。duration變數儲存發射和接收信號之間的時間。cm 變數將以厘米為單位保存距離,而 inches 變數將以英寸為單位保存距離。

long duration, cm, inches;

在 setup()裡面,以9600的波特率初始化串行端口,並將trigPin引腳設置為輸出,並將echoPin引腳設置為輸入。

//Serial Port begin
Serial.begin (9600);
//Define inputs and outputs
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

在 loop()裡面,通過發送10微秒的HIGH脈衝來觸發感測器。但是,在此之前,請提供一個短的LOW脈衝,以確保獲得乾淨的HIGH脈衝:

digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

然後,您可以從感測器讀取信號-一個HIGH脈衝,其持續時間是從信號發送到接收到物體的回波之間的時間(以微秒為單位)。

duration = pulseIn(echoPin, HIGH);

最後,您只需要將持續時間轉換為距離即可。我們可以使用以下公式計算距離:

distance = (traveltime/2) x speed of sound

The speed of sound is: 343m/s = 0.0343 cm/uS = 1/29.1 cm/uS

Or in inches: 13503.9in/s = 0.0135in/uS = 1/74in/uS

我們需要將 traveltime 除以2,因為我們必須考慮到波浪已發送,撞擊物體,然後返回到感測器。

cm = (duration/2) / 29.1;
inches = (duration/2) / 74;

最後,我們在串行序而監視器中印出結果:

Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();

NewPing的源始碼

您也可以使用NewPing庫。在此處下載庫。 安裝NewPin庫後,您可以上傳下面提供的代碼。
/*
 * Posted on https://randomnerdtutorials.com
 * created by http://playground.arduino.cc/Code/NewPing
*/

#include <NewPing.h>
 
#define TRIGGER_PIN 11
#define ECHO_PIN 12
#define MAX_DISTANCE 200

// NewPing setup of pins and maximum distance
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
 
void setup() {
   Serial.begin(9600);
}
 
void loop() {
   delay(50);
   unsigned int distance = sonar.ping_cm();
   Serial.print(distance);
   Serial.println("cm");
}

程式碼如何工作

使用NewPing庫獲取得到物體距離要簡單很多。 首先包括NewPing庫:
#include <NewPing.h>
然後,定義Trig和Echo引腳。trigPin引腳連接到Arduino Pin 11,而echoPin到 pin 12。您還需要定義MAX_DISTANCE 變數才能使用該庫。
#define TRIGGER_PIN 11
#define ECHO_PIN 12
#define MAX_DISTANCE 200
然後,您建立一個 NewPing 聲納的實體 :
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
設置()裡面,則以9600的波特率初始化序列通信。
Serial.begin(9600);
最後,在 loop(),要獲取距離,您只需使用聲納上的 ping_cm() 上的方法。就可以得到以厘米為單位的距離。
unsigned int distance = sonar.ping_cm();
如果您想得到以英寸為單位的距離,則可以使用 sonar.ping_in()

故障排除

注意:“如果HC-SR04沒有收到echo,則輸出永遠不會變低。Devantec和Parallax感測器分別在36ms和28ms之後超時。如果您按上述方式使用Pulsin,則沒有返回顯示,程序將暫停1秒鐘,這是Pulsin的預設時間。您需要使用timeout參數。

http://arduino.cc/en/Reference/PulseIn
HC-SR04無法工作到超過10英尺距離,因此總路徑長度為20英尺,路徑時間約為20ms,因此請將超時設置為25或30ms以上。

如果您在E和T之間放置一個電阻,比如說2k2,則僅連接到T,您可以僅從一個Arduino引腳使用HC-SR04。這方面可以查詢超音波感測器的single pin operation。

另外,如果您將HC-SR04與PicAxe配合使用,則需要將時鐘速度提高到至少8MHz,否則它們將看不到回波脈衝的開始,因此脈衝輸入將永遠不會開始。HC-SR04與BS2配合良好。by David Buckley

總結

在本文中,我們向您展示了HC-SR04超音波感測器的工作原理,以及如何將其與Arduino一起使用。對於這一個項目範例,您可以建立一個帶有LED和蜂鳴器的停車傳感器。

如果您是Arduino的初學者,我們建議您遵循Arduino迷你課程,該課程將幫助您快速開始使用這款出色的電路板。

如果您喜歡Arduino,則可能還喜歡:

  • Arduino分步項目課程
  • Arduino的SD卡模塊指南
  • 帶Arduino的DHT11 / DHT22濕度和溫度傳感器指南
  • 帶有Arduino的TCS230 / TCS3200顏色傳感器指南

您可以在此處找到我們所有的Arduino項目和教程。

我們希望您對本教程有所幫助。謝謝閱讀。

發佈留言