Học Arduino_Dự án 42: Robot xe tăng phát hiện vật cản với cảm biến khoảng cách hồng ngoại.

No Comments

Project #42: Robot xe tăng phát hiện vật cản với cảm biến khoảng cách hồng ngoại.

Bây giờ hãy sử dụng cảm biến hồng ngoại để thay cho công tắc hành trình mini. Chúng ta sẽ sử dụng một phiên bản đã được chỉnh sửa của Project 41. Thay vì sử dụng ngắt, chúng ta sẽ tạo một hàm checkDistance() cái mà thay đổi biến crash thành true nếu khoảng cách đo được bởi cảm biến IR là quanh 20cm hoặc ít hơn. Chúng ta sẽ sử dụng điều này trong goForward() chuyển động tiến do…while loop.

Nối cảm biến IR với xe tăng của bạn, và sau đó nhập vào và nạp sketch sau:

// Project 42 – Detecting Tank Bot Collisions with IR Distance Sensor

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

delay(5000);

}

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 checkDistance()

{

(1) if (analogRead(0)>460)

{

crash=true;

}

}

void goForward(int duration, int pwm)

{

long a,b;

boolean move=true;

a=millis();

do

{

checkDistance();

if (crash==false)

{

digitalWrite(m1direction,HIGH); // forward

digitalWrite(m2direction,HIGH); // forward

analogWrite(m1speed, pwm); // speed

analogWrite(m2speed, pwm);

}

if (crash==true)

{

backUp();

Motors and Movement 251

crash=false;

}

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 hoạt động bằng cách sử dụng phương pháp tương tự đã được sử dụng trong project 41, ngoại trừ phiên bản này lấy các giá trị đo được khoảng cách tại (1) và đặt các biến crash thành true nếu khoảng cách giữa cảm biến IR và một đối tượng nhỏ hơn khoảng 20cm.

Sau khi chạy xe tăng bằng việc sử dụng cảm biến này, bạn sẽ thấy lợi ích của việc sử dụng một cảm biến tránh vật cản không tiếp xúc. Đơn gian để thêm nhiều cảm biến vào xe tăng, như các cảm biến trước và cạnh mỗi góc. Bạn có thể thêm code để kiểm tra từng cảm biến lần lượt để đưa ra kết luận dựa trên giá trị khoảng cách trả về.

Cảm biến khoảng cách siêu âm

Phương pháp cuối cùng để tránh vật cản là sử dụng một cảm biến khoảng cách siêu âm. Cảm biến này phát một sóng âm với tần số cao (không thể nghe thấy bằng tai người) đập vào một mặt và đo khoảng thời gian để sóng quay trở lại tới cảm biến. Chúng ta sẽ sử dụng cảm biến khoảng cách siêu âm Parallax Ping))), như hiển thị trong hình 12-26, cho project này, vì nó không đắt và chính xác tới dưới 1cm.

Hình 12-26: cảm biến khoảng cách Ping)))

Một độ chính xác và độ chia của cảm biến siêu âm có nghĩa là nó có thể đo được khoảng cách từ 2cm đến 300cm. Tuy nhiên, do sóng siêu âm cần phản xạ lại về cảm biến, cảm biến phải được đặt góc nhỏ hơn 45 độ theo hướng di chuyển.

Kết nối với cảm biến siêu âm

Để kết nối với cảm biến, đấu các đầu dây 5V và GND tới các chân tương ứng, và đấu chân SIG (short for signal) tới bất kì chân digital nào của Arduino.

Sử dụng cảm biến siêu âm

Cảm biến siêu âm thực hiện đo chỉ khi được yêu cầu. Để thực hiện phép đo, chúng ta sẽ gửi một tín hiệu HIGH rất ngắn khoảng 5ms tới chân SIG. Sau đó, cảm biến sẽ trả lại một tín hiệu HIG với độ dài chu kì thời gian âm thanh siêu âm lấy để di chuyển từ cảm biến và về đến cảm biến; giá trị này sẽ được chia đôi để xác định khoảng cách thực giữa cảm biến và đối tượng.

Chúng ta cần sử dụng mọt chân digital tương ứng cho đầu ra và đầu vào, và hai hàm:

  • delayMicrosecond(mS) Dừng sketch Arduino trong mili giây (ms)
  • pulseDuration(pin, HIGH) đo chiều dài của xung HIGH trên chân pin và trả lại thời gian bằng mili giây.

Sau khi có khoảng thời gian xung trở về, chúng ta chuyển nó thành cm bằng cách chia nó cho 29.412 (vì tốc độ âm thanh là 340m/s, haowjc 34cm/s).

Kiểm tra cảm biến khoảng cách siêu âm

Để sử dụng một cách đơn giản cảm biến, chúng ta sử dụng hàm getDistance() trong Listing 12-3. Kết nối cảm biến siêu âm của bạn với chân SIG tới chân digital số 3, và sau đó nhập vào và nạp sketch sau:

 

// Listing 12-3

int signal=3;

void setup()

{

pinMode(signal, OUTPUT);

Serial.begin(9600);

}

int getDistance()

Motors and Movement 253

// returns distance from Ping))) sensor in cm

{

int distance;

unsigned long pulseduration=0;

// get the raw measurement data from Ping)))

// set pin as output so we can send a pulse

(1) pinMode(signal, OUTPUT);

// set output to LOW

digitalWrite(signal, LOW);

delayMicroseconds(5);

(2) // send the 5uS pulse out to activate Ping)))

digitalWrite(signal, HIGH);

delayMicroseconds(5);

digitalWrite(signal, LOW);

(3) // change the digital pin to input to read the incoming pulse

pinMode(signal, INPUT);

// measure the length of the incoming pulse

pulseduration=pulseIn(signal, HIGH);

(4) // divide the pulse length in half

pulseduration=pulseduration/2;

(5) // convert to centimeters

distance = int(pulseduration/29);

return distance;

}

void loop()

{

Serial.print(getDistance());

Serial.println(” cm “);

delay(500);

}

 

Khoảng cách trả về bởi hàm int getDistance(). Xuyên suốt từ (1) đến (5), bạn có thể thấy làm thế nào để xung được gửi tới cảm biến và sao đó làm thế nào để thười gian đo thời gian trở lại, câu lệnh được sử dụng để tính toán khoảng cách.

Sau khi nạp sketch, mở Serial Monitor và di chuyển môt đối tượng phía trước và ra xa khỏi cảm biến. Khoảng cách tới đối tượng sẽ được trả về theo cm, như trong hình 12-27.

Hình 12-27: Kết quả từ Listing 12-3

Project #43: Robot xe tăng phát hiện vật cản với cảm biến khoảng cách siêu âm

Bây giờ bạn đã hiều làm thế nào để cảm biến hoạt động, nào hãy cùng sử dụng nó với xe tăng.

Sketch

Chúng ta có thể sử dụng hàm getDistance() từ Listing 12-3 để tạo một bài kiểm tra cho sự va chạm sắp xảy ra. Trong sketch dưới đây, chugns ta kiểm tra khoảng cách dưới 10cm, sẽ cho xe tăng một lý do để quay lại. Nhập và nạp đoạn sketch sau:

// Project 43 – Detecting Tank Bot Collisions with an Ultrasonic Distance

// Sensor

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

int m2speed=5;

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

int m2direction=4;

int signal=3;

boolean crash=false;

void setup()

{

pinMode(m1direction, OUTPUT);

pinMode(m2direction, OUTPUT);

pinMode(signal, OUTPUT);

delay(5000);

Serial.begin(9600);

}

Motors and Movement 255

int getDistance()

// returns distance from Ping))) sensor in cm

{

int distance;

unsigned long pulseduration=0;

// get the raw measurement data from Ping)))

// set pin as output so we can send a pulse

pinMode(signal, OUTPUT);

// set output to LOW

digitalWrite(signal, LOW);

delayMicroseconds(5);

// send the 5uS pulse out to activate Ping)))

digitalWrite(signal, HIGH);

delayMicroseconds(5);

digitalWrite(signal, LOW);

// change the digital pin to input to read the incoming pulse

pinMode(signal, INPUT);

// measure the length of the incoming pulse

pulseduration=pulseIn(signal, HIGH);

// divide the pulse length in half

pulseduration=pulseduration/2;

// convert to centimeters

distance = int(pulseduration/29);

return distance;

}

void backUp()

{

digitalWrite(m1direction,LOW); // go back

digitalWrite(m2direction,LOW);

delay(2000);

digitalWrite(m1direction,HIGH); // go left

digitalWrite(m2direction,LOW);

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;

int dist=0;

boolean move=true;

a=millis();

do

{

dist=getDistance();

Serial.println(dist);

(1) if (dist<10) // if less than 10cm from object

{

crash=true;

}

if (crash==false)

{

digitalWrite(m1direction,HIGH); // forward

digitalWrite(m2direction,HIGH); // forward

analogWrite(m1speed, pwm); // speed

analogWrite(m2speed, pwm);

}

if (crash==true)

{

backUp();

crash=false;

}

b=millis()-a;

if (b>=duration)

{

move=false;

}

} while (move!=false);

// stop motors

analogWrite(m1speed, 0);

analogWrite(m2speed, 0);

}

void loop()

{

goForward(1000, 255);

}

 

Một lần nữa, chúng ta đo khoảng cách tại (1) và sau đó thay đổi biến crash thành true nếu khoảng cách giữa cảm biến siêu âm và đối tượng dưới 10cm. Quan sát xe tăng tránh mọi thứ một cách kì diệu hoặc có những trận chiến thông minh với thú cưng một cách tuyệt vời.

Nhìn về phía trước

Trong chương này bạn đã biết được cách để giới thiệu các dự án dựa trên Arduino của bạn tới thế giới chuyển động. Bằng cách sử dụng các động cơ đơn giản, hoặc các cặp động cơ, với motor shield, bạn có thể tạo các dự án mà có thể tự nó di chuyển và tránh các vật cản. Chúng ta đã sử dụng 3 loại cảm biến khác nhau để chứng minh khoảng của các độ chính xác và giá của các cảm biến, do đó bạn có thể thực hiện các nhiệm vụ dựa trên yêu cầu và ngân sách của dự án của bạn.

Bây giờ, tôi hi vọng bạn đang trải nghiệm và tận hưởng khả năng thiết kế và xây dựng những thứ như vậy. Nhưng đừng dừng lại ở đây. Trong chương tiếp theo, chúng ta sẽ di chuyển ngoài trời và khám phá sức mạnh của định vị vệ tinh.

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