การใช้งานเซนเซอร์วัดความเร่งแบบสามแกน
โมดูลวัดความเร่งแบบสามแกน
ADXL345
บอร์ดโมดูลที่กล่าวถึงในบทนี้คือ
โมดูลวัดความเร่งแบบสามแกนแบบดิจิทัลที่ใช้ชิปเบอร์ ADXL345 เป็นเซนเซอร์วัดสัญญาณความเร่งในสามแกน
ที่มีนิยามทิศทางแสดงอยู่บนบอร์ดอย่างชัดแจ้ง (รูปที่ 10.1)
โดยโมดูลนี้ให้ให้สัญญาณขาออกเป็นข้อมูลดิจิทัลและติดต่อใช้งานผ่าน I2C ได้และสามารถกำหนดค่าความโน้มถ่วงสูงสุดที่อ่าน
ได้สูงสุดถึง ±16g (±2g, ±4g, ±8g, และ ±16g) โดย g คือค่าความเร่งจากแรงดึงดูดของโลก (ประมาณ 10 m/s2)
ชิป ADXL345
เป็นระบบวัดการเร่งความเร็ว แบบ 3 แกนที่ทำงานได้ในระดับการใช้พลังงานที่ต่ำมาก
วัดได้ทั้งความเร่ง/ความเร็วแบบไดนามิกอันเป็นผลมาจากการเคลื่อนไหวหรือแรงกระแทกและการเร่งความเร็วแบบคงที่เช่นการเอียง
ง่ายต่อการสื่อสารกับไมโครคอนโทรลเลอร์รุ่นใหม่ ๆ ผ่านการสื่อสารแบบ I2C ที่ใช้เพียงขา SCL และ SDA
รูปที่
10.1
โมดูลวัดความเร่งแบบ 3 แกน ADXL345
คุณสมบัติของชิปวัดค่าความเร่ง
ADXL345
- ใช้ไฟเลี้ยงในช่วงกว้าง 2.0 - 3.6 V
-
กินพลังงานต่ำมาก (23 µA ที่ไฟเลี้ยง 2.5 V)
-
สามารถเลือกความละเอียดในการวัดผ่านคำสั่งที่รับผ่านการสื่อสารแบบอนุกรมได้
- ข้อมูลที่อ่านได้มีความละเอียดสูงถึง 0.004 g/LSB (13 บิต)
-
สามารถนำมาเชื่อมต่อได้ทั้งแบบแบบ SPI และ I2C
การวัดความเร่งแบบ
3 แกน
การวัดมุมเอียงของเซนเซอร์สามารถทำได้โดยการวัดความเร่งในแต่ละแกน
โดยทั่วไปเราจะนิยามการเอียงเมื่อเทียบกับแกนหรือระบบพิกัดอ้างอิง
โดยบอกความเอียงเป็นมุมที่หมุนเอียงไปในแกนหนึ่ง ๆ
ซึ่งการเอียงในแต่ละทิศจะมีลักษณะการกำหนดทิศทางดังรูปที่ 10.2
รูปที่
10.2
ทิศทางการเอียงในมุมต่าง ๆ เสมือนการหมุนรอบแกน X, Y และ Z
โมดูลวัดความเร่งนี้จะวัดความเร่งในแต่ละแกน ก็คือ
ขณะที่โมดูลอยู่นิ่ง ๆ ค่าความเร่งในแต่ละแกนน่าจะมีค่าเป็นศูนย์ แต่ในความเป็นจริงอย่าลืมว่ายังมีแรงโน้มถ่วงของโลกอยู่ด้วย
ดังนั้นค่าที่อ่านได้จึงไม่ได้เป็นศูนย์ทั้งหมด คือ ถ้าเราตั้งเครื่องให้แกน Z ตั้งฉากกับพื้นโลก แกน X และ Y จะเป็น 0 แต่ว่าแกน Z จะไม่เป็น
0 เพราะมีแรงโน้มถ่วงของโลกกระทำอยู่ ดังนั้นค่าที่ได้จากแกน
Z จึงมีค่า 9.81 m/s2 หรือประมาณ 10 m/s2 รูปที่ 10.3 แสดงลักษณะการวางโมดูลที่ทำให้อ่านค่าได้ค่าต่าง ๆ
รูปที่
10.3
ลักษณะการวางโมดูลให้แกน (ก) Z (ข) Y และ (ค) X ตั้งฉากกับผิวโลก
ตามลำดับ
ในกรณีที่อยู่นิ่ง ๆ และแกน X, Y และ Z ไม่มีแกนใดตั้งฉากกับพื้นโลก แรงโน้มถ่วงของโลกที่กระทำกับแต่ละแกนของโมดูลวัดความเร่งก็จะกระจายออกไปในแต่ละแกน
ขึ้นอยู่กับการเอียงของเซนเซอร์
แต่เมื่อคิดเวกเตอร์ลัพธ์ที่ตั้งฉากกับพื้นโลกก็มีค่าประมาณ 10 m/s2
ดังแสดงในรูปที่ 10.4
รูปที่
10.4 ตัวอย่างค่าที่อ่านได้เมื่อวางโมดูลในลักษณะไม่ตั้งฉากกับพื้นโลก
ไลบรารีและคำสั่งที่เกี่ยวข้อง
ในขั้นแรกของการใช้งานโมดูล
ADXL345
เราจะต้องดาวน์โหลดไลบรารีมาลงในโปรแกรม Arduino IDE เสียก่อน โดยผู้ใช้จะต้องดาวน์โหลดไลบรารีสองตัวคือ Adafruit_Sensor จาก https://github.com/adafruit/Adafruit_Sensor และ Adafruit_ADXL345 จาก https://github.com/adafruit/Adafruit_ADXL345
โดยหลังจากติดตั้งไลบรารีลงใน
Arduino
IDE แล้ว ผู้ใช้สามารถเรียกใช้งานโมดูล ADXL345 ได้โดยเริ่มจากการเพิ่มไลบรารี 3 ตัวได้แก่ Wire.h,
Adafruit_Sensor.h และ Adafruit_ADXL345_U.h แล้วจึงกำหนดวัตถุคือ โมดูล ADXL345 ที่เชื่อมต่อ
โดยใช้คำสั่ง
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
โดย accel คือชื่อวัตถุที่สร้างจากคลาส Adafruit_ADXL345_Unified
ซึ่งคลาสนี้เป็นคลาสที่ใช้งานได้อย่างหลากหลาย มีฟังก์ชันที่เป็นเมธอดที่อ่านค่าความเร่งอยู่ภายใน
พร้อมให้เรียกใช้งาน โดยการเชื่อมต่อโมดูลนี้ ชิป ADXL345
กำหนดให้มีการเชื่อมต่อแบบ I2C โดยมี address
คือ 0x53 และเชื่อมต่อผ่านขา D1 และ D2 ของ NodeMCU
ฟังก์ชัน
begin()
เป็นฟังก์ชันที่เรียกเพื่อใช้ตรวจสอบการเชื่อมต่อของโมดูลและไมโครคอนโทรลเลอร์
โดยหลังจากที่เชื่อมต่อได้แล้ว
เราจะสามารถกำหนดขอบเขตของการอ่านค่าได้โดยใช้คำสั่ง accel.setRange(ADXL345_RANGE_xx_G) โดย xx
= 2, 4, 8, 16 และกำหนดอัตราเร็วในการส่งข้อมูล ด้วยคำสั่ง setDataRate(dataRate) โดยฟังก์ชันที่กล่าวถึงนี้ จะอยู่ในส่วนของ setup() ของโปรแกรม
การเรียกใช้งาน
(อ่านค่า) ความเร่งจากโมดูลทำได้โดยกำหนดตัวแปร เหตุการณ์ คือ sensors_event_t event; จากนั้นจึงใช้ฟังก์ชัน (เมธอด) getEvent
เพื่ออ่านค่าความเร่งแล้วเราสามารถเรียกดูค่าความเร่งในแต่ละแกนได้จาก
event.acceleration.x (.y และ .z)
ในการใช้งานโมดูลนี้
หากเราต้องการค่าที่ถูกต้องแม่นยำ เราอาจจะทำการเทียบวัด (calibration) ก่อน ด้วยวิธีการทางซอฟต์แวร์ โดยผู้ที่สนใจวิธีการนี้
ก็สามารถศึกษาเพิ่มเติมได้จากแหล่งความรู้ในอินเทอร์เน็ตเช่น https://learn.adafruit.com/adxl345-digital-accelerometer/programming
สำหรับขาที่ใช้ในการเชื่อมต่อเพื่อใช้งานโมดูล
ADXL345 มีด้วยกัน 4 ขา คือ VCC, GND, SDA และ SCL โดยในการทดลองนี้ เราจะเชื่อมต่อขา D1 และ D2
ของ NodeMCU เข้ากับขา SCL และ SDA ตามลำดับ
การทดลองวัดค่าความเร่ง
วัตถุประสงค์
1.
สามารถต่อวงจร NodeMCU
v.3 กับโมดูลวัดความเร่ง 3 แกน ได้
2.
สามารถเขียนโปรแกรมแสดงผลการวัดความเร่งได้
3.
สามารถเขียนโปรแกรมเพื่อนำค่าความเร่งที่วัดได้ไปใช้งานต่อไปได้
อุปกรณ์ที่ใช้ในการทดลอง
1. เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ
Windows
(ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม Arduino IDE 1.8.8 IoT 1
เครื่อง
2. NodeMCU v.3 1
บอร์ด
3. NodeMCU Base
Ver 1.0 1
บอร์ด
4. บอร์ดโมดูลวัดความเร่ง 3
แกน ด้วยไอซีเบอร์ ADXL345 1
บอร์ด
5. สาย USB 1
เส้น
6. สายต่อวงจร
(สายจัมพ์ เมีย-เมีย) 4 เส้น
วิธีการทดลอง
ตอนที่
1
1.
ต่อวงจรตามรูปที่ 10.5
2.
เขียนโค้ดโปรแกรมเพื่ออ่านค่าความเร่งทั้งสามแกนและแสดงผลผ่านพอร์ตอนุกรม
รูปที่
10.5
การเชื่อมต่อแบบ I2C
ระหว่าง NodeMCU กับโมดูลวัดความเร่ง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// Read 3-axis accelerometer by NodeMCU
ESP8266 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h> Adafruit_ADXL345_Unified accel =
Adafruit_ADXL345_Unified(12345); void setup() { Serial.begin(9600); Serial.println("Accelerometer
Test"); Serial.println(""); if(!accel.begin()) { Serial.println("Oops, no ADXL345 detected."); while(1); } accel.setRange(ADXL345_RANGE_16_G); } void loop() { sensors_event_t
event; accel.getEvent(&event); Serial.print("X:
"); Serial.print(event.acceleration.x); Serial.print("
"); Serial.print("Y:
"); Serial.print(event.acceleration.y); Serial.print("
"); Serial.print("Z:
"); Serial.print(event.acceleration.z); Serial.print("
"); Serial.println("m/s^2"); delay(500); } |
3.
ทดสอบผลการวัดความเร่งในแนวแกน X, Y, และ Z โดยการหมุนเซนเซอร์ในทิศต่าง
ๆ แล้วอ่านค่าที่แสดง
ตอนที่
2
1.
ต่อวงจรตามรูปที่ 10.5
2.
เขียนโค้ดโปรแกรมเพื่อตรวจสอบเหตุการณ์การเคลื่อนที่อย่างรวดเร็ว
ซึ่งเป็นเหตุการณ์ที่ทำให้มีขนาดความเร่งรวมเกิน 20 m/s2 และแสดงผลเป็นข้อความผ่านพอร์ตอนุกรม
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//Detect
event by accelerometer + NodeMCU ESP8266 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h> Adafruit_ADXL345_Unified
accel = Adafruit_ADXL345_Unified(12345); // Threshold
value for detecting accident event float acth = 20.0; float acx,acy,acz,ac; void setup() { Serial.begin(9600); Serial.println("Accelerometer
Test"); Serial.println(""); if(!accel.begin()) { Serial.println("Oops, no ADXL345
detected."); while(1); } accel.setRange(ADXL345_RANGE_16_G);
} void loop() { sensors_event_t
event; accel.getEvent(&event); acx
= event.acceleration.x; acy
= event.acceleration.y; acz
= event.acceleration.z;
ac = sqrt(pow(acx,2)+pow(acy,2)+pow(acz,2)); if(ac
> acth) { Serial.println("accident detected!"); } delay(100); } |
3.
ทดสอบผลโดยการขยับเซนเซอร์เร็ว ๆ แล้วสังเกตที่ Serial Monitor