สร้างระบบวัดระยะทางไร้สายสุดล้ำ! ด้วย Arduino Uno, TF-Luna LiDAR และ XBee

Wireless Distance Monitoring with Arduino and LiDAR
โปรเจกต์มอนิเตอร์ระยะทางแบบไร้สาย ด้วยบอร์ด Arduino Uno และเซนเซอร์ TF-Luna LiDAR

สวัสดีชาว Maker และนักประดิษฐ์สาย IoT ทุกคนครับ! 💡 เวลาที่เราต้องทำโปรเจกต์เกี่ยวกับการวัดระยะทาง (เช่น วัดระดับน้ำในแทงก์, ทำระบบเตือนสิ่งกีดขวาง หรือระบบนับจำนวนของ) ปัญหาที่น่าปวดหัวที่สุดอย่างหนึ่งคือ "การเดินสายไฟ" ยาวๆ ใช่ไหมครับ?

วันนี้เรามีโปรเจกต์เจ๋งๆ ที่จะช่วยแก้ปัญหานั้นได้อย่างสวยงาม นั่นคือ "ระบบวัดระยะทางแบบไร้สาย (Wireless Distance Monitoring)" ที่ทำงานโดยใช้เซนเซอร์ TF-Luna LiDAR ร่วมกับบอร์ด Arduino Uno จากนั้นส่งข้อมูลผ่านอากาศด้วยโมดูลสื่อสารไร้สาย XBee S2C ไปแสดงผลบนคอมพิวเตอร์หรือบอร์ดตัวรับได้อย่างเรียลไทม์เลยครับ!

โปรเจกต์นี้ทำงานอย่างไร? (How It Works) ⚙️

หลักการทำงานของโปรเจกต์นี้เข้าใจง่ายมากๆ ครับ แบ่งเป็น 3 ส่วนหลักๆ:

  1. เซนเซอร์ TF-Luna LiDAR (ทำงานแบบ I2C ที่ Address 0x10) จะยิงแสงเลเซอร์ออกไปวัดระยะทางอย่างต่อเนื่อง (วัดได้ตั้งแต่ 0.2 เมตร - 8 เมตร)
  2. บอร์ด Arduino Uno จะทำหน้าที่เป็นสมองกล คอยสั่งการและดึงข้อมูล 7 bytes จากเซนเซอร์มาคำนวณหาระยะทาง จากนั้นแปลงเป็นข้อความสตริง (String) เช่น " D 120\n"
  3. Arduino จะส่งข้อความนี้ผ่านพอร์ต SoftwareSerial ไปยังโมดูล XBee S2C (ที่ถูกตั้งค่าเป็นโหมดโปร่งใส หรือ AT Mode) เพื่อยิงสัญญาณไร้สาย (ZigBee) ไปยัง XBee อีกตัวที่ฝั่งผู้รับครับ

💡 Maker's Tip: โปรเจกต์นี้เหมาะมากๆ สำหรับการเรียนรู้พื้นฐานโปรโตคอล I2C และการส่งข้อมูลไร้สายผ่าน UART

หากเพื่อนๆ กำลังมองหา บอร์ด Arduino Uno R3, เซนเซอร์ LiDAR (ToF), โมดูล Wireless หรือสายจั๊มเปอร์ แวะมาช้อปปิ้งอุปกรณ์ของแท้ คุณภาพดี พร้อมส่งได้ที่ Globalbyte เลยครับ! ของครบพร้อมลุยโปรเจกต์ทันที!

การต่อสายไฟ (Wiring & Pin Connections) 🔌

การต่อวงจรโปรเจกต์นี้ไม่ซับซ้อนครับ แบ่งเป็นการต่อเซนเซอร์และการต่อโมดูลไร้สาย:

1. ต่อเซนเซอร์ TF-Luna เข้ากับ Arduino Uno (I2C)

  • SDA → ต่อเข้าขา A4 (I2C Data)
  • SCL → ต่อเข้าขา A5 (I2C Clock)
  • GND → ต่อเข้าขา GND (สายกราวร่วม)
  • VCC (5V) → ต่อเข้าขา 5V (แหล่งจ่ายไฟ)

2. ต่อโมดูล XBee S2C เข้ากับ Arduino Uno (SoftwareSerial)

  • DOUT (TX ของ XBee) → ต่อเข้าขา D2 (RX ของ Arduino)
  • DIN (RX ของ XBee) → ต่อเข้าขา D3 (TX ของ Arduino)
  • GND → ต่อเข้าขา GND
  • VCC (3.3V) → ต่อเข้าขา 3.3V (⚠️ สำคัญมาก: XBee ใช้ไฟ 3.3V เท่านั้น ห้ามต่อ 5V เด็ดขาด!)

*แนะนำให้ใช้ XBee Shield หรือ XBee Breakout board เพื่อช่วยแปลงระดับสัญญาณลอจิก (Logic-level conversion) ให้ปลอดภัยกับบอร์ดครับ

 
Arduino Wiring Concept
การจัดเตรียมสายไฟและโมดูล Arduino สำหรับการทดสอบเบื้องต้น
XCTU Software Configuration
อย่าลืม! ตั้งค่าโมดูล XBee เบื้องต้น (Baud rate, PAN ID) ผ่านโปรแกรม Digi XCTU ก่อนนำมาต่อนะครับ

อธิบายโค้ดแบบ Step-by-Step 💻

การเขียนโปรแกรมของโปรเจกต์นี้ใช้ไลบรารีพื้นฐานที่มีมาให้ใน Arduino IDE อยู่แล้วครับ (ไม่ต้องโหลดเพิ่ม):

  • Step 1: เรียกใช้ <Wire.h> สำหรับการสื่อสาร I2C กับ LiDAR และ <SoftwareSerial.h> สำหรับจำลองพอร์ต Serial เพื่อคุยกับ XBee ที่ขา D2, D3
  • Step 2: ในฟังก์ชัน setup() ทำการเริ่ม I2C และกำหนด Baud rate ของ Serial Monitor และ XBee ไว้ที่ 9600
  • Step 3 & 4: เริ่มวงจร loop() โดยสั่งให้ Arduino ขอข้อมูลจำนวน 7 Bytes จากเซนเซอร์ที่ Address 0x10
  • Step 5: เมื่อได้ข้อมูลมาครบ จะนำข้อมูล Byte ที่ 0 และ Byte ที่ 1 มาต่อกันด้วยหลักการ Bit Shifting (data[1] << 8) | data[0] เพื่อให้ได้ค่าระยะทางเป็นเซนติเมตร
  • Step 6 & 7: แปลงตัวเลขที่ได้ให้กลายเป็นข้อความสตริง (String format) ด้วยคำสั่ง snprintf เพื่อให้ตัวรับปลายทางอ่านค่าได้ง่ายขึ้น
  • Step 8: ส่งข้อความผ่าน XBee.write() ขึ้นสู่อากาศ และรอ 1 วินาทีก่อนเริ่มรอบใหม่!

แจก Source Code ฉบับเต็ม! 🚀

คุณสามารถคัดลอกโค้ดด้านล่างนี้ไปลงใน Arduino IDE แล้วอัปโหลดเข้าบอร์ด Arduino Uno ของคุณได้เลยครับ

distance_xbee_01.ino (C/C++)
#include "SoftwareSerial.h"
#include <Wire.h>

byte deviceAddress = 0x10;  // The address of the TF-Luna device is 0x10
SoftwareSerial XBee(2,3);   // RX=2, TX=3

void setup() {
  Wire.begin();             // The I2C bus communication starts
  Serial.begin(9600);
  XBee.begin(9600);         // Set the baud rate of the serial port
}

void loop() {
  Wire.beginTransmission(deviceAddress);  // The I2C data transmission starts
  Wire.write(0x00);                       // Send command to fetch data
  Wire.endTransmission();                 // The I2C data transfer is complete

  Wire.requestFrom((uint8_t)deviceAddress, (uint8_t)7);  // Read 7 bytes of data 

  if (Wire.available() == 7) {            // Ensure 7 bytes are available
    byte data[7];
    for (int i = 0; i < 7; i++) {
      data[i] = Wire.read();              // Read data into an array
    }

    // Combine bytes to get Distance Value
    unsigned int distance = (data[1] << 8) | data[0];                   
    // Combine bytes to get Signal Strength
    unsigned int signalStrength = (data[3] << 8) | data[2];             

    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.print(" cm  \n");
    
    int A = distance;
    char distanceStr[10];
    snprintf(distanceStr, sizeof(distanceStr), " D %d\n", A);

    Serial.println(distanceStr);
                
    XBee.write(distanceStr); // Send string wirelessly via XBee
    delay(1000);             // Wait 1 second before next reading
  }
}

⚠️ ข้อควรระวังเพิ่มเติม (Tips & Precautions)

อย่าลืมเช็ค Baud rate ทั้งในโค้ด (9600) และการตั้งค่าบนโมดูล XBee ให้ตรงกันนะครับ และเพื่อประสิทธิภาพสูงสุด ควรวางโมดูล XBee ให้อยู่ในที่โล่งเพื่อป้องกันสัญญาณรบกวน (Signal interference)

ปล. หากโปรเจกต์ของคุณสเกลใหญ่ขึ้น ต้องการทำระบบ Custom ที่ซับซ้อน หรือเชื่อมต่อฐานข้อมูล คุณสามารถหาฟรีแลนซ์มาช่วยสานต่อไอเดียด้วยการ จ้างโปรแกรมเมอร์ Arduino มืออาชีพได้นะครับ!

อ้างอิงและเรียบเรียงข้อมูลจาก: Globalbyteshop Blog

แหล่งที่มาบทความต้นฉบับ: Hackster.io - Wireless Distance Monitoring with Arduino Uno, TF-Luna LiDAR

ดาวน์โหลดไฟล์โค้ด (.ino): distance_xbee_01.ino

*คำเตือน: เนื้อหานี้เป็นการสรุปและแปลมาจากบทความ DIY โปรเจกต์ต้นฉบับภาษาอังกฤษ ข้อมูลสเปคฮาร์ดแวร์ การตั้งค่าผ่านโปรแกรม XCTU และโครงสร้างโค้ดอาจมีความคลาดเคลื่อน หรือต้องปรับเปลี่ยนให้เข้ากับเวอร์ชันของอุปกรณ์ที่คุณใช้งาน การต่อสายไฟผิดพลาด (เช่น จ่ายไฟ 5V เข้า XBee) อาจทำให้อุปกรณ์เสียหายถาวร ผู้ใช้งานควรใช้ความระมัดระวังและตรวจสอบผังวงจร (Datasheet) ของอุปกรณ์เสมอ สามารถตรวจสอบรายละเอียดเชิงเทคนิคแบบเต็มได้ที่เว็บไซต์ต้นฉบับที่แนบไว้ ก่อนลงมือทำโปรเจกต์

 

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี