การใช้งานเซนเซอร์วัดความเร่งแบบสามแกน

โมดูลวัดความเร่งแบบสามแกน ADXL345

บอร์ดโมดูลที่กล่าวถึงในบทนี้คือ โมดูลวัดความเร่งแบบสามแกนแบบดิจิทัลที่ใช้ชิปเบอร์ ADXL345 เป็นเซนเซอร์วัดสัญญาณความเร่งในสามแกน ที่มีนิยามทิศทางแสดงอยู่บนบอร์ดอย่างชัดแจ้ง (รูปที่ 10.1) โดยโมดูลนี้ให้ให้สัญญาณขาออกเป็นข้อมูลดิจิทัลและติดต่อใช้งานผ่าน I2C ได้และสามารถกำหนดค่าความโน้มถ่วงสูงสุดที่อ่าน ได้สูงสุดถึง ±16g (±2g, ±4g, ±8g, และ ±16g) โดย g คือค่าความเร่งจากแรงดึงดูดของโลก (ประมาณ 10 m/s2)

ชิป ADXL345 เป็นระบบวัดการเร่งความเร็ว แบบ 3 แกนที่ทำงานได้ในระดับการใช้พลังงานที่ต่ำมาก วัดได้ทั้งความเร่ง/ความเร็วแบบไดนามิกอันเป็นผลมาจากการเคลื่อนไหวหรือแรงกระแทกและการเร่งความเร็วแบบคงที่เช่นการเอียง ง่ายต่อการสื่อสารกับไมโครคอนโทรลเลอร์รุ่นใหม่ ๆ ผ่านการสื่อสารแบบ I2C ที่ใช้เพียงขา SCL และ SDA

 

1

 

รูปที่ 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

 

1

 

รูปที่ 10.2 ทิศทางการเอียงในมุมต่าง ๆ เสมือนการหมุนรอบแกน X, Y และ Z

 

โมดูลวัดความเร่งนี้จะวัดความเร่งในแต่ละแกน ก็คือ ขณะที่โมดูลอยู่นิ่ง ๆ ค่าความเร่งในแต่ละแกนน่าจะมีค่าเป็นศูนย์ แต่ในความเป็นจริงอย่าลืมว่ายังมีแรงโน้มถ่วงของโลกอยู่ด้วย ดังนั้นค่าที่อ่านได้จึงไม่ได้เป็นศูนย์ทั้งหมด คือ ถ้าเราตั้งเครื่องให้แกน Z ตั้งฉากกับพื้นโลก แกน X และ Y จะเป็น 0 แต่ว่าแกน Z จะไม่เป็น 0 เพราะมีแรงโน้มถ่วงของโลกกระทำอยู่ ดังนั้นค่าที่ได้จากแกน Z จึงมีค่า 9.81 m/s2  หรือประมาณ 10 m/s2 รูปที่ 10.3 แสดงลักษณะการวางโมดูลที่ทำให้อ่านค่าได้ค่าต่าง ๆ

 

1

 

รูปที่ 10.3 ลักษณะการวางโมดูลให้แกน (ก) Z (ข) Y และ () X ตั้งฉากกับผิวโลก ตามลำดับ

 

ในกรณีที่อยู่นิ่ง ๆ และแกน X, Y และ Z ไม่มีแกนใดตั้งฉากกับพื้นโลก แรงโน้มถ่วงของโลกที่กระทำกับแต่ละแกนของโมดูลวัดความเร่งก็จะกระจายออกไปในแต่ละแกน ขึ้นอยู่กับการเอียงของเซนเซอร์ แต่เมื่อคิดเวกเตอร์ลัพธ์ที่ตั้งฉากกับพื้นโลกก็มีค่าประมาณ 10 m/s2 ดังแสดงในรูปที่ 10.4

 

1

 

รูปที่ 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. เขียนโค้ดโปรแกรมเพื่ออ่านค่าความเร่งทั้งสามแกนและแสดงผลผ่านพอร์ตอนุกรม

 

1

 

รูปที่ 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