Bạn nghĩ sao về việc có một chiếc xe có thể tự động tránh các vật cản phía trước?
Trong bài viết trước đó, chúng tôi đã hướng dẫn cách tạo ra một chiếc xe điều khiển từ xa bằng Smartphone. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách làm một chiếc xe có khả năng tự động tránh vật cản. Nghe đã thấy thú vị chưa? Hãy cùng bắt đầu ngay nhé.
Chuẩn bị:
Một bộ khung xe robot 3 bánh (giá khoảng 140.000 đồng)
Một cảm biến siêu âm SRF 04 hoặc SRF05 (giá khoảng 50.000 đồng)
Một bo mạch Arduini UNO R3 (giá khoảng 180.000 đồng)
Một module điều khiển động cơ L293 (giá khoảng 119.000 đồng)
Một Servo SG90 (giá khoảng 50.000 đồng)
Khung đỡ cảm biến siêu âm (giá khoảng 10.000 đồng)
Khung đỡ Servo (giá khoảng 10.000 đồng)
Dây nối đực-cái, cái -cái (giá khoảng 14.000 đồng)
Các linh kiện cần chuẩn bị
Bước 1
Hàn dây cho động cơ
Các bạn hàn dây cho động cơ sau đó lắp ráp khung xe lại, việc lắp ráp này khá đơn giản.
Sau khi hoàn thành lắp ráp
Sau khi hoàn thành lắp ráp khung và hàn dây cho động cơ, chúng ta sẽ có kết quả như sau
Bước 2
Lắp servo SG90 vào khung robot
Tiếp theo chúng ta sẽ gắn động cơ servo lên khung xe. Các bạn sử dụng bộ khung và ốc đặc biệt cho servo để cố định lên khung robot. Động cơ servo này có nhiệm vụ xoay cảm biến siêu âm để giúp robot phát hiện vật cản ở mọi hướng.
Lắp giá đỡ cảm biến siêu âm vào servo
Sau khi đã cố định Servo xong, chúng ta gắn khung đỡ cảm biến siêu âm lên servo. Các bạn có thể dùng keo nến để kết nối phần khung đỡ cảm biến siêu âm này với servo.
Bước 3
Vì phải lắp module L293 lên Broad Arduino như thế này nên chúng ta sẽ thiếu chân cắm vào Arduino. Do đó, chúng ta cần phải hàn thêm chân kết nối trên L293
Hàn thêm Jump
Trên module L293 đã được thiết kế sẵn các lỗ chờ, các bạn chỉ cần đặt jump vào và sử dụng mỏ hàn để kết nối.
Bước 4
Dán Broad Arduino lên khung robot
Các bạn gắn Broad Arduino UNO R3 lên khung robot
Sau đó đặt module L293 lên
Sau đó đặt Module L293 lên trên.
Bước 5
Nối động cơ vào cọc M2
Nối động cơ vào cọc M4
Tiếp theo, hãy kết nối dây động cơ vào cọc M2 và M4
Kết nối dây với cảm biến siêu âm SRF05
Sau đó, chúng ta sẽ kết nối dây cho cảm biến siêu âm và Arduino
Sau đó, kết nối dây với module L293
Dây GND nối với GND, VCC nối với 5V, Trig nối với A0, Echo nối với A1
Nối dây của servo vào module L293
Và cuối cùng, hãy kết nối dây cho Servo hoạt động. Bạn cắm dây của servo vào chân Jump có ghi SER1. Trên mạch có ghi các kí hiệu (- và S, S là dây tín hiệu của servo), hãy nhớ cắm đúng, dây tín hiệu của servo thường có màu vàng cam.
Bước 6
Hàn dây vào công tắc
Hãy hàn dây cho công tắc.
Lắp công tắc lên khung
Sau đó, đặt vào khe chờ sẵn trên khung.
Bước 7
Cố định pin lên khung
Dùng keo dán pin lên khung robot và tiến hành nối dây. Bạn có thể sử dụng bộ khung 4 pin tiểu 1.5V được kèm theo khi mua hoặc sử dụng 2 pin cell 18650 để có thể sạc lại pin sau khi hết.
Nối dây nguồn vào Module L293
Bây giờ, nối đầu dây âm của pin (dây màu đen) vào chân GND trên module L293. Nối đầu dây dương còn lại của pin vào một đầu dây của công tắc. Nối đầu dây còn lại của công tắc vào chân M trên Module L293.
Bước 8
Vì Arduino không tích hợp sẵn thư viện NewPing và thư viện AFMotor, vì vậy chúng ta cần phải thêm vào Arduino. Cách thêm thư viện vào Arduino có thể tham khảo trong bài viết 'Đừng chơi Asphalt 8 nữa, hãy tạo ra ô tô thực sự và điều khiển như trong game!'
Tải thư viện NewPing tại đây và thư viện AFMotor tại đây
Sau khi đã thêm thư viện, sao chép đoạn code này vào Arduino trên máy tính của bạn.
#include < AFMortor.h>
#include < Servo.h>
#include < NewPing.h>
#define TRIG_PIN A0
#define ECHO_PIN A1
#define MAX_DISTANCE_POSSIBLE 1000
#define MAX_SPEED 150
#define MOTORS_CALIBRATION_OFFSET 3
#define COLL_DIST 20
#define TURN_DIST COLL_DIST 10
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE);
AF_DCMotor leftMotor(4, MOTOR12_8KHZ);
AF_DCMotor rightMotor(2, MOTOR12_8KHZ);
Servo neckControllerServoMotor;
int pos = 0;
int maxDist = 0;
int maxAngle = 0;
int maxRight = 0;
int maxLeft = 0;
int maxFront = 0;
int course = 0;
int curDist = 0;
String motorSet = '';
int speedSet = 0;
void setup() {
neckControllerServoMotor.attach(10);
neckControllerServoMotor.write(90);
delay(2000);
checkPath();
motorSet = 'FORWARD';
neckControllerServoMotor.write(90);
moveForward();
}
void loop() {
checkForward();
checkPath();
}
void checkPath() {
int curLeft = 0;
int curFront = 0;
int curRight = 0;
int curDist = 0;
neckControllerServoMotor.write(144);
delay(120);
for(pos = 144; pos >= 36; pos-=18)
{
neckControllerServoMotor.write(pos);
delay(90);
checkForward();
curDist = readPing();
if (curDist < COLL_DIST) {
checkCourse();
break;
}
if (curDist < TURN_DIST) {
changePath();
}
if (curDist > curDist) {maxAngle = pos;}
if (pos > 90 && curDist > curLeft) { curLeft = curDist;}
if (pos == 90 && curDist > curFront) {curFront = curDist;}
if (pos < 90 && curDist > curRight) {curRight = curDist;}
}
maxLeft = curLeft;
maxRight = curRight;
maxFront = curFront;
}
void setCourse() {
if (maxAngle < 90) {turnRight();}
if (maxAngle > 90) {turnLeft();}
maxLeft = 0;
maxRight = 0;
maxFront = 0;
}
void checkCourse() {
moveBackward();
delay(500);
moveStop();
setCourse();
}
void changePath() {
if (pos < 90) {lookLeft();}
if (pos > 90) {lookRight();}
}
int readPing() {
delay(70);
unsigned int uS = sonar.ping();
int cm = uS/US_ROUNDTRIP_CM;
return cm;
}
void checkForward() { if (motorSet=='FORWARD') {leftMotor.run(FORWARD); rightMotor.run(FORWARD); } }
void checkBackward() { if (motorSet=='BACKWARD') {leftMotor.run(BACKWARD); rightMotor.run(BACKWARD); } }
void moveStop() {leftMotor.run(RELEASE); rightMotor.run(RELEASE);}
void moveForward() {
motorSet = 'FORWARD';
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet =2)
{
leftMotor.setSpeed(speedSet MOTORS_CALIBRATION_OFFSET);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void moveBackward() {
motorSet = 'BACKWARD';
leftMotor.run(BACKWARD);
rightMotor.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet =2)
{
leftMotor.setSpeed(speedSet MOTORS_CALIBRATION_OFFSET);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motorSet = 'RIGHT';
leftMotor.run(FORWARD);
rightMotor.run(BACKWARD);
delay(400);
motorSet = 'FORWARD';
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
}
void turnLeft() {
motorSet = 'LEFT';
leftMotor.run(BACKWARD);
rightMotor.run(FORWARD);
delay(400);
motorSet = 'FORWARD';
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
}
void lookRight() {rightMotor.run(BACKWARD); delay(400); rightMotor.run(FORWARD);}
void lookLeft() {leftMotor.run(BACKWARD); delay(400); leftMotor.run(FORWARD);}
Ấn vào biểu tượng V để dịch code
Ấn vào biểu tượng mũi tên để nạp code
Chúng ta đã hoàn thành. Đây là kết quả của chúng ta.
Kết quả sau khi hoàn thành lắp ráp
Chúng tôi muốn bày tỏ lòng biết ơn đến cửa hàng Linh Kiện Hà Nội đã hỗ trợ chúng tôi thực hiện bài viết này.
Nếu bạn có bất kỳ thắc mắc nào trong quá trình thực hành, hãy tham gia nhóm Facebook ở đây để đặt câu hỏi và trao đổi ý kiến cùng cộng đồng.