在整理 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具有業內最好的環境光抗干擾性能,將環境光的影響降至最低。產品規格如下:
實作分成兩個部分,一是先將 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
[材料]
- Arduino UNO x1
- HC-SR04 x1
- LCD1602液晶顯示器
- I2C/介面 LCD1602轉接板 PCF8574
- 麵包板 x1
- 排線 n 條
[安裝 Library]
本實作需要安裝以下程式庫,可以在 Arduini IDE 介面中選擇「程式庫管理」進行安裝。有關程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[線路圖]
| Arduino UNO | HC-SR04 | LCD1602 | VL53L0X |
|---|---|---|---|
| 5V | VCC | VCC | VCC |
| GND | GND | GND | GND |
| A4(SDA) | - | - | SDA |
| A5(SCL) | - | - | SCL |
| D12 | 2-Trigger | - | - |
| D11 | 3-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);
}


請問超聲波感測器有需要跟杜邦線焊接嗎
回覆刪除不用喔 超音波模組,一般都是有杜邦公端子 給你插杜邦線
刪除張貼留言