HƯỚNG DẪN SỬ DỤNG CẢM BIẾN SIÊU ÂM HC-SR05 (PHẦN 2)
a. Sơ đồ nguyên lý
Để
đơn giản cho việc mô tả thuật toán ở đây mình sử dụng board mạch Arduino Uno. Hẳn
các bạn yêu DIY đã khá quen thuộc với board mạch này.
Sơ
đồ kết nối
Ở sơ đồ này tôi chọn Mode
1 (sử dụng riêng sẽ hai chân Trigger và Echo) chân Digital 7 của board sẽ sử dụng
để phát tín hiệu trigger còn chân Digital 6 sẽ sử dụng để đọc tín hiệu Echo.
b. Code
int pingPin = 7;
int inPin = 6;
long duration, inches, cm;
int indec, cmdec;
int inchconv = 147;
// Đây là hằng số chuyển đổi từ us
sang inc có thể dễ dàng suy ra từ công thức trên
int cmconv = 59;// hằng số chuyển đổi
từ us sang cm
String s1, s2;
void setup()
{
Serial.begin(9600);
while(!Serial);
pinMode(pingPin, OUTPUT);
pinMode(inPin, INPUT);
}
void loop()
{
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);// Phat xung kich
hoat cam bien
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
duration = pulseIn(inPin, HIGH);// Do do rong xung
// Lay phan nguyen cua khoang cach (inch)
inches = microsecondsToInches(duration);
// Lay phan thap phan cua khoang cach (inch)
indec = (duration - inches * inchconv) * 10 / inchconv;
// Lay phan nguyen cua khoang cach (cm)
cm = microsecondsToCentimeters(duration);
// Lay phan thap phan cua khoang cach (cm)
cmdec = (duration - cm * cmconv) * 10 / cmconv;
//Chuyển đổi kết quả sang xâu
s1 = String(inches) + "." + String(indec) + "in";
s2 = String(cm) + "." + String(cmdec) + "cm";
Serial.println(s1);
Serial.println(s2);
delay(1000);
}
long microsecondsToInches(long
microseconds)
{
return microseconds / inchconv;
}
long microsecondsToCentimeters(long
microseconds)
{
return microseconds / cmconv;
}
c. Phương pháp xử lý sai số
Đây
là việc làm khá phổ biến khi làm việc với các thiết bị đo lường nhưng nhiều bạn
khi lập trình thường bỏ qua bước này. Nếu các bạn đã từng sử dụng cảm biến siêu
âm HC-SR05 sẽ thấy quá trình đo lường xảy ra nhiễu khi cảm biến bị rung hoặc
nguồn không ổn định, đôi khi cũng là lỗi phát sinh từ vi điều khiển khi đo độ rộng
xung không chính xác.
Ở
đây tôi khử sai số bằng phương pháp như sau:
-
Đầu tiên thực hiện kết quả đo N lần (
trong đó N=2n) thực nghiệm chỉ ra rằng việc lấy N là số mũ của 2 sẽ
cho phương pháp này đạt kết quả tốt nhất.( tùy vào tốc độ của vi xử lý mà có thể
chọn n từ 6-12)
-
Sắp xếp lại N kết quả đo theo thứ tự tăng
dần bằng một trong các thuật toán sắp xếp
-
Loại bỏ đi x% các giá trị lớn nhất và nhỏ
nhất (x có thể từ 10->30) khi đó ta có thể loại đi những giá trị sai số ngẫu
nhiên
-
Lấy trung bình các giá trị còn lại cho ta
kết quả phép đo
Sau
khi tiến hành thực hiện như trên kết quả đã ổn định nhưng vẫn còn sai số offset
dạng như kết quả thực tế là 2cm trong khi kết quả đo được là 3cm. Ta tiến hành
hiệu chỉnh bằng phép nội suy tuyến tính.
Ví
dụ bạn có khoảng cách đo được là x1,x2 tương ứng khoảng cách thực tế y1,y2 (nên
chọn x1,x2 cách xa nhau)
Giả sử hàm sai số tuyến tính như
sau y=ax+b
Trong đó x là khoảng cách đo được
và y là khoảng cách thật. Để xác định hệ số a,b ta giải hệ phương trình
y1=ax1+b
y2=ax2+b
Từ đó ta xác định được
hàm nội suy từ kết quả đo được ra kết quả thực tế.
0 nhận xét:
Đăng nhận xét