在整理 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); }
請問超聲波感測器有需要跟杜邦線焊接嗎
回覆刪除不用喔 超音波模組,一般都是有杜邦公端子 給你插杜邦線
刪除張貼留言