Chƣơng 3 THIẾT KẾ, LẮP ĐẶT LẬP TRÌNH ĐO ĐỘ RƠ VÔ LĂNG
3.2. Mô phỏng mạch trên Proteus
Chúng em thảo luận với nhau sử dụng Arduino Nano để làm vi điều khiển trung tâm, dùng LCD 16x2 để làm màn hình hiển thị thơng tin, dùng cảm biến siêu âm US-015 để phát hiện sự dịch chuyển của bánh xe, sử dụng incremental rotary encoder LPD3806- 400BM-G5-24C có 600 xung/vịng để đo góc xoay của vơ lăng, nhƣ vậy độ chia nhỏ nhất của của cảm biến là độ. Dùng cầu H rờ le để điều khiển động cơ. Trong Proteus thì chúng em sử dụng sẵn Motor có sẵn Encoder giả lập phát 3 tín hiệu xung pha A, pha B và pha Z, chúng em chỉ sử dụng hai pha A và pha B để xác định góc quay. Nhƣ hình 3.17 thì hoảng cách của cảm biến siêu âm tới bánh xe dẫn hƣớng đƣợc điều chỉnh bằng biến trở, đầu tiên thì vi điều khiển lƣu hoảng cách chuẩn từ cảm biến siêu âm tới bánh xe dẫn hƣớng, cho động cơ điện phát động vô lăng quay ngƣợc chiều im đồng hồ, khi khoảng cách từ cảm biến siêu âm tới bánh xe dẫn hƣớng nhỏ hơn khoảng cách chuẩn thì dừng động cơ điện lại, đặt giá trị đo góc về 0, tiếp tục cho vô lăng quay qua phải tới khi khoảng cách từ cảm biến siêu âm tới bánh xe dẫn hƣớng lớn hơn khoảng cách chuẩn thì dừng lại, ghi nhận giá trị góc quay tự do hay độ rơ vô lăng và xuất giá trị ra màn hình LCD. Sau hi lập trình trên Arduino, cho chạy thử trên Proteus thì chúng em thấy hệ thống hoạt động thành công trên nguyên lý đo.
42 Code để cảm biến siêu âm biết đƣợc khoảng cách:
long sieuam() {
digitalWrite(TrigPin, LOW); delayMicroseconds(2);
digitalWrite(TrigPin, HIGH); //tạo ra một xung trong khoảng thời gian ngắn delayMicroseconds(5);
digitalWrite(TrigPin, LOW);
Time_Echo_us = pulseIn(EchoPin, HIGH,20000);
/* cảm biến sẽ tạo xung HIGH ở chân Echo từ khi phát đến khi nhận lại tín hiệu xung ở chân Trig, hàm pulse sẽ đo khoảng thời gian đó*/
kc = Time_Echo_us/2/29.412;
/* Tốc độ của âm thanh trong khơng khí là 340 m/s (hằng số vật lý), tương đương với 29,412 microSeconds/cm (106 / (340*100)). Khi đã tính được thời gian, ta sẽ chia cho 29,412 để nhận được khoảng cách.*/
return kc; // trả kết quả về hàm sieuam()}
Code để encoder biết đƣợc góc xoay:
attachInterrupt(0, demxung, FALLING);
/* dùng hàm ngắt khi pha A của encoder từ mức HIGH xuống mức LOW thì gọi chương trình demxung để thực thi */
void demxung() { if (digitalRead(int2) == LOW) { xung++; }
// khi đó pha B ở mức LOW thì encoder xoay theo chiều kim đồng hồ, xung sẽ tăng lên một đơn vị
else { xung--;
43
}
// nếu pha B ở mức HIGH thì encoder xoay ngược chiều kim đồng hồ, xung sẽ giảm một đơn vị
}
Khi ta đó để tính được góc xoay encoder ta lấy xung*360/600
Code để điều khiển động cơ điện hình 3.1:
void quaytrai() {
digitalWrite(in1,HIGH); // vi điều khiển tạo điện áp làm transitor Q1 dẫn, điện qua cuộn dây làm rờ le 1 dẫn, động cơ điện quay trái
digitalWrite(in2,LOW); }
void quayphai() {
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH); // vi điều khiển tạo điện áp làm transitor Q2 dẫn, điện qua cuộn dây làm rờ le 2 dẫn, động cơ điện quay phải
}
void dungyen() {
digitalWrite(in1,LOW);
digitalWrite(in2,LOW); // vi điều khiển ngắt điện áp kích làm hai transitor không dẫn, nên hai rờ le ngắt, động cơ điện đứng yên}
Code điều khiển hệ thống mô phỏng đo độ rơ vô lăng:
void loop()
{if (kcc == 0) kcc = sieuam(); // đầu tiên đặt khoảng cách chuẩn từ cảm biến đến bánh xe
while ( kcc == sieuam()) quaytrai(); // trong khi khoảng cách chuẩn bằng với khoảng cách siêu âm trả về thì động cơ điện quay trái
dungyen();
44
point = true;// xác định động cơ điện đã quay sang trái
while ((kcc < sieuam()) && point ==true) quayphai(); // trong khi khoảng cách chuẩn nhỏ so với khoảng cách siêu âm trả về thì động cơ điện quay phải while ((kcc >= sieuam()) && point ==true ) dungyen(); // // trong khi khoảng cách chuẩn lớn hơn hoặc bằng với khoảng cách siêu âm trả về thì động cơ điện đứng yên
lcd.begin(16, 2); lcd.setCursor(1,0);
lcd.print("DO RO VO LANG"); lcd.setCursor(0,1);
lcd.print(xung*360/600); // xuất giá trị góc quay tự do hay độ rơ ra màn hình lcd.print(" do");
if (xung*360/600 < 12) lcd.print(" ------ Dat"); else {lcd.print(" ------Chua Dat");}