Search Code

การวัดระยะด้วยเลเซอร์โมดูล VL53L0X 6 พินและจอแสดงผล TM1637 สำหรับ Arduino

การวัดระยะด้วยเลเซอร์โมดูล VL53L0X 6 พินและจอแสดงผล TM1637 สำหรับ Arduino


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

VL53L0X 200cm range sensor
TM1637 4 digit display module

เราจะกล่าวถึงฮาร์ดแวร์ที่จำเป็น คำแนะนำการเดินสายไฟ และโค้ดที่จำเป็นเพื่อให้ทุกอย่างทำงานได้อย่างสมบูรณ์ เมื่อจบบทช่วยสอนนี้ คุณจะมีอุปกรณ์วัดระยะทางที่ใช้งานได้จริงซึ่งสามารถนำไปประยุกต์ใช้ในงานต่างๆ ได้ สำหรับคำแนะนำแบบภาพ อย่าลืมดูวิดีโอที่ (ในวิดีโอที่ 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/IO2.6 V - 3.5 V
แรงดันไฟฟ้าจ่าย2.6 V - 5 V
อุณหภูมิการทำงาน-20 °C ถึง 70 °C
ช่วงการวัด30 มม. ถึง 2000 มม.
ความถี่ I2C400 kHz
การตั้งค่า Timeout500 ms
แพ็กเกจโมดูล 6 ขา

  • ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟเพียงพอ (5V เป็นที่ยอมรับได้)
  • เชื่อมต่อขา XSHUT เพื่อหลีกเลี่ยงการรั่วไหลด้วยตัวต้านทาน pull-up
  • ใช้ I2C ในการสื่อสาร เชื่อมต่อ SDA และ SCL อย่างเหมาะสม
  • จัดการกับ timeout ในโค้ดเพื่อหลีกเลี่ยงพฤติกรรมที่ไม่คาดคิด
  • คำนึงถึงช่วงอุณหภูมิการทำงานเพื่อความแม่นยำ

คำแนะนำการเดินสายไฟ

Arduino wiring for VL53L0X with TM1637 4 digit dispaly
Arduino wiring for VL53L0X with TM1637 4 digit dispaly

ในการเดินสายไฟ 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 ตรวจสอบให้แน่ใจว่าเชื่อมต่อพินที่ถูกต้องและเซนเซอร์ได้รับพลังงานอย่างเพียงพอเพื่อการวัดระยะทางที่แม่นยำ

ภาพ

VL53L0X 200cm range sensor
VL53L0X 200cm range sensor
TM1637 4 digit display module
TM1637 4 digit display module
Arduino wiring for VL53L0X with TM1637 4 digit dispaly
Arduino wiring for VL53L0X with TM1637 4 digit dispaly
104-Measure distance with a Laser VL53L0X 6-pin module and a TM1637 LED display for Arduino
ภาษา: C++
/* 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)

ไฟล์ Fritzing

คู่มือผู้ใช้

ไฟล์อื่น ๆ