Xe robot tránh vật cản
Mục lục
Xe robot tránh vật cản
- Linh kiện và giới thiệu mô hình
1 board Arduino Uno.
1 cảm biến khoảng cách siêu âm – HC – SR04
Motor Driver IC – L293D
Servo Motor (Tower Pro SG90)
2 bộ bánh xe gắn kèm motor
Khung robot
Nguồn cấp từ pin 9v và jack kết nối với Arduino
Đây sẽ là một ứng dụng hết sức thú vị khi chính tay ta lắp ráp 1 chiếc xe thông minh có thể tự nhận biết và tránh đường khi gặp vật cản,dựa vào cảm biến siêu âm HC-SR04 vả board Arduino Uno
Driver motor L293D sẽ điều khiển 2 động cơ DC 5v dẫn động cho hai bánh của xe quay thuận và nghịch nhờ tín hiệu từ Arduino qua driver điều khiển 2 động cơ độc lập nhau. Qua sự đảo chiều và quay tuần tự hay đồng thời của động cơ mà xe có thể quay trái,phải,khi chỉ có 1 động cơ ở bên tương ứng quay hoặc quay ngược. Để tránh vật cản,ta dùng 1 cảm biến HC-SR-04 phát đi tín hiệu siêu sau đó tín hiệu phản hồi,qua sự phản hồi tín hiệu ta có được thông số về khoảng cách đến vật cản,sau đó sẽ truyền tín hiệu đến bộ vi xử lý là board Arduino để có thể nhận bết và quay hướng khác hay lùi lại
II) Sơ đồ toàn mạch
III) Kết nối các linh kiện
ta sẽ kết nối theo sơ đồ dưới đây
IV) Giải thích các linh kiện
1.Cảm biến siêu âm HC-SR04
Phát hiện vật cản ở vị trí không tiếp xúc,khoảng cách phát hiện từ 2cm -4 cm
2. L293D
Đây là bộ điều khiển và đảo chiều động cơ,dựa trên sự thay đổi hướng của dòng điện qua động cơ mà ta có thể đảo chiều nó
3. Servo motor
Đây là loại servo có góc quay tối đa là 1800 tuy nhiên,trong ứng dụng này,ta cùng servor để tạo góc quét cho cảm biến,vì vậy,góc quét tối đa của servo sẽ là 900
I. Giải thích nguyên lý mạch
Arduino là bộ xử lý trung tâm của robot với 14 ngõ I/O số sẵn có
Cảm biến siêu âm có 4 chân: Vcc, Trig, Echo và Gnd. Vcc và Gnd được kết nối với các chân 5v và GND của Arduino
Servo được sử dụng để tạo góc quay cho cảm biến siêu âm,tương tự như một radar hay mắt của robot tạo ra tầm nhìn cho nó để tránh vận cản trong phạm vi cụ thể.Servo được kết nối và điều khiển từ chân digital 11 của arduino
L293 D là 1 ic có 16 chân ,chân từ 1 và 9 là các chân cho phép,kết nối với VCC 5V,chân 2 và 7 là ngõ vào điều khiển,nhận tín hiệu từ vi điều khiển là board Arduino cho động cơ thứ 1 và được kết nối với chân 6 và 7 trên board arduino
Tương tự,động cơ thứ 2 được điều khiển bởi chân 10 và 15 nhận tín hiệu điều khiển từ Arduino và được kết nối với chân 5 và 4 của Arduino,chân 4,5,12,13 được nối vào GND.
Động cơ đầu tiên,xem như là động cơ bên trái được kết nối với chân 3 và 6 của L293D,động cơ thứ 2 thì kết nối chân 11 và 14.
Sử dụng 1 tín hiệu kích hoạt từ bên ngoài vào chân Trig của cảm biến siêu âm tạo ra trong vòng 10us 8xung 40KHz phát ra từ đầu phát tín hiệu,và nhận lại phản hồi ở đầu nhận tín hiệu.Khi tín hiệu phản hồi lại chân Echo sẽ lên mức cao. Thời gian phát tín hiệu có thể điều chỉnh được.
- Nguyên lý hoạt động
Khi xe bắt đầu hoạt động,cả hai động cơ dẫn động hai bánh quay theo chiều thuận,đưa xe về phía trước,đồng thời, bộ vi xử lý ở đây là Arduino se liên tục tính toán khoảng cách từ cảm biến siêu âm trên robot đến bề mặt phản xạ.Nếu khoảng cách tới bề mặt vận cảm phản xạ cho thấy nhỏ hơn 15cm thì robot dừng lại,quét phía trái và phải,nếu phía nào trống thì 1 động cơ sẽ quay thuận trong khi 1 động cơ dừng cho phép robot đi về 1 hướng trái hoặc phải,còn nếu khoảng cách lớn hơn 15 cm thì robot sẽ quay đầu và đi thẳng theo hướng ngược so với lúc đầu
VII. Giới thiệu về chương trình
#include <Servo.h>
#define trig 3
#define echo 4 Servo srf05; // create servo object to control a servo
#define inA1 6
#define inA2 7
#define inB1 8
#define inB2 9 void setup() {
pinMode(inA1, OUTPUT); pinMode(inA2, OUTPUT); pinMode(inB1, OUTPUT); pinMode(inB2, OUTPUT); pinMode(trig,OUTPUT); pinMode(echo,INPUT); srf05.attach(5); // attaches the servo on pin 9 to the servo object } void loop() { objectAvoider (inA1, inA2, inB1, inB2,50, 1000); } int objectDistance_cm (byte angle) { srf05.write(angle); delay(500); unsigned long duration;//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); delayMicroseconds(2); digitalWrite(trig,1); delayMicroseconds(5); digitalWrite(trig,0); /* tính toán thời gian */ duration = pulseIn(echo,HIGH distance = int(duration/2/29.412); /* in kết quả ra Serial monitor * //Serial.print(distance); //Serial.println("cm"); //delay(200); return distance; } void robotMover (byte inR1, byte inR2, byte inL1, byte inL2, byte action) { /* inR1 inR2 là 2 chân tín hiệu động cơ bên phải inL1 inL2 là 2 chân tín hiệu động cơ bên trái action= 0 đứng yên action =1 đi thẳng action =2 lùi lại action =3 quay trái action =4 quay phải action =5 rẽ trái action =6 rẽ phải action =7 rẽ lùi trái action =8 rẽ lùi phải */ switch (action) { case 0:// không di chuyển motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 0); break; case 1://đi thẳng motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 1); break; case 2:// lùi lại motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 2); break; case 3:// quay trái motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 2); break; case 4:// quay phải motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 1); break; case 5:// rẽ trái motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 0); break; case 6:// rẽ phải motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 1); break; case 7:// rẽ lùi trái motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 0); break; case 8:// rẽ lùi phải motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 2); break; default: action = 0; }} void motorControlNoSpeed (byte in1,byte in2, byte direct) { // in1 and in2 are 2 signal pins to control the motor// en is the enable pin// the defauspeed is the highest// direct includes:// 0:Stop// 1:Move on 1 direct// 2:Move on another directswitch (direct) { case 0:// Dừng không quay digitalWrite(in1,LOW); digitalWrite(in2,LOW); break; case 1:// Quay chiều thứ 1 digitalWrite(in1,HIGH); digitalWrite(in2,LOW); break; case 2:// Quay chiều thứ 2 digitalWrite(in1,LOW); digitalWrite(in2,HIGH); break; //default: }} oid objectAvoider (byte inR1, byte inR2, byte inL1, byte inL2, byte allow_distance, int turn_back_time) { robotMover(inR1,inR2,inL1,inL2,1); Serial.println("Tiến"); //delay(10); int front_distance=objectDistance_cm (90); int left_distance; int right_distance; int max_distance; if (front_distance > allow_distance) { robotMover(inR1,inR2,inL1,inL2,1); Serial.println("Tiến"); delay(10); } if (front_distance <= allow_distance) { robotMover(inR1,inR2,inL1,inL2,2); Serial.println("Lùi"); delay(300); robotMover(inR1,inR2,inL1,inL2,0); left_distance = objectDistance_cm (180); //đo khoảng cách bên trái Serial.println("left: "); Serial.println(left_distance); //delay (3000); right_distance = objectDistance_cm (0); //đo khoảng cách bên phải Serial.println("right: "); Serial.println(right_distance); Serial.println("front: "); Serial.println(front_distance); //delay (3000); max_distance = max(left_distance,right_distance); // so sánh giá trị lớn nhất với khoảng cách bên phải (gán bằng cái lớn nhất) if (max_distance==left_distance) { robotMover(inR1,inR2,inL1,inL2,3); Serial.println("Rẽ trái"); delay (turn_back_time/2); // Nếu bên trái là khoảng cách lớn nhất thì rẽ trái } else { if (max_distance==right_distance) { robotMover(inR1,inR2,inL1,inL2,4); // Nếu bên phải có khoảng cách lớn nhất thì rẽ phải Serial.println("Rẽ phải"); delay (turn_back_time/2); } } }}
VIII. Các ứng dụng khác
Đây là một ứng dụng mở cho nên ta có thể dùng nó vào những dự án khác,như robot hút bụi,lau dọn nhà,robot giúp việc,…
- Tham khảo
https://www.electronicshub.org/obstacle-avoiding-robot-arduino/