title: "การพัฒนาเซ็นเซอร์ตรวจจับทิศทางด้วย ADXL345 และ Arduino Nano"
บทนำและที่มาของโปรเจกต์
จุดเริ่มต้นของโปรเจกต์นี้มาจากความต้องการที่จะสร้าง "Digital Hourglass" ซึ่งเป็นโปรเจกต์ยอดนิยมในกลุ่ม Maker อย่างไรก็ตาม ผมประสบปัญหาเมื่อพบว่าไฟล์โปรเจกต์ต้นฉบับและส่วนประกอบที่ระบุไว้ไม่ตรงกับสิ่งที่ผมมีอยู่ในมือ โดยเฉพาะอย่างยิ่ง โปรเจกต์ต้นฉบับใช้ ADXL343 accelerometer แต่คลังชิ้นส่วนของผมมีเพียง ADXL345
แม้ว่าเซ็นเซอร์ทั้งสองจะดูคล้ายกัน แต่การใช้โค้ดต้นฉบับโดยตรงนั้นไม่ง่ายอย่างที่คิด ผมจึงตัดสินใจที่จะเขียนโปรแกรมใหม่ (fork) โดยเฉพาะเพื่อรองรับ ADXL345 เพื่อการตรวจจับทิศทางที่แม่นยำยิ่งขึ้น ผมได้ศึกษาเอกสารทางเทคนิค (Datasheet) และ Application Note จาก NXP (AN3461) ซึ่งอธิบายตรรกะเบื้องหลังการสลับระหว่างโหมดหน้าจอแนวตั้ง (portrait) และแนวนอน (landscape) ในสมาร์ทโฟน ซึ่งสิ่งนี้เป็นรากฐานสำคัญที่ผมนำมาประยุกต์ใช้กับโปรเจกต์นี้

รายละเอียดฮาร์ดแวร์และการออกแบบวงจร
บอร์ดที่ใช้ในโปรเจกต์นี้เป็นการต่อยอดจากโปรเจกต์ก่อนหน้า โดยมีส่วนประกอบหลักประกอบด้วย:
- Arduino Nano: หน่วยประมวลผลหลักขนาดเล็กแต่ทรงพลัง เพียงพอสำหรับงานประมวลผลสัญญาณเซ็นเซอร์
- ADXL345 Accelerometer: เซ็นเซอร์ MEMS accelerometer แบบ 3 แกน (X, Y, Z) ที่มีความละเอียดสูงถึง 13-bit สื่อสารผ่านโปรโตคอล I2C
- MAX7219 Dot Matrix Display: โมดูลจอแสดงผล 8x8 LED Matrix ใช้สำหรับแสดงทิศทางที่ตรวจจับได้จากเซ็นเซอร์
การเชื่อมต่อหลัก:
- ADXL345 (I2C): เชื่อมต่อสาย SDA เข้ากับ Pin A4 และ SCL เข้ากับ Pin A5 ของ Arduino Nano ต้องต่อ 4.7K Ohm pull-up resistors เข้ากับ VCC เพื่อรักษาเสถียรภาพของสัญญาณข้อมูล
- MAX7219 (SPI-like): ใช้สายสัญญาณหลักสามเส้น: DataIn (Pin 11), CLK (Pin 13), และ Load/CS (Pin 10)
- โครงสร้างบอร์ด: มี 11 traces บนเลเยอร์บน (top layer) และ 20 track breaks บนเลเยอร์ล่าง (bottom layer) เพื่อแยกสัญญาณ
เคล็ดลับทางวิศวกรรม: จากการใช้งานจริง ผมพบว่าการใช้ right-angle connector สำหรับเซ็นเซอร์จะช่วยให้การหมุนอุปกรณ์เป็นธรรมชาติมากขึ้น แทนที่จะต้องพลิกบอร์ดไปมาอย่างที่เป็นอยู่ในปัจจุบัน
การวิเคราะห์ตรรกะของซอฟต์แวร์
หัวใจหลักของโปรเจกต์นี้คือการแปลงข้อมูลอัตราเร่งดิบไปเป็นการรับรู้ทิศทาง
1. การแปลงหน่วย
ปัญหาเบื้องต้นอย่างหนึ่งที่ผมพบคือ Adafruit Library ให้ค่าออกมาเป็น m/s² แต่สูตรคำนวณจาก Datasheet ต้องการค่าเป็นหน่วย g-force:
- $0.5g \approx 4.9 , m/s^2$
- $0.4g \approx 3.9 , m/s^2$
ผมจึงต้องแปลงค่าเหล่านี้ภายใน
ifconditions เพื่อให้สอดคล้องกับมาตรฐานทางฟิสิกส์
2. การคำนวณ Offset
โค้ดกำหนดค่าเช่น #define zero_x 1.569 (รวมถึงสำหรับแกน Y และ Z) เพื่อทำหน้าที่เป็น "Zero-G Offset" หรือการปรับเทียบเริ่มต้น เพื่อลบความไม่แม่นยำที่อาจเกิดขึ้นจากการที่เซ็นเซอร์ไม่ได้อยู่ในระดับที่สมบูรณ์แบบกับพื้นผิวโลก
3. อัลกอริทึมการตรวจจับทิศทาง
โปรแกรมจะตรวจสอบความสัมพันธ์ระหว่างแกนทั้งสามเพื่อกำหนดทิศทางของอุปกรณ์ โดยใช้เกณฑ์ต่อไปนี้ (อ้างอิงจาก loop function):
- Top: เมื่อค่าอัตราเร่งแกน Z น้อยกว่า 0.5g (ราบ) แกน X มากกว่า 0.5g (เอียงลง) และแกน Y มีความเสถียร
- Bottom: เมื่อแกน X เป็นลบ น้อยกว่า -0.5g
- Right/Left: ใช้ตรรกะการตรวจจับที่คล้ายกัน แต่เน้นที่แกน Y แทน
4. การแสดงผล
เมื่อเงื่อนไขทิศทางใด ๆ ตรงตามที่กำหนด โปรแกรมจะเรียกใช้ rotate_display(char my_direction) function เพื่อสั่งให้ชิป MAX7219 ส่องสว่าง LED บน Matrix เป็นสัญลักษณ์แสดงทิศทางนั้นผ่านคำสั่ง lc.setLed()
Libraries ที่จำเป็น
เพื่อให้โปรเจกต์นี้ทำงานได้ คุณต้องติดตั้ง Libraries ต่อไปนี้ผ่าน Arduino Library Manager:
- Adafruit_Sensor: Base Library สำหรับเซ็นเซอร์ Adafruit
- Adafruit_ADXL345_U: สำหรับดึงค่าอัตราเร่งจาก ADXL345
- LedControl: สำหรับควบคุมจอแสดงผล MAX7219
- Wire: สำหรับการสื่อสาร I2C (รวมอยู่ใน Arduino IDE)
บทสรุปและข้อมูลอ้างอิง
โปรเจกต์นี้แสดงให้เห็นถึงความสำคัญอย่างยิ่งของการทำความเข้าใจ "หน่วยการวัด" และ "Datasheets" ในงานวิศวกรรม embedded การเปลี่ยนจาก ADXL343 ไปเป็น ADXL345 ไม่ใช่เพียงแค่การเปลี่ยนชื่อเซ็นเซอร์เท่านั้น แต่เป็นการปรับตรรกะให้สอดคล้องกับคุณสมบัติทางกายภาพของอุปกรณ์
ข้อมูลอ้างอิงทางเทคนิค: