Thứ Tư, 7 tháng 10, 2015

Hướng dẫn sử dụng cảm biến siêu âm HC-SR05 (PHẦN 2)

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ơ đồ ghép nối cảm biến siêu âm với arduino
Ở 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