Học Arduino_Dự án 41: Robot xe tăng phát hiện vật cản với một công tắc hành trình mini

No Comments

Project #41: Robot xe tăng phát hiện vật cản với một công tắc hành trình mini

Một công tắc hành trình mini có thể hoạt động như một nút bấm đơn giản đã được chúng ta sử dụng trong chương 4, nhưng công tắc hành trình mini có kích thước lớn hơn và có một thanh kim loại lớn hoạt động như bộ dẫn động (xem trong hình 12-21).

Hình 12-21: Công tắc hành trình mini

Khi sử dụng công tắc hành trình mini, bạn nối một dây với vị trí tiếp xúc dưới cùng và dây khác tới vị trí tiếp xúc có nhãn “NO” (normally open) để đảm bảo dòng điện chỉ đi qua khi thanh kim loại được nhấn. Chúng ta sẽ gắn công tắc hành trình mini trên mặt trước của xe tăng, và khi xe tăng húc vào vật cản, thanh kim loại sẽ bị nhấn, gây ra dòng dòng điện và làm xe tăng lùi lại hoặc thực hiện một hành động khác.

Sơ đồ mạch điện

Phần cứng công tắc hành trình mini được nối dây như một nút nhấn, như trong hình 12-22.

Hình 12-22: Sơ đồ mạch điện công tắc hành trình mini phát hiện vật cản

Sketch

Chúng ta kết nối công tắc hành trình mini tới một chân ngắt (chân số 2). Mặc dù bạn có thể nghĩ chúng ta nên có một hàm được gọi bởi ngắt để làm xe tăng lùi lại, nhưng điều đó là không thể, vì hàm delay() không tiến hành bên trong hàm được gọi bởi hàm ngắt. Chúng ta phải nghĩ một cách khác trong trường hợp này.

Thay vào đó, hàm goForward() sẽ quay động cơ nếu hai điều kiện được đap ứng cho biến crash và Boolean move. Nếu crash là True, các động cơ sẽ quay ngược lại ở tốc độ chậm hơn 2 giây để lùi lại khỏi vị trí vật cản.

Chúng ta sẽ không sử dụng hàm delay() vì gián đoạn., do đó chúng ta tính toán khoảng thời gian các động cơ chạy đọc theo millis() tại thời điểm bắt đầu và so sánh với giá trị của millis() tại thời điểm hiện tại. Khi sự khác biệt lớn hơn hoặc bằng khoảng thời gian yêu cầu, biến move sẽ đặt thành false và động cơ dừng lại.

Nhập và nạp sketch sau:

// Project 41 – Detecting Tank Bot Collisions with a Microswitch

int m1speed=6; // digital pins for speed control

int m2speed=5;

int m1direction=7; // digital pins for direction control

int m2direction=4;

boolean crash=false;

 

void setup()

{

pinMode(m1direction, OUTPUT);

pinMode(m2direction, OUTPUT);

attachInterrupt(0, backOut, RISING);

delay(5000);

}

  • void backOut()

{

crash=true;

}

(2) void backUp()

{

digitalWrite(m1direction,LOW); // reverse

digitalWrite(m2direction,LOW); // reverse

analogWrite(m1speed, 200); // speed

analogWrite(m2speed, 200);

delay(2000);

analogWrite(m1speed, 0); // speed

analogWrite(m2speed, 0);

}

void goForward(int duration, int pwm)

{

long a,b;

boolean move=true;

  •            a=millis();

do

{

if (crash==false)

{

digitalWrite(m1direction,HIGH); // forward

digitalWrite(m2direction,HIGH); // forward

analogWrite(m1speed, pwm); // speed

analogWrite(m2speed, pwm);

}

if (crash==true)

{

backUp();

crash=false;

}

(4) b=millis()-a;

if (b>=duration)

{

move=false;

}

} while (move!=false);

// stop motors

analogWrite(m1speed, 0);

analogWrite(m2speed, 0);

}

void loop()

{

goForward(5000, 255);

delay(2000);

}

 

Sketch này sử dụng một phương pháp tiên tiến của việc di chuyển về phía trước, trong hai biến được sử dụng đó để theo dõi sự chuyển động trong khi xe tăng hoạt động. Biến thứ nhất là biến Boolean crash. Nếu xe tăng đâm vào vật gì đó và kích hoạt công tắc hành trình mini, sau đó hàm ngắt được gọi, cái sẽ chạy hàm backOut() tại (1). Ở đây biến crash được thay đổi từ false thành true. Biến thứ 2 được theo dõi là biến Boolean move. Trong hàm goFoward(), chúng ta sử dụng millis() tại (3) để tính toán có hay không robot xe tăng đã hoàn thành di chuyển theo chu kì thời gian được yêu cầu hay chưa (được đặt bởi thông số duration).

Tại (4), hàm tính toán có hay không thời gian trôi qua nhỏ hươn thười gian yêu cầu, nếu đúng, biến move được đặt thành true. Do đó, robot xe tăng chỉ được phép tiến nếu không có va chạm và không chạy quá thời gian. Nếu va chạm được phát hiện, hàm backUp() tại (2) được gọi, tại điểm xe tăng sẽ lùi chậm trong 2 giây và sau đó trở lại bình thường.

Note Bạn có thể thêm hàm chuyển động khác từ Project 40 để mở rộng hoặc điều chỉnh ví dụ này.

Cảm biến khoảng cách hồng ngoại

Phương pháp tiếp theo của chúng ta để tránh vật cản là sử dụng cảm biến khoảng cách hồng ngoại. Cảm biến này bật tín hiệu ánh sáng hồng ngoại ra khỏi bề mặt phía trước của nó và trả về giá trị điện áp, điện áp có mối quan hệ với khoảng cách giữa cảm biến và mặt phẳng. Các cảm biến hồng ngoại sử dụng rất hữu ích cho việc phát hiện vật cản vì chúng không đắt lắ, nhưng chúng không phải là lý tưởng cho việc đo chính xác khoảng cách. Chúng ta sẽ sử dụng cảm biến tương tự Sharp GP2Y21YK0F cho project này, như hình 12-23.

Hình 12-23: Cảm biến Sharp IR

Đấu dây

Để nối dây cảm biến, nối dây đỏ và dây đen trên cảm biến với 5V và GND tương ứng, với dây trắng nối với một chân analog trên Arduino của bạn. Chúng ta sẽ sử dụng analogRead() để đo dòng điện trả về từ cảm biến. Đồ thị hình 12-24 thể hiện mối quan hệ giữa khoảng cách đo được và điện áp ra.

Hình 12-24: Đồ thị của khoảng cách cảm biến hồng ngoại và điện áp đầu ra

Kiểm tra cảm biến khoảng cách hồng ngoại

Vì mối quan hệ giữa khaongr cách và điên áp ra không dễ để biểu thị với phương trình, chúng ta sẽ phân loại giá trị đọc được thành từng đoạn 5cm. Để chứng minh điều này, chúng ta sẽ sử dụng một ví dụ đơn giản. Nối dây trắng của cảm biến hồng ngoại của bạn tới chân analog số 0, dây đỏ tới 5V, và dây đen tới GND, và sau đó nhập và nạp sketch trong Listing 12-2.

 

// Listing 12-2

float sensor = 0;

int cm = 0;

void setup()

{

Serial.begin(9600);

}

void loop()

{

(1) sensor = analogRead(0);

(2) if (sensor<=90)

{

Serial.println(“Infinite distance!”);

} else if (sensor<100) // 80cm

{

cm = 80;

} else if (sensor<110) // 70 cm

{

cm = 70;

} else if (sensor<118) // 60cm

{

cm = 60;

} else if (sensor<147) // 50cm

{

cm = 50;

} else if (sensor<188) // 40 cm

{

cm = 40;

} else if (sensor<230) // 30cm

{

cm = 30;

} else if (sensor<302) // 25 cm

{

cm = 25;

} else if (sensor<360) // 20cm

{

cm = 20;

} else if (sensor<505) // 15cm

{

cm = 15;

} else if (sensor<510) // 10 cm

{

cm = 10;

} else if (sensor>=510) // too close!

{

Serial.println(“Too close!”);

}

Serial.print(“Distance: “);

Serial.print(cm);

Serial.println(” cm”);

delay(250);

}

 

Sketch đọc giá trị điện áp từ cảm biến IR tại (1) và sau đó sử dụng chỗi các trạng thái tại (2) để chọn khoảng cách xấp xỉ sẽ được trả về. Chúng ta xsc định khoảng cách từ điện áp trả về bởi cảm biến bằng cách sử dụng hai thông số. Thông số thứ nhất là quan hệ điện áp-khoảng cách được thể hiện trong hình 12-24. Sau đó sử dụng hiểu biết (từ project 6) analogRead() trả về một giá trị giữa 0 và 1023 tương ứng với điện áp giữa 0 và quanh 5V, chúng ta có thể tính xấp xỉ khoảng cách được trả về bởi cảm biến.

Sau khi nạp sketch, mở Serial Monitor và thí nghiệm bằng việc di chuyển tay của bạn hoặc một mẩu giấy tại nhiều vị trí khoảng cách khác nhau tới cảm biến. Serial Monitor sẽ trả lại khoảng cách gần đúng, như trong hình 12-25.

Hình 12-25: Kết quả của listing 12-2

Sản phẩm được quan tâm

Nhận bài viết mới

Các bài viết chia sẻ đến cộng đồng rất chât lượng, mang lại rất nhiều kiến thức mới. Đừng bỏ lỡ bất kỳ bài viết nào của chung tối, hãy đăng ký để nhận bài viết mới qua Mail của bạn

Đăng ký để không bỏ lỡ bài viết nào!

Fields marked with an * are required

Danh mục




More from our blog

See all posts
No Comments
 

Leave a Comment