การวัดระยะด้วยเลเซอร์โมดูล VL53L0X 6 พินและจอแสดงผล TM1637 สำหรับ Arduino
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการวัดระยะทางโดยใช้เซนเซอร์วัดระยะด้วยเลเซอร์ VL53L0X และแสดงค่าที่อ่านได้บนจอแสดงผล 7 ส่วน TM1637 โปรเจกต์นี้รวมส่วนประกอบทั้งสองเข้าด้วยกันเพื่อสร้างเครื่องมือวัดระยะทางที่เรียบง่ายแต่มีประสิทธิภาพ VL53L0X ใช้เทคโนโลยีเลเซอร์เพื่อให้ค่าการวัดระยะทางที่แม่นยำ ในขณะที่จอแสดงผล TM1637 จะแสดงค่าที่อ่านได้ในรูปแบบที่ใช้งานง่าย


เราจะกล่าวถึงฮาร์ดแวร์ที่จำเป็น คำแนะนำการเดินสายไฟ และโค้ดที่จำเป็นเพื่อให้ทุกอย่างทำงานได้อย่างสมบูรณ์ เมื่อจบบทช่วยสอนนี้ คุณจะมีอุปกรณ์วัดระยะทางที่ใช้งานได้จริงซึ่งสามารถนำไปประยุกต์ใช้ในงานต่างๆ ได้ สำหรับคำแนะนำแบบภาพ อย่าลืมดูวิดีโอที่ (ในวิดีโอที่ 00:00)
อธิบายฮาร์ดแวร์
ส่วนประกอบหลักสำหรับโปรเจกต์นี้คือเซนเซอร์วัดระยะด้วยเลเซอร์ VL53L0X และโมดูลจอแสดงผล TM1637 VL53L0X เป็นเซนเซอร์แบบ time-of-flight ที่วัดระยะทางไปยังวัตถุโดยการปล่อยลำแสงเลเซอร์และคำนวณเวลาที่แสงสะท้อนกลับมา เซนเซอร์นี้ทำงานในช่วงแรงดันไฟฟ้า 2.6V ถึง 3.5V แต่สามารถทำงานกับ 5V ได้เช่นกันเนื่องจากมีตัวควบคุมแรงดันไฟฟ้าในตัว
TM1637 เป็นไดรเวอร์จอแสดงผลที่ควบคุมจอ LED แบบ 7 ส่วน โดยสื่อสารผ่านอินเทอร์เฟซ 2 สายที่เรียบง่าย (CLK และ DIO) ทำให้ง่ายต่อการเชื่อมต่อกับ Arduino จอแสดงผลสามารถแสดงค่าตัวเลขและเหมาะอย่างยิ่งสำหรับการแสดงผลการวัดระยะทางจากเซนเซอร์ VL53L0X
รายละเอียดจาก Datasheet
| ผู้ผลิต | STMicroelectronics |
|---|---|
| หมายเลขชิ้นส่วน | VL53L0X |
| แรงดันไฟฟ้า Logic/IO | 2.6 V - 3.5 V |
| แรงดันไฟฟ้าจ่าย | 2.6 V - 5 V |
| อุณหภูมิการทำงาน | -20 °C ถึง 70 °C |
| ช่วงการวัด | 30 มม. ถึง 2000 มม. |
| ความถี่ I2C | 400 kHz |
| การตั้งค่า Timeout | 500 ms |
| แพ็กเกจ | โมดูล 6 ขา |
- ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟเพียงพอ (5V เป็นที่ยอมรับได้)
- เชื่อมต่อขา XSHUT เพื่อหลีกเลี่ยงการรั่วไหลด้วยตัวต้านทาน pull-up
- ใช้ I2C ในการสื่อสาร เชื่อมต่อ SDA และ SCL อย่างเหมาะสม
- จัดการกับ timeout ในโค้ดเพื่อหลีกเลี่ยงพฤติกรรมที่ไม่คาดคิด
- คำนึงถึงช่วงอุณหภูมิการทำงานเพื่อความแม่นยำ
คำแนะนำการเดินสายไฟ

ในการเดินสายไฟ VL53L0X และจอแสดงผล TM1637 ให้เริ่มต้นโดยเชื่อมต่อขา VCC ของ VL53L0X เข้ากับขา 5V บน Arduino และขา GND เข้ากับขากราวด์บน Arduino จากนั้นเชื่อมต่อขา SDA ของ VL53L0X เข้ากับขา A4 บน Arduino ซึ่งโดยทั่วไปใช้สำหรับการสื่อสารข้อมูล I2C ขา SCL ควรเชื่อมต่อกับขา A5 บน Arduino ซึ่งใช้สำหรับสัญญาณนาฬิกา
สำหรับจอแสดงผล TM1637 ให้เชื่อมต่อขา CLK เข้ากับดิจิทัลพิน 2 บน Arduino และขา DIO เข้ากับดิจิทัลพิน 3 สุดท้าย เชื่อมต่อขา XSHUT ของ VL53L0X เข้ากับดิจิทัลพิน 12 บน Arduino ตรวจสอบให้แน่ใจว่าขาที่ไม่ได้ใช้ เช่น GPIO1 บน VL53L0X ปล่อยไว้โดยไม่เชื่อมต่อ การตั้งค่านี้จะช่วยให้ Arduino สื่อสารกับทั้งเซนเซอร์และจอแสดงผลได้อย่างมีประสิทธิภาพ
ตัวอย่างโค้ดและคำอธิบาย
โค้ดจะเริ่มต้นเซนเซอร์และจอแสดงผล ตั้งค่าการสื่อสาร I2C และอ่านค่าการวัดระยะทางอย่างต่อเนื่อง ด้านล่างเป็นตัวอย่างฟังก์ชัน setup ที่มีการกำหนดค่าพินและเริ่มต้นเซนเซอร์:
void setup() {
pinMode(12, INPUT_PULLUP); // ตั้งค่าพิน 12 เป็นอินพุต
digitalWrite(12, HIGH); // ตั้งค่าพิน 12 เป็น HIGH (5V)
Serial.begin(9600);
Wire.begin(); // เริ่มต้นการสื่อสาร I2C
sensor.init(); // เริ่มต้นเซนเซอร์วัดระยะทาง
sensor.setTimeout(500); // ตั้งค่า timeout
sensor.startContinuous(); // ตั้งค่าประเภทการวัด
}
ในฟังก์ชัน setup นี้ ขา XSHUT ถูกกำหนดค่าเป็นอินพุตพร้อมตัวต้านทาน pull-up และเซนเซอร์ถูกเริ่มต้นสำหรับการวัดระยะแบบต่อเนื่อง จอภาพ serial ก็ถูกตั้งค่าเพื่อแสดงค่าการวัดระยะทางเช่นกัน
ถัดไป ลูปหลักจะอ่านระยะทางและอัปเดตจอแสดงผล นี่คือตัวอย่างบางส่วนจากฟังก์ชัน loop:
void loop() {
int distance = sensor.readRangeContinuousMillimeters(); // อ่านระยะทางเป็นมิลลิเมตร
display.setSegments(clearLED); // ลบค่าก่อนหน้าจากจอ LED
display.showNumberDec(distance, false, 4, 0); // แสดงระยะทาง
Serial.print("Distance: ");
Serial.print(distance); // พิมพ์ระยะทางบน serial monitor
}
ลูปนี้จะอ่านระยะทางจากเซนเซอร์อย่างต่อเนื่องและอัปเดตจอแสดงผล TM1637 ด้วยค่าการวัดล่าสุด นอกจากนี้ยังพิมพ์ระยะทางไปยัง serial monitor เพื่อใช้ในการดีบัก หากคุณต้องการดูโค้ดเต็มรูปแบบ โค้ดจะโหลดด้านล่างบทความนี้
การสาธิต / สิ่งที่คาดหวัง
เมื่อเสร็จสิ้นการตั้งค่าและอัปโหลดโค้ด คุณควรเห็นระยะทางที่วัดโดย VL53L0X แสดงบนจอ TM1637 เมื่อคุณขยับวัตถุเข้าใกล้หรือไกลจากเซนเซอร์ ค่าที่แสดงจะเปลี่ยนแปลงตามไปด้วย หากคุณพบค่าที่อ่านได้ผิดปกติ ตรวจสอบให้แน่ใจว่าเซนเซอร์ไม่มีสิ่งกีดขวางและพื้นผิวของวัตถุเหมาะสมต่อการสะท้อนเลเซอร์ (ในวิดีโอที่ 09:30)
ปัญหาที่พบบ่อย ได้แก่ การเดินสายไฟกลับด้านหรือการเริ่มต้นเซนเซอร์ไม่ถูกต้อง ซึ่งอาจทำให้เกิดข้อผิดพลาด timeout ตรวจสอบให้แน่ใจว่าเชื่อมต่อพินที่ถูกต้องและเซนเซอร์ได้รับพลังงานอย่างเพียงพอเพื่อการวัดระยะทางที่แม่นยำ
/* This example shows how to use continuous mode to take readings.
This is Arduino code to measure distance with VL53L0X and display it on a TM1637 LED 7-segment display.
Original Laser Sensor source: https://github.com/adafruit/Adafruit_VL53L0X
Modified by Ahmad Shamshiri for RoboJax.com
Date modified: May 31, 2018 at 19:25 in Ajax, Ontario, Canada
You have to watch 1 video before using this code:
1- Watch VL53L0X video and get code https://youtu.be/1n9eJ9HaYpE
2- Watch TM1637 video and get code https://robojax.com?vid=robojax-TM1637
You can get this code from Robojax.com
Pin connection
VL53L0X Pin Arduino Pin
VCC 5V
GND GND
SDA A4 or SDA if available
SCL A5 or SCL if available
GPIO1 leave it unconnected
XSHUT D12 (digital 12 or pin 12)
*/
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
/////// start of TM1637 Display
#include <Arduino.h>
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
#define TEST_DELAY 500
TM1637Display display(CLK, DIO);
uint8_t clearLED[] = { 0x0, 0x0, 0x0, 0x0 }; // value for clearing the LEDs
////// End of TM1637 Display
void setup()
{
pinMode(12,INPUT_PULLUP);// set pin 12 for input
digitalWrite(12,HIGH);// set pin 12 high (5V)
Serial.begin(9600);
Wire.begin();// I2C communication initialized
sensor.init();// distance sensor is initialized
sensor.setTimeout(500); // time out is set
// Start continuous back-to-back mode (take readings as
// fast as possible). To use continuous timed mode
// instead, provide a desired inter-measurement period in
// ms (e.g. sensor.startContinuous(100)).
sensor.startContinuous();// type of measurement is set
Serial.println("VL53L0X with MAX6675 test");
delay(500);
display.setBrightness(0x0f);// set brightness for display
}
void loop()
{
int distance =sensor.readRangeContinuousMillimeters();// read the distance in mm
display.setSegments(clearLED);// remove previous value from LED display
display.showNumberDec(distance, false, 4, 0);// display the distance
//distance = distance;
Serial.print("Distance: ");
Serial.print(distance);// print distance on serial monitor
Serial.print("mm");
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
delay(100);
}
แหล่งข้อมูลและเอกสารอ้างอิง
ยังไม่มีทรัพยากรเลย
ไฟล์📁
แผ่นข้อมูล (pdf)
-
TM1637 แผ่นข้อมูล
/download/datasheet/robojax_TM1637_datasheet.pdf0.67 MB
ไฟล์ Fritzing
-
TM1637 Seven Segment module
TM1637.fzpz0.01 MB -
TM1637 4 digit seven segment display
TM1637-1.fzpz0.01 MB -
Adafruit VL6180X Time of Flight Distance SensorFritzing part for the Adafruit VL6180X Time of Flight distance sensor. This sensor measures absolute distance up to 100mm and ambient light, communicating via I2C. Includes the sensor breakout board and pin connections for use in Fritzing projects.
Adafruit VL6180X Time of Flight Distance Sensor-1.fzpz0.02 MB
คู่มือผู้ใช้
-
คู่มือการแสดงผล TM1637
robojax-TM1637_display_manual.pdf0.31 MB
ไฟล์อื่น ๆ
-
ห้องสมุด Polou VL53L0X
robojax-VL53L0X-polou-arduino-master.zip0.02 MB -
VL53L0X_Distance_sensor_purple
VL53L0X_Distance_sensor_purple.fzpz0.01 MB