Hướng dẫn sử dụng cảm biến góc nghiêng (Tilt Sensor) với Arduino
Trong hướng dẫn này, các bạn sẽ tìm hiểu về cách sử dụng cảm biến góc nghiêng (Tilt Sensor) với Arduino. Chúng ta sẽ kết nối cảm biến với Arduino và thực hiện lập trình đơn giản để đọc giá trị từ cảm biến và thực hiện BẬT/TẮT một đèn LED.
Bằng cách làm quen với cảm biến đo góc nghiêng và hiểu cách sử dụng nó, bạn có thể tạo ra các dự án liên quan đến độ nghiêng, và khám phá thêm nhiều ứng dụng sáng tạo khác.
Xem ngay: Bài 8: Cảm biến góc nghiêng sử dụng ngắt (INTERRUPT) trong môi trường Arduino
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Cảm biến góc nghiêng SW 520D | 1 | Shopee | Cytron |
Dây cắm | 10-20 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Tổng quan về cảm biến góc nghiêng
Cảm biến góc nghiêng tương tự như là một loại công tắc có khả năng phát hiện chuyển động, hướng hoặc độ nghiêng cơ bản của một đối tượng. Cấu trúc của cảm biến này được thiết kế sao cho khi độ nghiêng đạt mức nhất định, nó sẽ tạo ra hoặc ngắt kết nối tín hiệu điện.
Các cảm biến độ nghiêng có những đặc điểm vượt trội như kích thước nhỏ, giá thành thấp, và dễ sử dụng. Điều này khiến chúng trở nên phổ biến trong việc áp dụng vào đồ chơi, đồ dùng, robot và các thiết bị khác. Do tính đơn giản và hiệu quả của chúng, cảm biến Tilt rất phù hợp cho những bạn sinh viên mới bắt đầu học lập trình.
Mặc dù tất cả các cảm biến độ nghiêng hoạt động tương tự nhau, nhưng kích thước và các thông số kỹ thuật có thể có sự khác biệt nhỏ tuỳ thuộc vào từng model và nhà sản xuất.
Dimensions | 5.5mm (0.22″) diameter & 13.5mm (0.53″) long |
Maximum operating voltage (VCC) | Up to 20V |
Maximum operating current (Imax) | 30mA |
Sensitivity range | Movements of around 5 to 10 degrees |
Lifetime | 50,000+ cycles (switches) |
Nguyên lý hoạt của cảm biến góc nghiêng (Tilt Sensor)
Cảm biến nghiêng thường được cấu thành từ một ống kim loại có chứa một quả bóng kim loại nhỏ di chuyển bên trong. Một đầu của ống có hai cực dẫn điện. Cấu trúc của cảm biến được thiết kế sao cho khi độ nghiêng đạt mức nhất định, quả bóng sẽ lăn, làm dẫn hoặc ngắt kết nối tín hiệu điện.
Khi cảm biến đứng thẳng, quả bóng tiếp xúc với hai cực và tạo ra kết nối điện. Khi cảm biến bị nghiêng, quả bóng sẽ lăn ra khỏi các cực và kết nối điện bị ngắt.
Xem thêm: Hướng dẫn sử dụng cảm biến gia tốc MPU6050 với Arduino
Hướng dẫn kiểm tra cảm biến góc nghiêng
Việc kiểm tra cảm biến độ nghiêng rất đơn giản. Đặt đồng hồ vạn năng của bạn ở chế độ ‘continuity-test’ (trên đồng hỗ có biểu tượng phát ra âm thanh) và sử dụng hai đầu đo chạm vào hai chân của cảm biến. Sau đó, nghiêng cảm biến để xác định góc mà công tắc mở và đóng.
Khi cảm biến không nghiêng, công tắc đóng (đồng hồ sẽ phát ra âm thanh).
Khi cảm biến nghiêng, công tắc mở (không có âm thanh phát ra).
Sơ đồ đấu nối cảm biến góc nghiêng với Arduino
Code cảm biến góc nghiêng (Tilt Sensor)
Đoạn code bên dưới cho phép cảm biến góc nghiêng kiểm tra trạng thái và điều khiển đèn LED trên bo Arduino. Khi cảm biến nghiêng, đèn LED sẽ bật theo và khi cảm biến ở trạng thái không nghiêng, đèn LED sẽ tắt.
const int tiltPin = 2; // tilt sensor pin is connected to pin 2 const int ledPin = 13; // built-in LED is connected to pin 13 int ledState = HIGH; // the current state of the LED int tiltState; // the current reading from the sensor int lastTiltState = LOW; // the previous reading from the sensor unsigned long time = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time, increase if the output flickers void setup() { pinMode(tiltPin, INPUT); // Set sensor pin as an INPUT pin digitalWrite(tiltPin, HIGH); // turn on the built in pull-up resistor pinMode(ledPin, OUTPUT); // Set LED pin as an OUTPUT pin } void loop() { // read the state of the tilt sensor tiltState = digitalRead(tiltPin); // If the sensor really tilted? if (tiltState != lastTiltState) { // reset the debouncing timer time = millis(); } if ((millis() - time) > debounceDelay) { // whatever the switch is at, its been there for a long time // so lets settle on it! ledState = tiltState; } digitalWrite(ledPin, ledState); // Save the last tiltState so we keep a running tally lastTiltState = tiltState; }
Giải thích code
const int tiltPin = 2; const int ledPin = 13;
Định nghĩa các hằng số để gán các chân và trạng thái của cảm biến đo góc nghiêng và đèn LED.
int ledState = HIGH; int tiltState; int lastTiltState = LOW;
ledState
là một biến kiểu số nguyên (int) để lưu trạng thái hiện tại của đèn LED. Biến này được khởi tạo với giá trị HIGH
, có nghĩa là đèn LED sẽ được bật khi khởi động.
tiltState
là một biến kiểu số nguyên (int) để lưu trạng thái đọc từ cảm biến góc nghiêng. Giá trị của biến này sẽ được cập nhật sau mỗi lần đọc trạng thái từ cảm biến.
lastTiltState
là một biến kiểu số nguyên (int) để lưu trạng thái trước đó của cảm biến nghiêng. Biến này được khởi tạo với giá trị LOW
, đại diện cho trạng thái ban đầu của cảm biến là không nghiêng.
unsigned long time = 0; unsigned long debounceDelay = 50;
time
là một biến kiểu số nguyên không âm (unsigned long) dùng để lưu giá trị thời gian. Biến này được khởi tạo với giá trị 0, đại diện cho thời gian ban đầu.
debounceDelay
là một biến kiểu số nguyên không âm (unsigned long) dùng để định thời gian chống nhiễu (debounce). Biến này được khởi tạo với giá trị 50, đại diện cho thời gian chờ giữa các lần đọc trạng thái từ cảm biến để loại bỏ tạp âm và đảm bảo đọc trạng thái ổn định.
void setup() { pinMode(tiltPin, INPUT); digitalWrite(tiltPin, HIGH); pinMode(ledPin, OUTPUT); }
Hàm setup() được sử dụng để cấu hình các chân I/O và thiết lập trạng thái ban đầu cho chúng.
tiltState = digitalRead(tiltPin); if (tiltState != lastTiltState) { time = millis(); }
Đọc trạng thái của cảm biến góc nghiêng bằng cách sử dụng hàm digitalRead(tiltPin)
và gán giá trị đọc được vào biến tiltState
.
Sau đó, kiểm tra xem giá trị đọc tiltState
có khác với giá trị trạng thái trước đó lastTiltState
hay không. Nếu có sự khác biệt, điều này cho thấy cảm biến đã thay đổi trạng thái.
Trong trường hợp cảm biến thay đổi trạng thái, gán giá trị hiện tại của thời gian (bằng cách sử dụng hàm millis()) vào biến time
. Điều này giúp đặt thời gian bắt đầu của quá trình debounce (chống nhiễu).
if ((millis() - time) > debounceDelay) { ledState = tiltState; } digitalWrite(ledPin, ledState); lastTiltState = tiltState;
Kiểm tra xem đã đủ thời gian debounce hay chưa bằng cách so sánh thời gian hiện tại (sử dụng hàm millis()) trừ đi thời gian ghi nhận lần cuối (time) có lớn hơn giá trị debounceDelay hay không. debounceDelay
là thời gian chống nhiễu, tức là thời gian cần chờ trước khi chấp nhận trạng thái mới của cảm biến là ổn định.
Nếu đã đủ thời gian debounce, cập nhật trạng thái của đèn LED (ledState) bằng trạng thái hiện tại của cảm biến góc nghiêng (tiltState). Sau đó, sử dụng hàm digitalWrite(ledPin, ledState) để điều khiển đèn LED theo trạng thái đã cập nhật.
Cuối cùng, gán giá trị hiện tại của cảm biến độ nghiêng (tiltState) vào biến lastTiltState, để lưu trữ giá trị trạng thái trước đó và sử dụng cho việc so sánh trong lần chạy tiếp theo của vòng lặp loop().