Chủ Nhật, 5 tháng 11, 2023

Bài 31: Hướng dẫn Giao tiếp Cảm biến Gia tốc ADXL335 với Arduino

Hướng dẫn Giao tiếp Cảm biến Gia tốc ADXL335 với Arduino

Giới thiệu

Cảm biến gia tốc là một thành phần quan trọng trong nhiều dự án điện tử, giúp chúng ta đo lường sự thay đổi về tốc độ hoặc hướng chuyển động. ADXL335 là một cảm biến gia tốc analog 3 trục phổ biến, nhỏ gọn và dễ sử dụng, thường được dùng để phát hiện độ nghiêng, chuyển động, rung lắc hoặc lực hấp dẫn. Bài viết này sẽ hướng dẫn bạn cách kết nối (giao tiếp) cảm biến ADXL335 với bo mạch Arduino và đọc dữ liệu gia tốc thô từ ba trục X, Y và Z.

ADXL335 là gì?

  • Cảm biến gia tốc 3 trục: ADXL335 có thể đo gia tốc (bao gồm cả gia tốc trọng trường - lực hút Trái Đất) theo ba phương vuông góc với nhau trong không gian: trục X, trục Y và trục Z.

  • Hoạt động: Bên trong cảm biến có một cấu trúc vi cơ cực nhỏ (MEMS). Khi cảm biến di chuyển hoặc bị nghiêng, cấu trúc này dịch chuyển, làm thay đổi điện dung giữa các bản cực vi mô. Sự thay đổi điện dung này được chuyển đổi thành một tín hiệu điện áp analog tỷ lệ thuận với gia tốc trên mỗi trục.

  • Đầu ra Analog: Giá trị gia tốc đo được trên mỗi trục (X, Y, Z) được xuất ra dưới dạng một mức điện áp analog tại các chân tương ứng (XOUT, YOUT, ZOUT). Mức điện áp này thay đổi khi gia tốc thay đổi.

  • VCC: Chân cấp nguồn dương (Thường là 3.3V hoặc 5V - Hãy kiểm tra datasheet của module bạn dùng! Module trong ví dụ này sẽ dùng nguồn 5V từ Arduino nhưng cần chú ý đến điện áp tham chiếu).

  • GND: Chân nối đất (0V).

  • XOUT: Chân xuất tín hiệu điện áp analog tương ứng với gia tốc trục X.

  • YOUT: Chân xuất tín hiệu điện áp analog tương ứng với gia tốc trục Y.

  • ZOUT: Chân xuất tín hiệu điện áp analog tương ứng với gia tốc trục Z.

  • ST (Self Test): Chân dùng để tự kiểm tra chức năng của cảm biến. Thông thường không cần sử dụng trong các ứng dụng cơ bản, có thể để trống.

  • NC (No Connect): Các chân không được kết nối, bỏ trống.

Yêu cầu Phần cứng

  1. Bo mạch Arduino: Bất kỳ loại nào (Uno, Nano, Mega, v.v.).

  2. Module cảm biến ADXL335: Đảm bảo bạn có module breakout board.

  3. Dây cắm (Jumper Wires): Đủ số lượng và độ dài phù hợp.

  4. Cáp USB: Để kết nối Arduino với máy tính.

Các Bước Thực hiện

Bước 1: Kết nối Phần cứng

Kết nối cẩn thận các chân giữa module ADXL335 và Arduino theo sơ đồ sau:


  • ADXL335 VCC -> Arduino 5V (Nếu module của bạn hỗ trợ 5V)

  • ADXL335 GND -> Arduino GND (Nối chung mass)

  • ADXL335 XOUT -> Arduino A0 (Chân Analog Input 0)

  • ADXL335 YOUT -> Arduino A1 (Chân Analog Input 1)

  • ADXL335 ZOUT -> Arduino A2 (Chân Analog Input 2)

  • (Quan trọng) Arduino 3.3V -> Arduino AREF (Chân điện áp tham chiếu Analog)

Giải thích kết nối AREF:
Chân AREF (Analog REFerence) cho phép bạn đặt mức điện áp cao nhất mà bộ chuyển đổi Analog-sang-Digital (ADC) của Arduino sẽ dùng làm tham chiếu. Module ADXL335 thường hoạt động và cho ra điện áp trong khoảng 0-3.3V (ngay cả khi cấp nguồn 5V, điện áp ra thường bị giới hạn ở mức thấp hơn). Bằng cách nối chân 3.3V của Arduino vào AREF và sử dụng analogReference(EXTERNAL) trong code, bạn đang bảo Arduino rằng giá trị đọc tối đa (1023) sẽ tương ứng với 3.3V thay vì 5V mặc định. Điều này giúp tăng độ chính xác khi đọc giá trị từ ADXL335.

Bước 2: Viết Chương trình Arduino (Code)

Mở Arduino IDE và tạo một sketch mới. Chương trình sẽ thực hiện các việc sau:

  1. Khai báo chân: Định nghĩa các chân Arduino kết nối với ADXL335.

  2. Thiết lập ban đầu (setup()):

    • Khởi động giao tiếp Serial để gửi dữ liệu lên máy tính.

    • Đặt điện áp tham chiếu analog là EXTERNAL (sử dụng điện áp trên chân AREF).

  3. Vòng lặp chính (loop()):

    • Đọc giá trị điện áp analog từ các chân XOUT, YOUT, ZOUT.

    • In các giá trị đọc được lên Serial Monitor.

    • Dừng một chút để dễ quan sát.

// Khai báo các chân Arduino kết nối với ADXL335
const int xPin = A0; // Chân XOUT nối với A0
const int yPin = A1; // Chân YOUT nối với A1
const int zPin = A2; // Chân ZOUT nối với A2
void setup() {
// Khởi động giao tiếp Serial ở tốc độ 9600 baud
Serial.begin(9600);
// Đặt điện áp tham chiếu cho ADC là điện áp trên chân AREF (đã nối với 3.3V)
// Quan trọng: Lệnh này phải được gọi TRƯỚC khi thực hiện analogRead() đầu tiên
// trong vòng lặp nếu bạn muốn dùng tham chiếu ngoài ngay lập tức.
// Tuy nhiên, đặt trong setup() thường rõ ràng hơn.
analogReference(EXTERNAL);
Serial.println("Khoi dong xong. Bat dau doc gia tri ADXL335...");
}
void loop() {
// Đọc giá trị analog thô từ 3 trục (giá trị từ 0 đến 1023)
int xRaw = analogRead(xPin);
int yRaw = analogRead(yPin);
int zRaw = analogRead(zPin);
// In giá trị đọc được lên Serial Monitor
Serial.print("X: ");
Serial.print(xRaw);
Serial.print("\t Y: "); // \t là ký tự tab, giúp căn chỉnh cột
Serial.print(yRaw);
Serial.print("\t Z: ");
Serial.println(zRaw); // Sử dụng println để xuống dòng sau khi in giá trị Z
// Đợi 500ms trước khi đọc lại
delay(500);
}

Giải thích Code:

  • const int xPin = A0;: Khai báo biến hằng số xPin để lưu số chân A0, giúp code dễ đọc hơn. Tương tự cho yPinzPin.

  • Serial.begin(9600);: Khởi tạo cổng Serial để giao tiếp với máy tính qua cáp USB ở tốc độ 9600 bit/giây.

  • analogReference(EXTERNAL);: Cấu hình ADC sử dụng điện áp tại chân AREF làm mức tham chiếu cao nhất (3.3V trong trường hợp này).

  • analogRead(xPin);: Đọc giá trị điện áp analog tại chân xPin (A0) và chuyển đổi thành một số nguyên từ 0 đến 1023. Giá trị 0 tương ứng với 0V, và 1023 tương ứng với điện áp trên chân AREF (3.3V).

  • Serial.print()Serial.println(): Gửi dữ liệu lên máy tính để hiển thị trên Serial Monitor. println sẽ thêm ký tự xuống dòng cuối cùng.

  • delay(500);: Tạm dừng chương trình 500 mili giây (0.5 giây) để giảm tốc độ hiển thị dữ liệu, giúp bạn dễ dàng quan sát sự thay đổi.

Bước 3: Nạp Code và Quan sát Kết quả

  1. Kết nối Arduino: Cắm cáp USB kết nối Arduino với máy tính.

  2. Chọn Board và Port: Trong Arduino IDE, vào menu Tools -> Board và chọn loại bo mạch Arduino bạn đang dùng (ví dụ: "Arduino Uno"). Sau đó, vào Tools -> Port và chọn cổng COM tương ứng với Arduino của bạn.

  3. Nạp Code: Nhấn nút "Upload" (biểu tượng mũi tên sang phải) để biên dịch và nạp code vào Arduino.

  4. Mở Serial Monitor: Sau khi nạp code thành công, nhấn vào biểu tượng kính lúp ở góc trên bên phải của Arduino IDE (hoặc vào Tools -> Serial Monitor). Đảm bảo tốc độ baud ở góc dưới bên phải của cửa sổ Serial Monitor được đặt là 9600 baud.

Kết quả mong đợi:

Bạn sẽ thấy các dòng dữ liệu xuất hiện liên tục trên Serial Monitor, hiển thị giá trị đọc được từ ba trục X, Y, Z. Ví dụ:

X: 510 Y: 515 Z: 680
X: 511 Y: 514 Z: 679
X: 509 Y: 516 Z: 681
...

Thử nghiệm và Quan sát:

  • Để cảm biến nằm yên trên mặt phẳng: Trục Z thường hướng lên trời (chống lại trọng lực). Bạn sẽ thấy giá trị Z có giá trị cao nhất (thường không phải 1023 mà là một giá trị nào đó tương ứng với 1g, ví dụ quanh 670-700 nếu zero-g là khoảng 1.65V và AREF là 3.3V). Giá trị X và Y sẽ ở mức gần giữa (tương ứng với 0g, ví dụ quanh 500-520).

  • Nghiêng cảm biến theo trục X: Bạn sẽ thấy giá trị X: thay đổi đáng kể. Nghiêng xuống, giá trị tăng; nghiêng lên, giá trị giảm (hoặc ngược lại tùy hướng lắp cảm biến). Giá trị Y và Z cũng có thể thay đổi một chút.

  • Nghiêng cảm biến theo trục Y: Tương tự, giá trị Y: sẽ thay đổi rõ rệt.

  • Lật ngược cảm biến: Giá trị Z sẽ giảm xuống mức thấp (tương ứng với -1g).

Lưu ý: Các giá trị bạn đọc được là giá trị "thô" từ ADC (0-1023). Để chuyển đổi chúng thành đơn vị gia tốc thực tế (như 'g' - gia tốc trọng trường), bạn cần biết giá trị điện áp tương ứng với 0g và độ nhạy (sensitivity - mV/g) của cảm biến từ datasheet và thực hiện một số phép tính toán. Tuy nhiên, đối với nhiều ứng dụng như phát hiện nghiêng cơ bản, sử dụng giá trị thô là đủ.



Không có nhận xét nào:

Đăng nhận xét