Xe robot tránh vật cản

  1. 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.

  1. 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,…

  1. Tham khảo

https://www.electronicshub.org/obstacle-avoiding-robot-arduino/

http://arduino.vn/result/1306-robot-tranh-vat-can