You are currently viewing Sensors

Sensors

A. Giới thiệu chung 

Một trong những lợi thế lớn nhất của mạch Arduino là sự đa dụng và tiện lợi

của nó, và điểm mạnh ấy được thể hiện rõ nhất qua khả năng phối hợp với rất nhiều loại cảm biến khác nhau. Điều này khiến mạch Arduino trở thành lựa chọn phổ biến nhất cho các dự án tự động hóa quy mô nhỏ. 

Một số loại cảm biến có thể kể đến như: khoảng cách, cảm biến góc, encoder, …

B. Cảm biến khoảng cách 

1. Khái niệm 

Cảm biến khoảng cách hay còn được gọi với tên cảm biến li độ, là thiết bị điện tử giúp xác định khoảng cách từ vị trí của điểm xét đến vật thể. 

2. Phân loại 

Cảm biến khoảng cách được phân loại theo nguyên lý hoạt động thành 1 số loại sau:

  • Cảm biến siêu âm (ultrasonic sensor)
  • Cảm biến laser
  • Cảm biến từ
  • Cảm biến hồng ngoại (tiệm cận)

Trong đó, giáo án này sẽ tập trung vào cảm biến siêu âm và cảm biến tiệm cận

3. Cảm biến siêu âm (HC-SR04) 

Cảm biến siêu âm HC-SR04(Ultrasonic Sensor) được sử dụng rất phổ biến để xác định khoảng cách vì RẺ và CHÍNH XÁC. Cảm biến HC-SR04 sử dụng sóng siêu âm và có thể đo khoảng cách trong khoảng từ 2 -> 300cm, với độ chính xác gần như chỉ phụ thuộc vào cách lập trình.

Cấu tạo:

  • Bộ phận phát sóng siêu âm:Cấu tạo của các đầu phát và đầu thu siêu âm là các loa gốm đặc biệt, phát siêu âm có cường độ cao ở tần số thường là 40kHz cho nhu cầu đo khoảng cách.

  • Bộ phận thu sóng siêu âm phản xạ:Thiết bị thu là dạng loa gốm có cấu tạo chỉ nhạy với một tần số chẳng hạn như 40KHz. Qua một loạt các linh kiện như OPAM TL072, transistor NPN…Tín hiệu này liên tục được khuếch đại biên độ và cuối cùng là đưa qua một bộ so sánh, kết hợp với tín hiệu từ bộ điều khiển để đưa về bộ điều khiển.
  • Bộ phận xử lý, điều khiển tín hiệu:Vi điều khiển (PIC16F688, STC11,…) được sử dụng làm nhiệm vụ phát xung, xử lý tính toán thời gian từ khi phát đến khi thu được sóng siêu âm nếu nhận được tín hiệu TRIG.

● Nguyên lý hoạt động: Để đo khoảng cách bằng cảm biến siêu âm HC-SR04, bộ phận phát sóng sẽ phát 1 xung rất ngắn (5 microseconds) từ chân TRIG. Tiếp theo, 1 xung HIGH ở chân ECHO sẽ đượcphát đi cho đến khi nhận lại được sóng phản xạ ở chân này. Lúc này, độ rộng của xung sẽ bằng với thời gian sóng siêu âm được phát từ cảm biến và phản xạ lại. Sau khi đã tính được thời gian, cảm biến sẽ chia cho hằng số tốc độ âm thanh trong không khí để ra khoảng cách.

Thông số kỹ thuật cảm biến siêu âm HC-SR04: 

  • Model: HC-SR04
  • Điện áp làm việc: 5VDC
  • Dòng điện: 15mA
  • Tần số: 40 KHz
  • Khoảng cách phát hiện: 2cm – 4m
  • Tín hiệu đầu ra: Xung mức cao 5V, mức thấp 0V
  • Góc cảm biến: Không quá 15 độ.
  • Độ chính xác: Lên đến 3mm
  • Chế độ kết nối: VCC / Trig (T-Trigger) / Echo (R-Receive) / GND

Sơ đồ kết nối: 

  • Chân VCC: Chân nguồn 5V
  • Chân TRIG: Chân digital output
  • Chân ECHO: Chân digital input
  • Chân GND: Chân nguồn âm

● Code tham khảo:

const int trig = 8; //chân TRIGcủa HC-SR04 
const int echo = 7; //chân ECHO của HC-SR04 
void setup() 
{
Serial.begin(9600); //giao tiếp Serial với baudrate 960 
pinMode(trig,OUTPUT); //chân TRIG sẽ phát tín hiệu 
pinMode(echo,INPUT); //chân ECHOsẽ nhận tín hiệu 
} 
void loop() 
{ 
unsigned long time; //biến đo thời gian 
int distance; //biến lưu khoảng cách 
/* Phát xung từ chân trig * 
digitalWrite(trig,0); //tắt chân trig 
delayMicroseconds(2) 
digitalWrite(trig,1); //phát xung từ chân trig 
delayMicroseconds(5); //xung có độ dài 5 microSeconds 
digitalWrite(trig,0); // tắt chân trig 
/* Tính toán thời gian * 
//Đo độ rộng xung HIGH ở chân echo. 
time = pulseIn(echo,HIGH); 
//Tính khoảng cách đến vật 
distance = int(time/2/29.412) 
/* In kết quả ra Serial Monitor * 
Serial.print(distance) 
Serial.println(“cm“) 
delay(200) 
} 

4. Cảm biến hồng ngoại (tiệm cận) 

● Cảm biến hồng ngoại (IR) là một “công tắc” cảm biến tiệm cận. Khi một vật thể hoặc chướng ngại vật đủ gần để chặn tầm nhìn phía trước của 2 đèn LED, nó sẽ kích hoạt module thu IR. Cảm biến sử dụng nguyên lý phản xạ điện từ, càng gần bề mặt phản xạ (vật thể) thì tín hiệu nhận được từ máy phát càng mạnh do khoảng cách truyền của sóng phản xạ càng ngắn.

Nguyên lý hoạt động: 

  • Khi có một vật cản đủ gần, phát hiện điện từ IR do bộ thu IR nhận được cao hơn mức ngưỡng (mức người dùng cài đặt trước), cảm biến sẽ thay đổi chế độ chuyển đổi đầu ra. Cảm biến hồng ngoại chỉ có 2 tín hiệu đầu ra Digital hoặc ở mức cao (5V hoặc 3,3V phụ thuộc vào điện áp đầu vào) hoặc thấp (0V), do đó cảm biến này không thể được sử dụng như một cảm biến khoảng cách mà chỉ như một công tắc kích hoạt.
  • Khi không có chướng ngại vật hoặc đối tượng trong khoảng cách phát hiện, đầu ra ở vị trí CAO (5V hoặc 3.3V). Khi khoảng cách ngắn hơn hoặc bằng ngưỡng đã đặt, tín hiệu đầu ra sẽ chuyển sang vị trí THẤP (0V).
  • Bởi nguyên lý hoạt động trên, cảm biến hồng ngoại rất thích hợp để ứng dụng làm công tắc ảo hoặc tránh chướng ngại vật.

Sơ đồ kết nối 

● Code tham khảo:

void setup() 
{ 
Serial.begin(9600); //giao tiếp Serial với baudrate 960 
} 
void loop() 
{ 
Serial.println(digitalRead(3)); //Chân output cắm vào cổng digital 3 }

C. Cảm biến đo góc – Gyro 

1. Khái niệm 

Là cảm biến dùng để đo gia tốc thẳng theo hướng ba trục x, y, z và vận tốc xoay quanh trục x, y, z trong hệ tọa độ không gian của cảm biến đó. 

2. Cấu tạo 

● Gồm 2 thành phần chính: Bộ phận đobộ phận xử lý 

  • Với các cảm biến gyro hiện đại như hiện nay, bộ phận đo thường được cấu tạo bởi một cấu trúc gọi là MEMS (Micro-Electro-Mechanical-Systems). Đây là một cấu trúc cấu thành từ các phần tử nhỏ có kích cỡ từ 0.001 mm đến 0.1 mm, được làm từ nhiều vật liệu như kim loại, silicon, polymer,… Đơn giản có thể hiểu đây là một hệ thống cơ-điện tử siêu nhỏ được gắn trong con chip.
  • Bộ phận xử lýsẽ xử lý các thông số được lấy bởi bộ phận đo và trả về bo mạch chủ.

3. Nguyên lý hoạt động 

● Cảm biến gia tốc (accelerometer) hoạt động dựa trên sự thay đổi điện dung của các bộ phận nhỏ vừa kể trên khi chuyển động. Nó giống như một vật có khối lượng gắn với một cái lò xo. Khi có gia tốc, vật sẽ bị kéo chuyển động ra/ vào, gây ra sự thay đổi về giá trị điện dung giữa vật đó và một điện cực. Dựa vào giá trị đo được, qua bộ xử lý sẽ cho ra gia tốc. 

● Cảm biến vận tốc góc (gyroscope, hay còn gọi tắt là gyro) hoạt động dựa trên hiệu ứng Coriolis. Có thể tưởng tượng đơn giản: một vật nhỏ vừa chuyển động vừa quay sẽ bị lệch ra khỏi quỹ đạo của nó do một lực gọi là lực Coriolis. Từ việc lệch này, điện dung của vật đó so với một điện cực sẽ thay đổi, thông qua việc đo sự thay đổi điện dung, bộ xử lý tính được vận tốc góc.

● Cảm biến đo góc so với trục từ trái đất (magnetometer) hoạt động dựa trên hiệu ứng Hall và hiệu ứng biến đổi điện trở theo từ trường của một số kim loại đặc biệt. Hiệu ứng Hall hoạt động dựa trên việc đưa một dòng điện chạy qua một tấm kim loại. Khi có một từ trường tác động vào tấm kim loại, dòng điện chạy qua tấm kim loại sẽ bị ảnh hưởng. Thông qua việc đo sự thay đổi về hiệu điện thế, bộ xử lý sẽ tính ra được góc so với trục từ trái đất. Một số cảm biến sử dụng hiệu ứng biển đổi điện trở theo từ trường của một số kim loại như sắt và niken.

4. MPU-6050 

● MPU6050 IMU là loại gyro phổ biến nhất trên thị trường hiện tại bởi giá thành rẻ (khoảng 50000 VND), độ chính xác cao và dễ tiếp cận.

Sơ đồ lắp mạch: 

● Cách nối:

  • Cấp nguồn: nguồn được cấp cho cảm biến qua hai pin VCC và GND. VCC (cực dương) nối với nguồn điện 5V, còn GND (cực âm) nối với cực âm trên Arduino.
  • Kết nối I2C: kết nối I2C thông qua 2 pin là SCL (clock) và SDA (data). Nối pin SCL trên cảm biến với lỗ SCL trên Arduino (như hình), và nối pin SDA trên cảm biến với lỗ SDA trên Arduino (trên hình).
  • Các pin khác trên module cảm biến không nối gì.

● Cách lập trình:

  • Thông thường, để giao tiếp với các thiết bị I2C, người ta thường dùng các hàm để gửi / nhận command I2C từ thư viện `Wire.h` trên Arduino. Tuy nhiên, vì tính chất phức tạp của module này, việc tự viết các command I2C để gửi và nhận là khá phức tạp và rắc rối, đôi khi còn để lại một số lỗi khó tìm ra nếu không cẩn thận. Chính vì vậy, đã có nhiều thư viện mã nguồn mở được sinh ra để làm điều này một cách an toàn và dễ dàng hơn. Một trong các thư viện đó là thư viện Arduino-MPU6050: https://github.com/jarzebski/Arduino-MPU6050
  • Cài đặt thư viện:
  • Tải file zip của repo https://github.com/jarzebski/Arduino-MPU6050 về (trong mục Code có phần tải zip)

  • Mở Sketch -> Include Library -> Add .ZIP Library
  • Chọn file zip vừa tải về.
  • Cài thành công sẽ có thông báo:
  • Thử một số ví dụ cơ bản

+ Tính toán các góc của Gyro

// Đầu tiên, chúng ta sẽ include các thư viện cần dùng để giao tiếp với cảm biến này 
#include <Wire.h> // Thư viện dùng để thực hiện giao tiếp I2C (lưu ý include trước thư viện MPU6050) 
#include <MPU6050.h> // Thư viện để giao tiếp với MPU 
MPU6050 mpu; // Khai báo một cảm biến MPU6050
// Các biến dùng để đếm thời gian (sẽ giải thích bên dưới) 
unsigned long timer = 0; 
float timeStep = 0.01; 
// Các biến lưu giá trị các góc hiện tại 
float pitch = 0; // Pitch: góc quay so với trục Y (trục hướng về phía trước trên module cảm biến (xem ảnh ở trên). Hiểu đơn giản, với góc này ta xác định được cảm biến đang nghiêng sang trái hay sang phải (khác với xoay của trục Z) 
float roll = 0; // Roll: góc quay so với trục X (trục hướng sang ngang của cảm biến). Hiểu đơn giản, với góc này ta xác định được cảm biến đang nghiêng về phía trước hay đang được nâng mũi lên (nghiêng về phía sau) float yaw = 0; // Yaw: góc quay so với trục Z (trục hướng thẳng đứng, vuông góc với mặt đất). Hiểu đơn giản, với góc này ta xác định được cảm biển đang xoay trái hay phải 
void setup() 
{ 
// Mở serial port với baudrate 115200 bps 
Serial.begin(115200); 
// Khởi tạo kết nối với cảm biến 
// Khởi tạo kết nối sử dụng hàm mpu.begin() với hai tham số là MPU6050_SCALE_2000DPS và MPU6050_RANGE_2G để chỉ sample rate và range của cảm biến (không nên thay đổi trừ khi thấy không phù hợp với cảm biến của mình) 
// Khi khởi tạo thành công, hàm sẽ trả về giá trị boolean true, còn nếu không thì false. 
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { 
Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); // Thông báo chưa kết nối được 
delay(500); // Chờ 500 ms rồi kết nối lại 
} 
// Calibrate gyro (chỉnh gyro về giá trị ban đầu phù hợp) 
mpu.calibrateGyro(); 
void loop() 
{ 
// Lấy thời gian hiện tại tính theo ms kể từ lúc bật chương trình timer = millis(); 
// Đọc giá trị gyro 
Vector norm = mpu.readNormalizeGyro(); 
// Tính toán các giá trị góc
// Ở đây, giá trị góc hiện tại được tính bằng giá trị góc trước đó + vận tốc góc hiện tại * khoảng thời gian cố định 
pitch = pitch + norm.YAxis * timeStep; 
roll = roll + norm.XAxis * timeStep; 
yaw = yaw + norm.ZAxis * timeStep; 
// Xuất giá trị góc ra serial console 
Serial.print(" Pitch = "); 
Serial.print(pitch); 
Serial.print(" Roll = "); 
Serial.print(roll); 
Serial.print(" Yaw = "); 
Serial.println(yaw); 
// Chờ một khoảng thời gian bằng timeStep * 1000 - khoảng thời gian đã tốn để thực thi đoạn code trên rồi mới tiếp tục thực thi 
delay((timeStep*1000) - (millis() - timer)); 
} 

+ Tính gia tốc theo hai trục X, Y và Z

#include <Wire.h> 
#include <MPU6050.h> 
MPU6050 mpu; 
void setup() 
{ 
Serial.begin(115200); 
Serial.println("Initialize MPU6050"); 
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { 
Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); delay(500); 
} 
} 
void loop() 
{ 
// Đọc các giá trị gia tốc theo ba trục 
Vector normAccel = mpu.readNormalizeAccel();
Serial.print(" Xnorm = "); 
Serial.print(normAccel.XAxis); 
Serial.print(" Ynorm = "); 
Serial.print(normAccel.YAxis); 
Serial.print(" Znorm = "); 
Serial.println(normAccel.ZAxis); 
delay(10); 
} 

+ Tính toán gia tốc quay theo hai trục X và Y

#include <Wire.h> 
#include <MPU6050.h> 
MPU6050 mpu; 
void setup() 
{ 
Serial.begin(115200); 
Serial.println("Initialize MPU6050"); 
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { 
Serial.println("Could not find a valid MPU6050 sensor, check wiring!"); delay(500); 
} 
} 
void loop() 
{ 
// Đọc giá trị gia tốc hiện tại 
Vector normAccel = mpu.readNormalizeAccel(); 
// Dùng lượng giác để tính toán gia tốc quay 
int pitch = -(atan2(normAccel.XAxis, sqrt(normAccel.YAxis*normAccel.YAxis + normAccel.ZAxis*normAccel.ZAxis))*180.0)/M_PI; 
int roll = (atan2(normAccel.YAxis, normAccel.ZAxis)*180.0)/M_PI; 
// Output 
Serial.print(" Pitch = "); 
Serial.print(pitch);
Serial.print(" Roll = "); Serial.print(roll); 
Serial.println(); 
delay(10); 
}


Tài liệu được trích dẫn, tham khảo từ các nguồn:

  1. Tài liệu team First Global Challenge VietNam

License.

This work is licensed under a Creative Commons Attribution-NonCommercial ShareAlike 4.0 International License.

This image has an empty alt attribute; its file name is 38uUlrOi--H7IaiAlFzPATEWmbKnlwvxxWShq91MTZP1j-VquVe_aAHuXc4a6waelmKKUu6MfnfxfmZe6ceg1vqhD0tgi-8ELz9K21ch-olUb3ueKTzXJvmAtOaitQgqQ198kG9QF7Kwz1p5zR_uFA