Robot sử dụng Arduino và Bluetooth Module (Obstacle Avoidance Robot)
Dự án này được thiết kế để xây dựng một robot tự động phát hiện chướng ngại vật trên con đường của nó và hướng dẫn chính nó bất cứ khi nào một trở ngại đi trước nó. Chiếc xe robot này được chế tạo, sử dụng bảng Arduino UNO. Một cảm biến siêu âm được sử dụng để phát hiện bất kỳ trở ngại nào phía trước nó. Một trình điều khiển động cơ IC và 2 động cơ DC được sử dụng để điều khiển chuyển động của robot. Một động cơ servo cũng được sử dụng trong dự án này. Cảm biến siêu âm sau đó được gắn trên servo và bằng cách xoay servo đến các góc độ khác nhau, chúng tôi sẽ có được các bài đọc từ cảm biến siêu âm ở những góc đó. Điều này sẽ giúp bộ điều khiển phát hiện đường dẫn chính xác để điều hướng. Một mô-đun Bluetooth cũng được thêm vào dự án (đó là tùy chọn) để điều khiển robot từ điện thoại Android của bạn khi nó ở chế độ thủ công.
Mục tiêu của dự án
• Điều hướng một cách an toàn bằng cách tránh chướng ngại vật đi trước.
• Phát hiện đường dẫn chính xác bằng cách kiểm tra các bài đọc cảm biến ở các góc độ khác nhau.
• Gửi trạng thái của chuyển động robot (sử dụng mô-đun Bluetooth) đến điện thoại Android gần đó khi robot ở chế độ tự động.
• Điều hướng ở chế độ thủ công bằng cách nhận tín hiệu từ điện thoại.
Sơ đồ Mạch
Lắp ráp các mạch như thể hiện trong sơ đồ! Các kết nối quan trọng được giải thích dưới đây.
HC SR04 là cảm biến siêu âm mà chúng tôi đang sử dụng ở đây. 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 cung cấp của Arduino. Trig được kết nối với pin thứ 11 và Echo được kết nối với pin thứ 10 của Arduino.
Như đã đề cập trước đó một động cơ điều khiển IC gọi là L293D được sử dụng để kiểm soát các động cơ DC. Nó là một IC 16 pin có thể lái xe hai động cơ cùng một lúc. 1 và 9 pin là các chân cho phép, được kết nối với các chân thứ 5 và 6 của hội đồng quản trị Arduino. Ghim 2 và 7 là đầu vào điều khiển từ vi điều khiển cho động cơ đầu tiên. Chúng được kết nối với các chân A0 và A1 của Arduino tương ứng. Tương tự như vậy, chân 10 và 15 là đầu vào điều khiển từ vi điều khiển cho động cơ thứ hai. Chúng được kết nối với các chân A2 và A3 của Arduino.
Khi robot được bật, cả hai động cơ của robot sẽ chạy và robot di chuyển về phía trước. Trong thời gian này, cảm biến siêu âm liên tục tính toán khoảng cách giữa robot và chướng ngại vật ở phía trước nó. Nếu khoảng cách giữa robot và chướng ngại vật nhỏ hơn 30cm, robot sẽ ngừng di chuyển và xoay cảm biến bằng cách sử dụng động cơ servo để đọc ở các góc độ khác nhau. Có thể quyết định chính xác lượt quay bằng cách kiểm tra góc cảm biến cho phép đọc tối đa. Đó sẽ là con đường ít trở ngại hơn. Động cơ Servo có một đường tín hiệu, được kết nối với pin thứ 9 của arduino. Vòng quay của servo được thực hiện bằng cách tạo ra tín hiệu pwm trên đường tín hiệu của nó.
Một mô-đun Bluetooth được gọi là HC05 cũng được sử dụng trong dự án này (tùy chọn). Nó được kết nối với các chân RX và TX của Arduino. Nó được sử dụng ở đây để điều khiển robot với điện thoại Android của bạn. Chúng tôi đã phát triển ứng dụng Android đơn giản cho việc này. Tệp .apk của ứng dụng được đính kèm với bài viết này. Bạn chỉ cần tải xuống và cài đặt nó trên điện thoại của mình. Bằng cách sử dụng ứng dụng, bạn có thể chuyển robot sang chế độ tự động hoặc thủ công chỉ bằng một cú nhấp chuột. Và cũng cho thấy tình trạng của robot khi nó ở chế độ tự động.
Chương trình/Mã
#include
#include
Servo myservo;
#define TRIGGER_PIN 11
#define ECHO_PIN 10
#define MAX_DISTANCE 1000
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
#define motor_aPin1 A0
#define motor_aPin2 A1
#define motor_bPin1 A2
#define motor_bPin2 A3
#define motor_aEnable 5
#define motor_bEnable 6
#define OB_range 30
int i=0, pos = 0,current_distance=0;
int range0=0, range30=0, range60=0, range85=0,range90=0,range95=0, range120=0, range150=0, range180=0 ;
unsigned long previous_millis = 0;
char serialData;
void setup()
{
Serial.begin(9600);
myservo.attach(9);
pinMode(motor_aPin1,OUTPUT);
pinMode(motor_aPin2,OUTPUT);
pinMode(motor_bPin1,OUTPUT);
pinMode(motor_bPin2,OUTPUT);
pinMode(motor_aEnable,OUTPUT);
pinMode(motor_bEnable,OUTPUT);
analogWrite(motor_aEnable,200);
analogWrite(motor_bEnable,200);
}
void brake()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,LOW);
}
void forward()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,HIGH);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,HIGH);
}
void forward_left()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,HIGH);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,LOW);
}
void forward_right()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,HIGH);
}
void backward()
{
digitalWrite(motor_aPin1,HIGH);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,HIGH);
digitalWrite(motor_bPin2,LOW);
}
void backward_right()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,HIGH);
}
void backward_left()
{
digitalWrite(motor_aPin1,HIGH);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,LOW);
}
void left()
{
digitalWrite(motor_aPin1,LOW);
digitalWrite(motor_aPin2,HIGH);
digitalWrite(motor_bPin1,HIGH);
digitalWrite(motor_bPin2,LOW);
}
void right()
{
digitalWrite(motor_aPin1,HIGH);
digitalWrite(motor_aPin2,LOW);
digitalWrite(motor_bPin1,LOW);
digitalWrite(motor_bPin2,HIGH);
}
int range(int pos)
{
myservo.write(pos);
delay(300);
current_distance = sonar.ping_cm();
if(current_distance==0)
current_distance=100;
if(current_distance > 0 && current_distance < 15){
Serial.print("B");
if(pos==90){
backward();delay(500);}
if(pos < 90){
backward_right();delay(500);}
if(pos > 90){
backward_left();delay(500);}
return current_distance;
}}
void loop()
{
Automatic: brake();
delay(300);
while(1){
if(Serial.available()>0)
serialData=Serial.read();
if(serialData=='M')
goto Manual;
above: range90=0;
range90=range(90);
delay(10);
while(range90 >= OB_range ){
if(millis()-previous_millis>2000){
previous_millis=millis();
range(180);
delay(50);
range(0);
delay(50);}
range90=range(90);
analogWrite(motor_aEnable,150);
analogWrite(motor_bEnable,150);
forward(); Serial.print("F");
if(Serial.available()>0)
serialData=Serial.read();
if(serialData=='M')
goto Manual;
}
brake();
if(range90 { analogWrite(motor_aEnable,100); analogWrite(motor_bEnable,100); brake(); range60=0; range60=range(60); delay(200); range120=0; range120=range(120); delay(200); if(Serial.available()>0) serialData=Serial.read(); if(serialData=='M') goto Manual; if(range60 >OB_range || range120 >OB_range ) { if(range60 >= range120){ forward_right();Serial.print("R"); delay(50);goto above;} else if(range60 < range120){ forward_left();Serial.print("L"); delay(50);goto above;} } if(range60 { above1: range30=0; range30=range(30); delay(200); range150=0; range150=range(150); delay(200); if(Serial.available()>0) serialData=Serial.read(); if(serialData=='M') goto Manual; if(range30 >OB_range || range150 >OB_range ) { if(range30 >= range150){ right();Serial.print("R"); delay(100);goto above;} else if(range30 < range150){ left();Serial.print("L"); delay(100);goto above;} } if(range30 { range0=0; range0=range(0); delay(200); range180=0; range180=range(180); delay(200); if(Serial.available()>0) serialData=Serial.read(); if(serialData=='M') goto Manual; if(range0 >OB_range || range180 >OB_range ) { if(range0 >= range180){ backward_right();Serial.print("R"); delay(200);goto above;} else if(range0 < range180){ backward_left();Serial.print("L"); delay(200);goto above;} } if(range0 { backward();Serial.print("B"); delay(200); goto above1; } } } } } Manual: brake(); delay(300); while(1){ if(Serial.available()>0) serialData=Serial.read(); if(serialData=='A') goto Automatic; if(serialData=='F') forward(); if(serialData=='B') backward(); if(serialData=='S') brake(); if(serialData=='L') left(); if(serialData=='R') right(); } } Lúc đầu, chương trình sẽ liên tục kiểm tra việc đọc cảm biến siêu âm khi servo ở 90 độ. Một thư viện được gọi là "NewPing.h" được sử dụng ở đây để đọc cảm biến. Bằng cách gọi chức năng sẵn có là "sonar.ping_cm()" chúng ta sẽ nhận được khoảng cách giữa cảm biến và chướng ngại vật tính bằng centimet. Một thư viện nữa được gọi là "Servo.h" được sử dụng trong chương trình này để kiểm soát servo. Chức năng được sử dụng là "myservo.write(angle)". Vị trí của servo sẽ ở 90 độ lúc đầu. Nếu đọc từ cảm biến ở vị trí 90 độ nhỏ hơn 30cm, robot sẽ ngừng di chuyển về phía trước. Sau đó, phải mất các bài đọc ở vị trí 60 và 120 độ bằng cách nghiêng servo. Những bài đọc này sau đó được so sánh và sẽ quay sang một bên nơi đọc lớn hơn. Nếu cả hai chỉ số này cũng dưới 30cm, thì servo sẽ chuyển sang vị trí 30 và 150 độ. Và sẽ quay sang một bên cho phép đọc tối đa. Một lần nữa nếu các bài đọc vẫn còn dưới 30cm, nó sẽ kiểm tra các bài đọc ở 0 và 180 độ. Nếu tất cả các bài đọc nhỏ hơn 30 cm, robot sẽ di chuyển lùi và kiểm tra lại việc đọc ở các vị trí 0 và 180 độ. Quá trình này sẽ tiếp tục cho đến khi phải mất một lượt và nhảy đến khi bắt đầu chương trình. Sau đó, nó sẽ kiểm tra việc đọc ở 90 độ và quá trình này sẽ lặp lại một lần nữa. Chương trình sẽ liên tục kiểm tra tính khả dụng của dữ liệu nối tiếp từ mô-đun Bluetooth. Nếu nhận được ký tự 'M', robot sẽ chuyển sang chế độ thủ công. Chuyển động hơn nữa của robot sẽ theo các ký tự nhận được qua Bluetooth. Nếu nhận được ký tự 'A', robot sẽ lại chuyển về chế độ tự động.
Hotline: 0979 466 469