[4WD Car R1] Hướng dẫn lắp khung xe robot sử dụng Arduino, dò line, tránh vật cản, bluetooth

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

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”“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]

Tìm kiếm

Các kênh truyền thông

Dịch vụ

Các chuyên mục

Bài viết liên quan

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments