กลับไปหน้ารวมไฟล์
adxl345-accelerometer-screen-orientation-b15695.md

title: "การพัฒนาเซ็นเซอร์ตรวจจับทิศทางด้วย ADXL345 และ Arduino Nano"

บทนำและที่มาของโปรเจกต์

จุดเริ่มต้นของโปรเจกต์นี้มาจากความต้องการที่จะสร้าง "Digital Hourglass" ซึ่งเป็นโปรเจกต์ยอดนิยมในกลุ่ม Maker อย่างไรก็ตาม ผมประสบปัญหาเมื่อพบว่าไฟล์โปรเจกต์ต้นฉบับและส่วนประกอบที่ระบุไว้ไม่ตรงกับสิ่งที่ผมมีอยู่ในมือ โดยเฉพาะอย่างยิ่ง โปรเจกต์ต้นฉบับใช้ ADXL343 accelerometer แต่คลังชิ้นส่วนของผมมีเพียง ADXL345

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

การประกอบวงจรบน breadboard (บอร์ด Accelerometer)

รายละเอียดฮาร์ดแวร์และการออกแบบวงจร

บอร์ดที่ใช้ในโปรเจกต์นี้เป็นการต่อยอดจากโปรเจกต์ก่อนหน้า โดยมีส่วนประกอบหลักประกอบด้วย:

  1. Arduino Nano: หน่วยประมวลผลหลักขนาดเล็กแต่ทรงพลัง เพียงพอสำหรับงานประมวลผลสัญญาณเซ็นเซอร์
  2. ADXL345 Accelerometer: เซ็นเซอร์ MEMS accelerometer แบบ 3 แกน (X, Y, Z) ที่มีความละเอียดสูงถึง 13-bit สื่อสารผ่านโปรโตคอล I2C
  3. 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$ ผมจึงต้องแปลงค่าเหล่านี้ภายใน if conditions เพื่อให้สอดคล้องกับมาตรฐานทางฟิสิกส์

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 ไม่ใช่เพียงแค่การเปลี่ยนชื่อเซ็นเซอร์เท่านั้น แต่เป็นการปรับตรรกะให้สอดคล้องกับคุณสมบัติทางกายภาพของอุปกรณ์

ข้อมูลอ้างอิงทางเทคนิค:

ข้อมูล Frontmatter ดั้งเดิม

title: "ADXL345 accelerometer \"screen orientation"
description: "Can you keep it upright?"
author: "glennedi"
category: ""
tags:
  - "maxx7219"
  - "accelerometer"
  - "adxl345"
views: 1858
likes: 0
price: 1120
difficulty: "Intermediate"
components:
  - "1x SparkFun Triple Axis Accelerometer Breakout - ADXL345"
  - "2x 0.1  inch connector socket 15 way"
  - "1x Arduino Nano R3"
  - "1x Stripboard 37*24 holes"
  - "1x MAXX7219 Display unit"
  - "1x 0.1  inch connector socket 8 way"
  - "1x 0.1  inch connector plug 5 way"
  - "2x 4K7 resistor"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://projects.arduinocontent.cc/8793b51d-39e4-444a-a79f-01692bfe1b01.ino"
  - "https://projects.arduinocontent.cc/8793b51d-39e4-444a-a79f-01692bfe1b01.ino"
documentationLinks: []
passwordHash: "f8926a853daf5888223cc6ea650a8718355841c7f36adabf8668f7d564c8e25b"
encryptedPayload: "U2FsdGVkX19A9aCdmCJqGS2cp5CW7aFvvq8m3eKukOPu7C8+YGQqrvBuq2rwfbHmfk4DUXXIoLNIDGdKrOMbhcZfqxiP3oJLIPRRlnpIYHU="
seoDescription: "Learn to use ADXL345 accelerometer for screen orientation control in Arduino projects. Keep your display upright with this guide."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/adxl345-accelerometer-screen-orientation-b15695_cover.jpg"
lang: "th"