โปรเจกต์มอนิเตอร์ระยะทางแบบไร้สาย ด้วยบอร์ด Arduino Uno และเซนเซอร์ TF-Luna LiDAR
สวัสดีชาว Maker และนักประดิษฐ์สาย IoT ทุกคนครับ! 💡 เวลาที่เราต้องทำโปรเจกต์เกี่ยวกับการวัดระยะทาง (เช่น วัดระดับน้ำในแทงก์, ทำระบบเตือนสิ่งกีดขวาง หรือระบบนับจำนวนของ) ปัญหาที่น่าปวดหัวที่สุดอย่างหนึ่งคือ "การเดินสายไฟ" ยาวๆ ใช่ไหมครับ?
วันนี้เรามีโปรเจกต์เจ๋งๆ ที่จะช่วยแก้ปัญหานั้นได้อย่างสวยงาม นั่นคือ "ระบบวัดระยะทางแบบไร้สาย (Wireless Distance Monitoring)" ที่ทำงานโดยใช้เซนเซอร์ TF-Luna LiDAR ร่วมกับบอร์ด Arduino Uno จากนั้นส่งข้อมูลผ่านอากาศด้วยโมดูลสื่อสารไร้สาย XBee S2C ไปแสดงผลบนคอมพิวเตอร์หรือบอร์ดตัวรับได้อย่างเรียลไทม์เลยครับ!
โปรเจกต์นี้ทำงานอย่างไร? (How It Works) ⚙️
หลักการทำงานของโปรเจกต์นี้เข้าใจง่ายมากๆ ครับ แบ่งเป็น 3 ส่วนหลักๆ:
เซนเซอร์ TF-Luna LiDAR (ทำงานแบบ I2C ที่ Address 0x10) จะยิงแสงเลเซอร์ออกไปวัดระยะทางอย่างต่อเนื่อง (วัดได้ตั้งแต่ 0.2 เมตร - 8 เมตร)
บอร์ด Arduino Uno จะทำหน้าที่เป็นสมองกล คอยสั่งการและดึงข้อมูล 7 bytes จากเซนเซอร์มาคำนวณหาระยะทาง จากนั้นแปลงเป็นข้อความสตริง (String) เช่น " D 120\n"
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) ให้ปลอดภัยกับบอร์ดครับ
▼ คลิกดูภาพประกอบการต่อวงจรและซอฟต์แวร์ XCTU ▲ ซ่อนรูปภาพประกอบ
การจัดเตรียมสายไฟและโมดูล Arduino สำหรับการทดสอบเบื้องต้น
อย่าลืม! ตั้งค่าโมดูล 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 ของคุณได้เลยครับ
#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 มืออาชีพได้นะครับ!
*คำเตือน: เนื้อหานี้เป็นการสรุปและแปลมาจากบทความ DIY โปรเจกต์ต้นฉบับภาษาอังกฤษ ข้อมูลสเปคฮาร์ดแวร์ การตั้งค่าผ่านโปรแกรม XCTU และโครงสร้างโค้ดอาจมีความคลาดเคลื่อน หรือต้องปรับเปลี่ยนให้เข้ากับเวอร์ชันของอุปกรณ์ที่คุณใช้งาน การต่อสายไฟผิดพลาด (เช่น จ่ายไฟ 5V เข้า XBee) อาจทำให้อุปกรณ์เสียหายถาวร ผู้ใช้งานควรใช้ความระมัดระวังและตรวจสอบผังวงจร (Datasheet) ของอุปกรณ์เสมอ สามารถตรวจสอบรายละเอียดเชิงเทคนิคแบบเต็มได้ที่เว็บไซต์ต้นฉบับที่แนบไว้ ก่อนลงมือทำโปรเจกต์