Arduino筆記(96):HC-SR04與VL53L0X(GY-530)的測距比較

在整理 Arduino 相關的實作過程中,發現很多朋友喜歡這篇文章:Arduino筆記(19):HC-SR04超音波測距模組,跟我最近買的一個雷射測距感測器 VL53L0X(GY-530) 一樣具有測距離的功能,是根據雷射光束折射來回的時間計算出距離。既然都是測距離,想比較看看使用超音波的 HC-SR04 跟雷射測距哪個比較準確?

實作分成兩個部分,一是先將 HC-SR04 測距的結果,顯示在 LCD1602 上,再接上 VL53L0X(GY-530),將其並排在 HC-SR04 旁,同樣顯示測得的距離在 LCD1602上,比較兩個值的差距為何?

VL53L0X常被用在飛行時間 ToF(Time-of-Flight)的測量上,同時也是首款使用 940 納米VCSEL 光源、SPAD光子檢測器和先進微控制器(管理整個測距功能)的測距智能傳感器。配合先進的紅外濾波器,VL53L0X具有業內最好的環境光抗干擾性能,將環境光的影響降至最低。產品規格如下:
  • 使用晶片:意法半導體(ST)VL53L0X
  • 供電電源:DC 2.8-5v
  • 通信方式:IIC通信協定(完全相容3-5v系統)
  • 模組尺寸:10.5mm*13.3mm ,安裝孔3mm
  • 測距範圍:30 ~ 2000mm
  • 測距精度:±5% (高速模式),±3% (高精度模式)
  • 測距時間(min):20ms (高速模式),200ms(高精度模式)
  • 測距角度:25°
  • 雷射波長:940nm
  • 工作温度:-20 ~ 70°C
VL53L0X 有多種模式可設定,預設資料更新時間為 30ms,可測距離約 1.2公尺,如果設定為高精確度,資料更新時間為 200ms,精確度約為±3%,但如果設定為高速,資料更新時間為 20ms 時,精確度約為±5%。可依照使用的情境設定不同的模式。

[材料]

  • Arduino UNO  x1
  • HC-SR04 x1
  • LCD1602液晶顯示器
  • I2C/介面 LCD1602轉接板 PCF8574
  • 麵包板 x1
  • 排線 n 條

[安裝 Library]

本實作需要安裝以下程式庫,可以在 Arduini IDE 介面中選擇「程式庫管理」進行安裝。
有關程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[線路圖]

Arduino UNOHC-SR04LCD1602VL53L0X
5VVCCVCCVCC
GNDGNDGNDGND
A4(SDA)--SDA
A5(SCL)--SCL
D122-Trigger--
D113-Echo--
SDA-SDA-
SCL-SCL-




[程式一]

將 HC-SR04 距離測試結果顯示在 LCD1602 上:
#include <LiquidCrystal_I2C.h>   // 引用 LiquidCrystal_I2C Library
LiquidCrystal_I2C lcd(0x27,16,2);  // 設定 LCD 位址為 0x27,有 16 個字元 2 列

int trigPin = 12;                  //Trig Pin
int echoPin = 11;                  //Echo Pin
float duration, cm, inches;
 
void setup() {
  Serial.begin (9600);             // Serial Port begin
  pinMode(trigPin, OUTPUT);        //Define inputs and outputs 
  pinMode(echoPin, INPUT);
  lcd.init();                // 初始化 lcd 
  lcd.backlight();           // 設定背板為亮  
  lcd.clear();         
}
 
void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);     // 給 Trig 高電位,持續 10微秒
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);             // 讀取 echo 的電位
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間

  cm = (duration/2) / 29.1;         // 將時間換算成距離 cm 或 inch  
  inches = (duration/2) / 74; 

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

  lcd.setCursor(0,0);  
  lcd.print("SR-04:"); 
  lcd.print(cm); 
  lcd.print("cm");   
  lcd.print("  ");  

  lcd.setCursor(0,1);
  lcd.print("     :");
  lcd.print(inches);      
  lcd.print("in");   
  lcd.print("  ");  
    
  delay(250);
}

[程式二]

將 HC-SR04 及 GY-530(VL53L0X) 距離測試結果顯示在 LCD1602 上下兩排:
#include <LiquidCrystal_I2C.h>   // 引用 LiquidCrystal_I2C Library
#include <Wire.h>
#include <VL53L0X.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // 設定 LCD 位址為 0x27,有 16 個字元 2 列
VL53L0X sensor;

// 可設定為高速或高精度
//#define HIGH_SPEED
#define HIGH_ACCURACY

int trigPin = 12;                  //Trig Pin
int echoPin = 11;                  //Echo Pin
float duration, cm, inches, vl_cm;
 
void setup() {
  Serial.begin (9600);
  Wire.begin();  
  pinMode(trigPin, OUTPUT);   //設定為輸入及輸出 
  pinMode(echoPin, INPUT);
  lcd.init();                // 初始化 lcd 
  lcd.backlight();           // 設定背板為亮  
  lcd.clear();   

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  #if defined LONG_RANGE
      // lower the return signal rate limit (default is 0.25 MCPS)
      sensor.setSignalRateLimit(0.1);
      // 增加雷射脈衝區間(預設是 14 及 10 PCLKs)
      sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
      sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
   #endif

   #if defined HIGH_SPEED
      // 減少時間至 20 ms (預設約為 33 ms)
      sensor.setMeasurementTimingBudget(20000);
   #elif defined HIGH_ACCURACY
      // 增加時間至 200 ms
      sensor.setMeasurementTimingBudget(200000);
   #endif
}
 
void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);     // 給 Trig 高電位,持續 10微秒
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  pinMode(echoPin, INPUT);             // 讀取 echo 的電位
  duration = pulseIn(echoPin, HIGH);   // 收到高電位時的時間

  cm = (duration/2) / 29.1;         // 將時間換算成距離 cm 或 inch  
  inches = (duration/2) / 74; 

  Serial.print("Distance : ");  
  Serial.print(inches);
  Serial.print(" in,     ");
  Serial.print(cm);
  Serial.print(" cm");
  Serial.print("       ");

  vl_cm = sensor.readRangeSingleMillimeters()/10.0;  //換算成公分
  Serial.print(vl_cm);
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
  
  lcd.setCursor(0,0);  
  lcd.print(" SR-04:"); 
  lcd.print(cm); 
  lcd.print("cm");   
  lcd.print("  ");  

  lcd.setCursor(0,1);
  lcd.print("VL53L0:");
  lcd.print(vl_cm);      
  lcd.print("cm");   
  lcd.print("  ");  
    
  delay(250);
}

[結果]

實測結果 HC-SR04 使用超音波的方式偵測音波來回的時間,換算成距離,在測試過程中比較準確。而 VL53L0X 在規格書中提到多個影響其偵測的關鍵要素,如物體反射率,白色的反射效果比深色的好,另一個影響的要素是感測角度,雷射光以以35°角射出,形成一個圓錐型,而接收的感測角度是25°,也就是 VL53L0X 的放置方式與被測量物體間的角度會影響距離,實測的結果也是如此。


[參考資料]

2 留言

  1. 請問超聲波感測器有需要跟杜邦線焊接嗎

    回覆刪除
    回覆
    1. 不用喔 超音波模組,一般都是有杜邦公端子 給你插杜邦線

      刪除

張貼留言

較新的 較舊