Dự án 12: Xe điều khiển qua Bluetooth - MakerEdu Inventor Kit for Micro:bit

From MakerLab Wiki
Jump to navigation Jump to search

Mức độ: Khó ★★★★★★★★☆

Danh sách thiết bị

Sơ đồ kết nối

MakerEDU Shield Thiết bị
Motor_A Động cơ DC bên phải xe (bánh trước + bánh sau)
Motor_B Động cơ DC bên trái xe (bánh trước + bánh sau)

Mô tả dự án

Trong bài này, bạn sẽ học cách làm một chiếc xe điều khiển từ xa bằng Bluetooth qua điện thoại.

Icon-Attention-White.png Chú ý:
Để sử dụng được tính năng Driver tích hợp trên MakerEDU Shield, bạn cần cài đặt thêm Extension "MakerEdu_Hardware" vào dự án của mình (nếu chưa có) theo bài hướng dẫn này.

Bên cạnh, để Motor hoạt động ổn định, các bạn cần cấp nguồn riêng 5V qua cổng microUSB trên Shield.

Dự án này có tất cả 5 giai đoạn và một giai đoạn kiểm tra.

Giai đoạn kiểm tra bạn phải thực hiện đầu tiên, để đảm bảo đã thực hiện thành công kết nối Bluetooth và kết nối đúng các Động cơ DC tương thích với code.

Tiếp theo trong 5 giai đoạn này:

  • Giai đoạn 1 - Tạo sẵn trước một số "biến" cần dùng và tạo tính năng hiển thị "tốc độ" của xe lên Led Matrix.
  • Giai đoạn 2 - Sử dụng các "biến" để lưu thao tác các nút sử dụng, gồm nút [A] - [B] - [C] - [D] - [1] - [2].
  • Giai đoạn 3 - Tạo các "hàm" chức năng điều khiển xe đi Tới [ ↑ ], Lùi [ ↓ ], Xoay Trái [ ← ], Xoay Phải [ → ], Dừng [ - ].
  • Giai đoạn 4 - Tạo các "hàm" chức năng điều khiển xe đi Tới Trái [ ↖ ], Tới Phải [ ↗ ], Lùi Trái [ ↙ ], Lùi Phải [ ↘ ].
  • Giai đoạn 5 - Thực hiện kết nối giữa các thao tác nút tương ứng từng hàm điều khiển xe.

Các bước thực hiện (Giai đoạn kiểm tra)

Trước tiên, bạn cần kiểm tra kết nối Bluetooth theo bài hướng dẫn này.

Tạo code

  1. Bạn tạo 2 khối on startforever như hình sau.
    → Khối mã này điều khiển kênh Motor A quay chiều "forward" trong 5s, kế tiếp là kênh Motor B cũng trong 5s và cứ lặp lại.
    → Thời điểm đang sử dụng kênh motor nào sẽ hiển thị tên A hoặc B lên Led Matrix.

Blocks

MakeCode Kit 14 11.png

Javascript

l9110.pauseMotor(l9110.Motor.MotorA)
l9110.pauseMotor(l9110.Motor.MotorB)

basic.forever(function () {
  l9110.pauseMotor(l9110.Motor.MotorB)
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Forward, 100)
  basic.pause(5000)
  l9110.pauseMotor(l9110.Motor.MotorA)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Forward, 100)
  basic.pause(5000)
})

Nạp code

  1. Nhấp vào Download để nạp code của bạn sang micro:bit.
  2. Gắn micro:bit lên MakerEdu Shield.
    Lưu ý phải ngắt kết nối micro:bit với máy tính.
  3. Kết nối nguồn riêng 5V qua cổng microUSB trên Shield.
  4. Kết nối 2 cặp Động cơ DC đến port domino Motor_AMotor_B của MakerEdu Shield.
  5. Kiểm tra chiều quay của cặp Motor bên trái và bên phải có giúp xe đi tới không.
    Nếu cặp nào không, bạn "đảo chiều đầu nối dây" motor lại.
Icon-Warning-White.png Chú ý:
Khối code trên giúp các bạn kiểm tra phần kết nối dây các Động cơ đã đúng hết chưa.

Từ phần sau trở đi chính thức bắt đầu vào dự án, bạn nhớ xóa hết khối code hiện tại trước khi bắt đầu.

Các bước thực hiện (Giai đoạn 1)

Tạo code

  1. Tạo biến có tên "btnA", "btnB", "btnC", "btnD", "btn1", "btn2", "speed".
    → Các biến này lưu trạng thái thao tác nút nhấn trên điện thoại.
    → Biến "speed" lưu giá trị tốc độ hiện tại của xe.
  2. Tạo 1 khối on start như hình dưới.
    → Khi mới khởi động micro:bit cài đặt giá trị ban đầu cho các biến.
    → Và cho hiển thị tốc độ đang cài đặt hiện tại.
Icon-Done-White.png Giải thích:
Các khối Driver cho bạn cài đặt tốc độ ở đơn vị (%) từ 0% đến 100%.

Mình chỉ muốn dùng từ mức 20% trở lên, với mỗi lần tăng/giảm 10 đơn vị.

Để hiển thị lên Led Matrix, mình dùng thêm công thức ((speed / 10) - 1), nó sẽ hiển thị tương ứng như sau:

  • 1 = 20%
  • 2 = 30%
  • 3 = 40%
  • 4 = 50%
  • 5 = 60%
  • 6 = 70%
  • 7 = 80%
  • 8 = 90%
  • 9 = 100%

MakeCode Kit 14 01.png

  1. Vào [Devices] thêm khối on gamepad button 4 downon gamepad button 3 down như hình sau.
    → 2 khối này để tăng/giảm tốc độ xe khi bạn nhấn nút 4nút 3.
    → Khối constrain giúp đảm bảo giá trị biểu thức trả về luôn trong khoảng 20 đến 100.

MakeCode Kit 14 02.png

Javascript

let btnA = 0
let btnB = 0
let btnC = 0
let btnD = 0
let btn1 = 0
let btn2 = 0
let speed = 0

devices.onGamepadButton(MesDpadButtonInfo._4Down, function () {
  speed = Math.constrain(speed + 10, 20, 100)
  basic.showNumber(speed / 10 - 1)
})

devices.onGamepadButton(MesDpadButtonInfo._3Down, function () {
  speed = Math.constrain(speed - 10, 20, 100)
  basic.showNumber(speed / 10 - 1)
})

Các bước thực hiện (Giai đoạn 2)

Tạo code

  1. Tạo các khối on gamepad button ? down như hình sau.
    → Mỗi khi một trong các nút [A], [B], [C], [D], [1], [2] được nhấn, micro:bit sẽ đặt các biến tương ứng thành giá trị 1 (nút đang nhấn).

MakeCode Kit 14 03.png

  1. Tạo các khối on gamepad button ? up như hình sau.
    → Sau khi một trong các nút [A], [B], [C], [D], [1], [2] được thả ra, micro:bit sẽ đặt các biến tương ứng thành giá trị 0 (nút đã nhả).

MakeCode Kit 14 04.png

Javascript

devices.onGamepadButton(MesDpadButtonInfo.ADown, function () {
  btnA = 1
})

devices.onGamepadButton(MesDpadButtonInfo.BDown, function () {
  btnB = 1
})

devices.onGamepadButton(MesDpadButtonInfo.CDown, function () {
  btnC = 1
})

devices.onGamepadButton(MesDpadButtonInfo.DDown, function () {
  btnD = 1
})

devices.onGamepadButton(MesDpadButtonInfo._1Down, function () {
  btn1 = 1
})

devices.onGamepadButton(MesDpadButtonInfo._2Down, function () {
  btn2 = 1
})

/* ------------------------------------------------------------------------- */

devices.onGamepadButton(MesDpadButtonInfo.AUp, function () {
  btnA = 0
})

devices.onGamepadButton(MesDpadButtonInfo.BUp, function () {
  btnB = 0
})

devices.onGamepadButton(MesDpadButtonInfo.CUp, function () {
  btnC = 0
})

devices.onGamepadButton(MesDpadButtonInfo.DUp, function () {
  btnD = 0
})

devices.onGamepadButton(MesDpadButtonInfo._1Up, function () {
  btn1 = 0
})

devices.onGamepadButton(MesDpadButtonInfo._2Up, function () {
  btn2 = 0
})

Các bước thực hiện (Giai đoạn 3)

Tạo code

  1. Tạo 2 hàm có tên "go""back".
  2. Trong vùng code, bạn tạo chức năng cho 2 khối function gofunction back như hình dưới.
    → Hàm "go" điều khiển xe đi tới, hàm "back" đi lùi.

MakeCode Kit 14 05.png

  1. Tạo 2 hàm có tên "left""right".
  2. Trong vùng code, bạn tạo chức năng cho 2 khối function leftfunction right như hình dưới.
    → Hàm "left" điều khiển xe xoay trái, hàm "right" xoay phải.

MakeCode Kit 14 06.png

  1. Tạo 1 hàm có tên "stop".
  2. Trong vùng code, bạn tạo chức năng cho khối function stop như hình dưới.
    → Hàm "stop" làm xe dừng lại.

MakeCode Kit 14 09.png

Javascript

function go() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Forward, speed)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Forward, speed)
}

function back() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Backward, speed)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Backward, speed)
}

/* ------------------------------------------------------------------------- */

function left() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Forward, speed)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Backward, speed)
}

function right() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Backward, speed)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Forward, speed)
}

/* ------------------------------------------------------------------------- */

function stop() {
  l9110.pauseMotor(l9110.Motor.MotorA)
  l9110.pauseMotor(l9110.Motor.MotorB)
}

Các bước thực hiện (Giai đoạn 4)

Tạo code

  1. Tạo 2 hàm có tên "goLeft""goRight".
  2. Trong vùng code, bạn tạo chức năng cho 2 khối function goLeftfunction goRight như hình dưới.
    → Hàm "goLeft" điều khiển xe đi tới hướng trái, hàm "goRight" đi tới hướng phải.

MakeCode Kit 14 07.png

  1. Tạo 2 hàm có tên "backLeft""backRight".
  2. Trong vùng code, bạn tạo chức năng cho 2 khối function backLeftfunction backRight như hình dưới.
    → Hàm "backLeft" điều khiển xe đi lùi hướng trái, hàm "backRight" đi lùi hướng phải.

MakeCode Kit 14 08.png

Javascript

function goLeft() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Forward, speed)
  l9110.pauseMotor(l9110.Motor.MotorB)
}

function goRight() {
  l9110.pauseMotor(l9110.Motor.MotorA)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Forward, speed)
}

/* ------------------------------------------------------------------------- */

function backLeft() {
  l9110.controlMotor(l9110.Motor.MotorA, l9110.Rotate.Backward, speed)
  l9110.pauseMotor(l9110.Motor.MotorB)
}

function backRight() {
  l9110.pauseMotor(l9110.Motor.MotorA)
  l9110.controlMotor(l9110.Motor.MotorB, l9110.Rotate.Backward, speed)
}

Các bước thực hiện (Giai đoạn 5)

Tạo code

  1. Tạo 1 khối forever như hình dưới.
    → Khối này liên tục kiểm tra "các biến lưu trạng thái nút" để ra quyết định điều khiển xe tương ứng.
Icon-Done-White.png Giải thích:
Khi một nút được "nhấn", biến của nó mang giá trị 1 và khi "nhả" ra thì quay lại giá trị 0.
  • Nên khi không có nút nào được nhấn, xe "dừng lại".
  • Nhấn nút [A] xe "xoay trái".
  • Nhấn nút [B] xe "xoay phải".
  • Nhấn nút [C] xe "đi lùi", nếu có nhấn đồng thời nút [1] xe đi "lùi hướng trái" hoặc nút [2] xe đi "lùi hướng phải".
  • Nhấn nút [D] xe "đi tới", nếu có nhấn đồng thời nút [1] xe đi "tới hướng trái" hoặc nút [2] xe đi "tới hướng phải".

Blocks

MakeCode Kit 14 10.png

Javascript

basic.forever(function () {
  if (btnA) {
    left()
  } else if (btnB) {
    right()
  } else if (btnC) {
    if (btn1) {
      backLeft()
    } else if (btn2) {
      backRight()
    } else {
      back()
    }
  } else if (btnD) {
    if (btn1) {
      goLeft()
    } else if (btn2) {
      goRight()
    } else {
      go()
    }
  } else {
    stop()
  }
})

Nạp code

  1. Nhấp vào Download để nạp code của bạn sang micro:bit.
  2. Gắn micro:bit lên MakerEdu Shield.
    Lưu ý phải ngắt kết nối micro:bit với máy tính.
  3. Kết nối nguồn riêng 5V qua cổng microUSB trên Shield.
  4. Kết nối 2 cặp Động cơ DC đến port domino Motor_AMotor_B của MakerEdu Shield.
  5. Mở App micro:bit trên điện thoại có hệ điều hành iOS.
    (yêu cầu đã thực hiện nhận diện kết nối qua Bluetooth giữa điện thoại và micro:bit trước đó).
  6. Bấm vào Monitor and Control sẽ xuất hiện giao diện điều khiển như hình dưới.
    (nếu chưa có, bạn vào SetAdd để cài đặt).
  7. Cuối cùng, bấm Start để bắt đầu ghép nối Bluetooth.
    (nếu đã ghép nối thành công, bạn bấm các nút xem code có vận hành xe đúng không).

Kết quả

... hình dự án