Tư vấn: 0979.466.469 / 0938.128.290

MENU

Robot sử dụng Arduino và Bluetooth Module (Obstacle Avoidance Robot)

Báo giá đặt hàng nhập
bài viết hướng dẫn cách làm robot sử dụng Arduino và Bluetooth Module (Obstacle Avoidance Robot)

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);}

Quảng cáo đặt hàng nhập

 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.

 

 

Gia công pcb 932*150
Sản phẩm nổi bật
Sale 0%
50000 /Cái
/ Cái

Code: 7006-060 Còn hàng

Lưu xem sau
Sale 0%
145000 /Cái
/ Cái

Code: M-7006-010 Còn hàng

Lưu xem sau
Sale 0%
198000 /Cái
/ Cái

Code: M-7007-003 Còn hàng

Lưu xem sau
Sale 0%
350000 /Cái
/ Cái

Code: 7004-012 Còn hàng

Lưu xem sau
Hỗ trợ liên kết
0979466469
0899909838
0938128290
0899909838
Khiếu nại: 0964238397
0979466469
0868565469
0868565469

Hotline: 0979 466 469

Loading
0359 366 469
Bạn cần linh kiện mẫu ? 7-11 ngày