Giới thiệu
Chào các bạn, trong bài này mình sẽ hướng dẫn các bạn lắp Khung xe Robot Chasiss 4WD Car R1 và test các chức năng cơ bản (chạy tiến, lùi , trái, phải) với Arduino, từ đó khi kết hợp với các loại cảm biến (siêu âm, dò line,…) chiếc xe có thể thực hiện nhiều chức năng hơn trong các bài kế tiếp:
- [4WD Car R1] Hướng dẫn lắp khung xe robot sử dụng Arduino, xe dò line
- [4WD Car R1] Hướng dẫn lắp khung xe robot sử dụng Arduino, xe tránh vật cản
- [4WD Car R1] Hướng dẫn lắp khung xe robot sử dụng Arduino, xe điều khiển qua bluetooth
Các linh kiện sử dụng trong bài
- 1x Khung Xe Robot Chasiss 4WD Car R1.
- 1x Mạch Điều Khiển Động Cơ L298 DC Motor Driver.
- 1x Mạch Vietduino Uno USB-B.
- 1x Domino DC Đực và chuẩn bị thêm khoảng 1 mét dây điện.
Dung lượng pin tùy chọn (dung lượng càng lớn sẽ cho thời gian xe hoạt động càng lâu).
Các dụng cụ cần chuẩn bị
Hướng dẫn lắp ráp
[Video lắp ráp] … lưu ý quan trọng phải lắp đặt theo đúng trình tự
_ đầu tiên là lắp các thiết bị lên mặt bộ khung, gồm bo Uno, driver L298, breakboard, hộp pin
_ tiếp là phần hàn dây điện vào motor, sau đó lắp motor vào bộ khung
_ chia motor ra 4 loại, FR (front right), FL (front left), BR (back right), BL (back left). sau đó dùng 1 cục pin 18650 cấp nguồn để xác định chiều quay của motor
_ sử dụng pin để xác định chiều quay của motor, đánh dấu (+) (-) lên từng dây làm cho motor quay bánh hướng tới trước.
Sơ đồ kết nối điện:
Sau khi đã xác định được dây (+) (-) của mỗi motor. Các bạn kết nối motor đến driver theo sơ đồ sau.
Motor | Driver L298 | |||
OUT 1 | OUT 2 | OUT 3 | OUT 4 | |
FL | (-) | (+) | ||
FR | (+) | (-) | ||
BL | (-) | (+) | ||
BR | (+) | (-) |
Để lấy nguồn từ pin cấp cho bo Uno. Kết nối dây điện đỏ-đen của hộp pin với “Domino DC đực”. Đầu Domino DC này sẽ gắn vào cổng DC trên bo Uno.
Hộp pin | Bo mạch Uno |
Dây điện đỏ | Vin hoặc chân DC (+) |
Dây điện đen | GND hoặc chân DC (-) |
Và cũng để lấy nguồn từ pin cấp cho driver L298. Bạn dùng thêm cặp dây điện (cắt một đoạn nhỏ tầm ~10cm), kết nối giữa “Domino DC đực” và cổng nguồn của driver.
Hộp pin | Driver L298 |
Dây điện đỏ | +12V |
Dây điện đen | GND |
Dùng 4 dây bus (đực-cái) kết nối phần tín hiệu điều khiển giữa bo UNO và driver L298.
Bo mạch Uno | Driver L298 |
IN1 | D4 |
IN2 | D5 (~) |
IN3 | D6 (~) |
IN4 | D7 |
Code Arduino:
/** * Code này có chức năng kiểm tra tổng thể bộ khung xe "MakerlabVN 4WD Robot Car Kit Uno" * * Lưu ý các bạn cần chọn đúng Baudrate là 115200 trên Serial Monitor. * Màn hình sẽ hiển thị bộ tập lệnh để bạn có thể kiểm tra riêng lẽ từng thành phần trên khung xe. * Bạn phải "viết in" cho toàn bộ lệnh. * * Ví dụ, để hiển thị lại danh sách các lệnh. * Bạn sẽ nhập "SHOW CMD" trên Serial Monitor. */ /* ------------------------------------------------------------------------- */ /* LIBRARY */ /* ------------------------------------------------------------------------- */ #include "Makerlabvn_SimpleMotor.h" #include "NewPing.h" #include "Servo.h" #include "SoftwareSerial.h" /* ------------------------------------------------------------------------- */ /* DEFINE */ /* ------------------------------------------------------------------------- */ /** * Phần cấp nguồn cho Driver * +12V - ... có thể cấp nguồn trong khoảng 9V~6V * GND - GND * * Dùng Jumper kết nối (mặc định) * ENA - 5V * ENB - 5V * * L298 : Arduino * IN1 : D4 * IN2 : D5 (~) * IN3 : D6 (~) * IN4 : D7 */ #define PIN_IN1 4 //! D4 #define PIN_IN2 5 //! D5 (~) #define PIN_IN3 6 //! D6 (~) #define PIN_IN4 7 //! D7 /** * Pin kết nối Thanh dò line TCRT5000 * * TCRT5000 : Arduino * GND - GND * 5V - 5V * OUT1 - A1 (Digital) * OUT2 - A2 (Digital) * OUT3 - A3 (Digital) * * Trái ------------ Phải * | | * | OUT3 | OUT2 | OUT1 | * * Khoảng cách phát hiện Line ĐEN (~1cm) * Có Line - HIGH - Bit 1 * Ko Line - LOW - Bit 0 */ #define PIN_OUT1 A1 //! A1 #define PIN_OUT2 A2 //! A2 #define PIN_OUT3 A3 //! A3 /** * Pin kết nối cảm biến Siêu âm HY-SRF05 * * HY-SRF05 : Arduino * VCC - 5V * TRIG - D9 * ECHO - D10 * OUT - none * GND - GND */ #define PIN_TRIG 9 //! D9 #define PIN_ECHO 10 //! D10 /** * Pin kết nối động cơ RC Servo * * Servo : Arduino * SIG - D8 * VCC - 5V * GND - GND */ #define PIN_SERVO 8 //! D8 /** * Pin kết nối Module Bluetooth (JDY-33) * * JDY33 : Arduino * STATE - ... none * RXD - D3 (TX Software Serial) * TXD - D2 (RX Software Serial) * GND - GND * VCC - 5V * PWRC - ... none */ #define PIN_TX_BLE 2 //! D2 #define PIN_RX_BLE 3 //! D3 /* ------------------------------------------------------------------------- */ /* VARIABLE */ /* ------------------------------------------------------------------------- */ // Lưu các kí tự ở dạng chuỗi String inputData = ""; // Các cờ nhiệm vụ bool checkLine = false; bool checkUltraSonic = false; Makerlabvn_SimpleMotor demoMotor(PIN_IN1, PIN_IN2, PIN_IN3, PIN_IN4); NewPing sonar(PIN_TRIG, PIN_ECHO, 300); Servo demoServo; SoftwareSerial mySerial(PIN_TX_BLE, PIN_RX_BLE); // RX (Soft), TX (Soft) /* ------------------------------------------------------------------------- */ /* RUN ONE TIME */ /* ------------------------------------------------------------------------- */ void setup() { // Khởi tạo Serial Port với Baud Rate 115.200 bps Serial.begin(115200); // Đảm bảo dừng motor khi khởi động demoMotor.car_stop(); // Cấu hình các chân cảm biến dò line pinMode(PIN_OUT1, INPUT); pinMode(PIN_OUT2, INPUT); pinMode(PIN_OUT3, INPUT); // Thiết đặt chân cho Servo demoServo.attach(PIN_SERVO); // Bật kênh truyền Bluetooth mySerial.begin(9600); // Hiển thị tất cả các lệnh kiểm tra all_command(); } /* ------------------------------------------------------------------------- */ /* MAIN */ /* ------------------------------------------------------------------------- */ void loop() { // Nếu người dùng nhập gì đó vào if (Serial.available()) { // Đọc chuỗi data bạn vừa nhập vào từ Serial Port inputData = Serial.readString(); // Cho biết chuỗi bạn vừa nhập Serial.println(""); Serial.println("You Enter: " + inputData); // Xử lý chuỗi nhận được check_command(); // Xóa dữ liệu chuỗi vừa nhập inputData = ""; } // Thực hiện đọc cảm biến (nếu có) run_command(); } /* ------------------------------------------------------------------------- */ /* Hiển thị tất cả các lệnh kiểm tra */ /* ------------------------------------------------------------------------- */ void all_command() { Serial.println("----------------------------------------------------------------------"); Serial.println(""); Serial.println("Nhập các lệnh sau (viết in) để kiểm tra từng thiết bị."); Serial.println("Nhớ bật công tắc nguồn pin."); Serial.println(""); Serial.println("Lệnh kiểm tra Động cơ xe:"); Serial.println("\tMOTOR LEFT GO - Bánh xe bên trái quay tới"); Serial.println("\tMOTOR LEFT BACK - Bánh xe bên trái quay lùi"); Serial.println("\tMOTOR RIGHT GO - Bánh xe bên phải quay tới"); Serial.println("\tMOTOR RIGHT BACK - Bánh xe bên phải quay lùi"); Serial.println(""); Serial.println("Lệnh kiểm tra Cảm biến Dò line:"); Serial.println("\tREAD LINE - Đọc các cảm biến dò line"); Serial.println(""); Serial.println("Lệnh kiểm tra Cảm biến Siêu âm:"); Serial.println("\tREAD DISTANCE - Đọc cảm biến siêu âm"); Serial.println(""); Serial.println("Lệnh kiểm tra RC Servo:"); Serial.println("\tSERVO LEFT - Quay servo tới góc 180º"); Serial.println("\tSERVO CENTER - Quay servo tới góc 90º"); Serial.println("\tSERVO RIGHT - Quay servo tới góc 0º"); Serial.println(""); Serial.println("Lệnh kiểm tra Bluetooth JDY-33:"); Serial.println("Nếu nhận được phản hồi (+OK) tức kết nối Bluetooth thành công!"); Serial.println("\tCHECK BLE - Kiểm tra kết nối JDY-33"); Serial.println(""); Serial.println("Các lệnh khác:"); Serial.println("\tSTOP - Dừng điều khiển tất cả thiết bị."); Serial.println("\tSHOW CMD - Hiển thị lại danh sách các lệnh."); Serial.println(""); Serial.println("----------------------------------------------------------------------"); } /* ------------------------------------------------------------------------- */ /* Xử lý chuỗi nhận được */ /* ------------------------------------------------------------------------- */ void check_command() { checkLine = false; checkUltraSonic = false; /* --------------------- Các lệnh kiểm tra Động cơ xe --------------------- */ if (inputData == "MOTOR LEFT GO") demoMotor.motorA_fw(100); if (inputData == "MOTOR LEFT BACK") demoMotor.motorA_bw(100); if (inputData == "MOTOR RIGHT GO") demoMotor.motorB_fw(100); if (inputData == "MOTOR RIGHT BACK") demoMotor.motorB_bw(100); /* ------------------ Các lệnh kiểm tra Cảm biến Dò line ----------------- */ if (inputData == "READ LINE") checkLine = true; /* ------------------ Các lệnh kiểm tra Cảm biến Siêu âm ----------------- */ if (inputData == "READ DISTANCE") checkUltraSonic = true; /* ---------------------- Các lệnh kiểm tra RC Servo --------------------- */ if (inputData == "SERVO LEFT") demoServo.write(180); if (inputData == "SERVO CENTER") demoServo.write(90); if (inputData == "SERVO RIGHT") demoServo.write(0); /* ------------------ Các lệnh kiểm tra Bluetooth JDY-33 ----------------- */ if (inputData == "CHECK BLE") { mySerial.write("AT"); mySerial.write(13); mySerial.write(10); // Đợi dữ liệu BLE gửi về while (mySerial.available() == 0) { } // Đọc chuỗi data bạn vừa nhập vào từ Serial Port inputData = mySerial.readString(); // Cho biết chuỗi bạn vừa nhập Serial.println(inputData); // Xóa dữ liệu chuỗi vừa nhập inputData = ""; } /* ---------------------------- Các lệnh khác ---------------------------- */ if (inputData == "STOP") demoMotor.car_stop(); if (inputData == "SHOW CMD") all_command(); } /* ------------------------------------------------------------------------- */ /* Thực hiện đọc cảm biến (nếu có) */ /* ------------------------------------------------------------------------- */ void run_command() { if (checkLine) { Serial.println("Left | Center | Right"); Serial.print(digitalRead(PIN_OUT3)); Serial.print(" "); Serial.print(digitalRead(PIN_OUT2)); Serial.print(" "); Serial.print(digitalRead(PIN_OUT1)); Serial.println(""); delay(500); } else if (checkUltraSonic) { Serial.print(sonar.ping_cm()); Serial.println(" cm"); delay(500); } }
Kiểm tra hoạt động:
Sau khi nạp đoạn code trên xong. Bạn mở Serial Monitor, chọn “Baudrate 115200bps” và “No Line Ending”. Nhập lệnh:
- MOTOR LEFT GO : điều khiển bánh xe bên trái quay tới.
- MOTOR LEFT BACK : điều khiển bánh xe bên trái quay lùi.
- MOTOR RIGHT GO : điều khiển bánh xe bên phải quay tới.
- MOTOR RIGHT BACK : điều khiển bánh xe bên phải quay lùi.
Để dừng motor, bạn nhập lệnh STOP.
[Video hoạt động]