Trong dự án xBot này, chúng ta sẽ cùng lập trình sao cho robot dò đường kết hợp né vật cản một cách chính xác nhất.
Bạn cần sử dụng bản đồ đi kèm với xBot trong bài hướng dẫn này. Chúng ta sẽ đặt 1 vật cản ở vị trí bất kỳ trên vạch đen và nhiệm vụ của robot là vừa di chuyển theo vạch, vừa né tránh vật cản.
Bạn cũng có thể sử dụng băng keo đen (băng keo tĩnh điện) và giấy trắng để tự làm bản đồ theo ý mình.
Để giải quyết bài toán này, chúng ta cần chia làm nhiều bài toán con và sử dụng khái niệm Hàm đã học để xử lý từng bài toán con.
Trước tiên là bài toán né vật cản. Nếu đang di chuyển mà gặp vật cản, robot cần phải:
Chúng ta tạo hàm bằng cú pháp sau:
def name(): Các câu lệnh
Sau đó, ta chỉ cần gọi câu lệnh name() để thực hiện các cầu lệnh bên trong hàm này.
Lưu ý: đặt tên name không dấu.
Chúng ta cần tạo một hàm riêng cho nhiệm vụ là dừng lại và phát âm thanh cảnh báo.
# Chương trình dừng và phát âm báo def dung_va_phat_am_bao(): robot.stop() for count in range(3): speaker.play(['G3:1'], wait=True) time.sleep(0.5)
Tương tự như trên, ta tạo hàm có tên “ne_vat_can”.
Để đi vòng qua vật cản thì cần rẽ phải => đi thẳng => rẽ trái => đi thẳng => rẽ trái => đi thẳng cho đến khi gặp vạch đen thì rẽ phải.
# Chương trình né vật cản def ne_vat_can(): robot.turn_right(40,0.4) robot.forward(40,0.5) robot.turn_left(40,0.4) robot.forward(40,0.6) robot.turn_left(40,0.4) robot.forward(40,0.6) while (line_array.read(0, 0)) == 0: robot.turn_right(40)
Lưu ý: Bạn cần phải tinh chỉnh thời gian chờ cho phù hợp với tình trạng của robot và kích thước của vật cản. Tốc độ và thời gian trong chương trình mẫu chỉ để tham khảo.
Tương tự như trên, ta tạo hàm có tên “di_theo_line”.
Hàm để robot đi theo vạch đen (robot dò line) sẽ giống ở phần 6-5.
# Chương trình dò line def di_theo_line(): if line_array.read(0) == (1, 1, 1, 1): robot.forward(30) elif line_array.read(0, 0): robot.turn_left(50) elif line_array.read(0, 3): robot.turn_right(50) else: robot.forward(30)
Để gọi các hàm vừa tạo ở trên ra, chúng ta chỉ cần gọi đúng trên hàm hàm mình đã tạo.
Sau khi ghép lại thì chương trình cuối cùng sẽ như sau:
while True: di_theo_line() if ultrasonic.distance_cm(1) < 5: dung_va_phat_am_bao() ne_vat_can()
# Chương trình dò line def di_theo_line(): if line_array.read(0) == (1, 1, 1, 1): robot.forward(30) elif line_array.read(0, 0): robot.turn_left(50) elif line_array.read(0, 3): robot.turn_right(50) else: robot.forward(30) # Chương trình né vật cản def ne_vat_can(): robot.turn_right(40,0.4) robot.forward(40,0.5) robot.turn_left(40,0.4) robot.forward(40,0.6) robot.turn_left(40,0.4) robot.forward(40,0.6) while (line_array.read(0, 0)) == 0: robot.turn_right(40) # Chương trình dừng và phát âm báo def dung_va_phat_am_bao(): robot.stop() for count in range(3): speaker.play(['G3:1'], wait=True) time.sleep(0.5) while True: di_theo_line() if ultrasonic.distance_cm(1) < 5: dung_va_phat_am_bao() ne_vat_can()