Xe tự hành tránh vật cản

Xe tự động tránh đồ cảnTrong bài xích hướng dẫn này, chúng ta cùng tìm hiểu cách thức điều khiển hễ cơ thông qua module tinh chỉnh và điều khiển động cơ L298, bí quyết đọc khoảng cách từ cảm ứng siêu âm SRF04, cách điều khiển và tinh chỉnh động cơ RC servo từ đó xây dựng mô hình xe tránh vật cản 1-1 giản.

Bạn đang xem: Xe tự hành tránh vật cản


*

*

*

*

*

Module tinh chỉnh động cơ L298 là một module bao gồm 2 mạch ước H tích phù hợp trong IC L298, nhờ kia module này có thể điều khiển được 2 hộp động cơ riêng biệt.Chân A Enable, B Enable là 2 chân điều khiển vận tốc 2 hộp động cơ riêng biệt.Input: Là 4 chân tinh chỉnh và điều khiển chiều con quay của 2 động cơ.Bộ mối cung cấp 12V-GND-5V: Tùy ở trong loại bộ động cơ mà ta chọn 12V giỏi 5V.Output A, đầu ra B: Là 2 đầu ra kết nối với 2 động cơ.
Cảm vươn lên là SRF04 vận động dựa trên hình thức phát đi một xung cùng tính thời gian từ cơ hội phát xung đến lúc dìm về được xung đó. Từ đó tính khoảng chừng cách bằng cách với thời gian vừa hiểu được nhân với vận tốc sóng vô cùng âm.
Động cơ RC servo là loại bộ động cơ nhỏ, rất có thể khiển đúng chuẩn góc quay bằng phương thức điều rộng lớn xung PWM (chân có dấu ~). Mặc dù nhiên, nó chỉ hoàn toàn có thể quay được góc trường đoản cú 0-180 độ.
Ở đây ta bắt buộc chú ý, module L298 có thể điều khiển được vận tốc động cơ trải qua 2 chân A Enable cùng B Enable. Vì chưng đó, ta cần liên kết 2 chân này cùng với chân PWM của UnoX (chân gồm dấu ~)

Bảng liên kết (Ở đây kết nối UnoX với 2 module L298):

Module L298Board UnoX
Chân A EnableChân 6 (11)
Chân IN1Chân 8 (A0)
Chân IN2Chân 7 (13)
Chân IN3Chân 4 (12)
Chân IN4Chân 2 (9)
Chân B EnableChân 5 (10)

Từ những bảng liên kết trên họ có được mô hình kết nối tổng thể như hình bên. Sau khoản thời gian kết nối hoàn tất, ta đưa tất cả các module và board UnoX lên size xe Robot.

Xem thêm: Ngành Thiết Kế Thời Trang Là Gì ? Yêu Cầu Của Ngành Thiết Kế Thời Trang


Bài toán đặt ra:

Xe robot luôn luôn luôn dịch rời thẳng.Servo thực hiện quét các góc tự 0 - 180 độ.Cảm thay đổi siêu âm đọc biểu thị liên tục.Khi ngẫu nhiên góc nào của servo mà cảm ứng đọc giá trị nhỏ tuổi hơn 20cm thì UnoX sẽ cách xử trí giá trị gọi và giới thiệu phương án buổi tối ưu nhất để tránh việc va đụng vào vật dụng cản trong quy trình di chuyển.

Sử dụng thư viện:

Điều khiển hễ cơ: điều khiển IO với PWM.Đọc dữ liệu từ SRF04: tinh chỉnh và điều khiển IO và đọc thời gian.Điều khiển RC servo: dùng thư viện Servo.h
//library control RC servo #include //define sạc of L298 left #define enaPinL 6 #define in1PinL 8 #define in2PinL 7 #define in3PinL 4 #define in4PinL 2 #define enbPinL 5 //define sạc of L298 right #define enaPinR 11 #define in1PinR A0 #define in2PinR 13 #define in3PinR 12 #define in4PinR 9 #define enbPinR 10 // define sạc of SRF04 #define trigPin A5 #define echoPin A4 //define pin sạc of RC servo #define servoPin 3 //name of RC servo Servo MyServo; void setup() //setup sạc pin of 2 L298 module mode output pinMode(enaPinL, OUTPUT); pinMode(in1PinL, OUTPUT); pinMode(in2PinL, OUTPUT); pinMode(in3PinL, OUTPUT); pinMode(in4PinL, OUTPUT); pinMode(enbPinL, OUTPUT); pinMode(enaPinR, OUTPUT); pinMode(in1PinR, OUTPUT); pinMode(in2PinR, OUTPUT); pinMode(in3PinR, OUTPUT); pinMode(in4PinR, OUTPUT); pinMode(enbPinR, OUTPUT); //setup pin sạc of srf04 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //setup pin of RC servo MyServo.attach(servoPin); //setup angle of RC servos MyServo.write(90); //control single motor with speed and direction void controlMotor(int motor, int spd, bool dir); //car go straight ahead void Go(int spd); //car go back void Back(int spd); //car turn left void Left(int spd); //car turn right void Right(int spd); //car stop void Stop(); //set distance from srf04 float getDistance(); void loop() //scan barrier from 0 lớn 180 degree //if barrier in right -> turn left //if barrier in left -> turn right //if barrier in left, right, front -> turn back for (int i = 30; i 180; i+= 30) MyServo.write(i); delay(100); float distance = getDistance(); if (distance 20.0) float dis90; float dis45; float dis135; Stop(); MyServo.write(45); delay(300); dis45 = getDistance(); MyServo.write(90); delay(300); dis90 = getDistance(); MyServo.write(135); delay(300); dis135 = getDistance(); MyServo.write(90); if (i 90) if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis90 dis135) Left(255); delay((90 - i) * 500 / 90 + 250); else Left(255); delay((90 - i) * 500 / 90); else if (i = 90) if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis45 dis135) Left(255); delay(250); else Right(255); delay(250); else if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis90 dis45) Right(255); delay((i - 90) * 500 / 90 + 250); else Right(255); delay((i - 90) * 500 /90 + 250); break; else Go(255); for (int i = 180; i >= 30; i-= 30) MyServo.write(i); delay(100); float distance = getDistance(); if (distance 20.0) float dis90; float dis45; float dis135; Stop(); MyServo.write(45); delay(300); dis45 = getDistance(); MyServo.write(90); delay(300); dis90 = getDistance(); MyServo.write(135); delay(300); dis135 = getDistance(); MyServo.write(90); if (i 90) if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis90 dis135) Left(255); delay((90 - i) * 500 / 90 + 250); else Left(255); delay((90 - i) * 500 / 90); else if (i = 90) if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis45 dis135) Left(255); delay(250); else Right(255); delay(250); else if (dis45 20.0 && dis90 20.0 && dis135 20.0) Right(255); delay(1000); else if (dis90 dis45) Right(255); delay((i - 90) * 500 / 90 + 250); else Right(255); delay((i - 90) * 500 /90 + 250); break; else Go(255); void controlMotor(int motor, int spd, bool dir) switch (motor) case 1: // motor left front analogWrite(enaPinR, spd); if (dir == 0) digitalWrite(in1PinR, HIGH); digitalWrite(in2PinR, LOW); else digitalWrite(in1PinR, LOW); digitalWrite(in2PinR, HIGH); break; case 2: // motor left back analogWrite(enbPinL, spd); if (dir == 0) digitalWrite(in3PinL, HIGH); digitalWrite(in4PinL, LOW); else digitalWrite(in3PinL, LOW); digitalWrite(in4PinL, HIGH); break; case 3: // motor left front analogWrite(enbPinR, spd); if (dir == 0) digitalWrite(in3PinR, HIGH); digitalWrite(in4PinR, LOW); else digitalWrite(in3PinR, LOW); digitalWrite(in4PinR, HIGH); break; case 4: // motor left back analogWrite(enaPinL, spd); if (dir == 0) digitalWrite(in1PinL, HIGH); digitalWrite(in2PinL, LOW); else digitalWrite(in1PinL, LOW); digitalWrite(in2PinL, HIGH); break; void Go(int spd) controlMotor(1, spd, 1); controlMotor(2, spd, 1); controlMotor(3, spd, 1); controlMotor(4, spd, 1); void Back(int spd) controlMotor(1, spd, 0); controlMotor(2, spd, 0); controlMotor(3, spd, 0); controlMotor(4, spd, 0); void Left(int spd) controlMotor(1, spd, 0); controlMotor(2, spd, 0); controlMotor(3, spd, 1); controlMotor(4, spd, 1); void Right(int spd) controlMotor(1, spd, 1); controlMotor(2, spd, 1); controlMotor(3, spd, 0); controlMotor(4, spd, 0); void Stop() controlMotor(1, 0, 0); controlMotor(2, 0, 0); controlMotor(3, 0, 0); controlMotor(4, 0, 0); float getDistance() float duration, distanceCm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distanceCm = duration / 29.1 / 2; return distanceCm;