Bài 9: Radar phát hiện xâm nhập - MakerEdu Inventor Kit for Micro:bit

From MakerLab Wiki
Jump to navigation Jump to search

Mô tả dự án

Trong bài này các bạn sẽ sử dụng kết hợp "cảm biến siêu âm" để quét vật thể phía trước và "động cơ Servo" để xoay hướng quét cảm biến, thêm "còi báo" tích hợp sẵn trên mạch Micro:bit nữa là ta có ngay một bộ Radar rồi.

... hình thumnail

Các bước thực hiện

Danh sách thiết bị

Sơ đồ kết nối

MakerEDU Shield Thiết bị
Port P2+P8 [MKE-S01] - Siêu âm
Port P0 Động cơ RC Servo

Chuẩn bị trước dự án

Icon-Attention-White.png Chú ý:
Dự án có sử dụng khối [S01] cho cảm biến Siêu âm, bạn cần cài đặt thêm Extension "MakerEdu_Hardware" vào dự án của mình theo bài hướng dẫn này (nếu chưa có).

Các bước thực hiện

  1. Tạo một dự án mới trong phần mềm MakeCode.
  2. Bạn có thể lập trình kéo thả từng mã khối theo hình dưới trong mục [Blocks] hoặc copy đoạn code dưới và paste vào mục [JavaScript] để tiến hành nhanh hơn.
  3. Nạp chương trình vào Micro:Bit.

Blocks

B9 MicrobitEdu.png

Javascript

// Khai báo các biến
let distance = 0

// Khối "on start" - thực hiện 1 lần khi khởi động
music.setVolume(255)
let angle = 0
let rotate = 1
pins.servoWritePin(AnalogPin.P0, angle)

// Khối "forever" - vòng lặp chính của chương trình
// Thực hiện lại ngay vừa khi kết thúc khối
basic.forever(function () {
    distance = ultraSonic.readDistance(ultraSonic.PingUnit.Centimeters, ultraSonic.PinKit.Port2)
    distance = Math.constrain(distance, 0, 50)
    led.plotBarGraph(
    distance,
    50
    )
    if (distance < 20) {
        music.play(music.createSoundExpression(WaveShape.Sine, 5000, 0, 255, 0, 100, SoundExpressionEffect.None, InterpolationCurve.Linear), music.PlaybackMode.UntilDone)
    } else {
        music.stopAllSounds()
    }
})

// Khối "loop" - vòng lặp phụ
// Thực hiện lại sau mỗi 0.03s, kể từ lúc vừa kết thúc khối
loops.everyInterval(30, function () {
    if (rotate == 1) {
        angle += 1
    } else if (rotate == 0) {
        angle += -1
    }
    if (angle >= 180) {
        rotate = 0
    } else if (angle <= 0) {
        rotate = 1
    }
    pins.servoWritePin(AnalogPin.P0, angle)
})

Giải thích code

Chương trình sẽ hoạt động như sau:

Trong khối [ on start ]:

  1. Đầu tiên cài đặt mức âm lượng còi báo lên cao nhất là 255 bằng khối [ set volume... ].
  2. Đặt giá trị biến "angle"0.
  3. Đặt giá trị biến "rotate"1.
  4. Điều khiển Servo đang kết nối ở chân P0 quay theo giá trị biến "angle".

Trong khối [ forever ]:

Khối được thực hiện lặp lại liên tục, đảm nhận việc đọc cảm biến.

  1. Đọc giá trị khoảng cách (cm) từ cảm biến Siêu âm đang kết nối, để lưu vào biến "distance".
  2. Dùng khối [ constrain... ] để lọc giá trị trong biến "distance" đảm bảo kết quả chỉ nằm trong khoảng "từ 0cm đến 50cm".
  3. Cho hiển thị mức giá trị (cm) trong biến "distance" lên màn hình Led bằng khối [ plot bar graph of... ].
  4. Kiểm tra nếu distance < 20cm, cho bật còi báo. Ngược lại thì tắt còi.

Trong khối [ every "30" ms ]:

Khối được thực hiện lại cách mỗi 0.03 giây, đảm nhận việc điều khiển Servo.

  1. Kiểm tra nếu rotate = 1, nghĩa là Servo đang quay từ góc 0º đến 180º. Biến "angle" tăng thêm 1 giá trị.
  2. Ngược lại nếu rotate = 0, nghĩa là Servo đang quay từ góc 180º đến góc 0º. Biến "angle" giảm đi 1 giá trị.
  3. Tiếp tục kiểm tra nếu angle ≥ 180, biến "rotate" đặt thành 0 để Servo quay về 0º.
  4. Ngược lại nếu angle ≤ 0, biến "rotate" đặt thành 1 để Servo quay về 180º.
  5. Đồng thời Micro:bit điều khiển Servo quay theo giá trị biến "angle".

Kết quả

...

... hình dự án