Raspberry Pi Cảm Biến Siêu Âm

Hướng dẫn này sẽ chỉ cho bạn cách sử dụng Raspberry Pi và cảm biến siêu âm để đo khoảng cách đến vật cản hoặc đối tượng. Cụ thể, chúng ta sẽ học:

Phần Cứng Cần Thiết

1×Raspberry Pi 5
1×Cảm Biến Siêu Âm
1×Dây Jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Cảm Biến Siêu Âm

Cảm biến siêu âm HC-SR04 được sử dụng để tính toán khoảng cách đến một vật thể bằng cách sử dụng sóng siêu âm.

Sơ Đồ Chân Cảm Biến Siêu Âm

Cảm biến siêu âm HC-SR04 có bốn chân:

  • Chân VCC: phải được kết nối với VCC (5V)
  • Chân GND: phải được kết nối với GND (0V)
  • Chân TRIG: chân này nhận tín hiệu điều khiển (xung) từ Raspberry Pi
  • Chân ECHO: chân này gửi tín hiệu (xung) đến Raspberry Pi. Raspberry Pi đo độ dài xung để tính toán khoảng cách.
cảm biến siêu âm sơ đồ chân

Cách Hoạt Động

Phần này chứa thông tin nâng cao có thể gây quá tải. Nếu bạn chưa chắc về nội dung, hãy bỏ qua và chuyển sang phần tiếp theo.
  1. Vi điều khiển tạo ra một xung 10 microsecond trên chân TRIG, khiến cảm biến siêu âm tự động phát ra sóng siêu âm.
  2. Khi sóng va chạm vào vật cản, chúng được phản xạ trở lại cảm biến.
  3. Cảm biến siêu âm sau đó phát hiện sóng phản xạ và đo thời gian truyền của nó.
  4. Kết quả là, cảm biến siêu âm tạo ra một xung đến chân ECHO, với thời lượng xung bằng thời gian truyền của sóng siêu âm.
  5. Vi điều khiển đo thời lượng xung ở chân ECHO và tính toán khoảng cách giữa cảm biến và vật cản.

Cách Lấy Khoảng Cách Từ Cảm Biến Siêu Âm

  1. Để tính toán khoảng cách từ cảm biến siêu âm, cần thực hiện hai bước như được nêu trong phần "Cách Hoạt Động" (bước 1 và 6):
  2. Tạo ra một xung 10 microsecond trên chân TRIG.
  3. Đo thời lượng xung ở chân ECHO.
  4. Sử dụng thời lượng xung đo được để tính toán khoảng cách giữa cảm biến và vật cản.

Tính Toán Khoảng Cách

Ta có:

  • Thời gian truyền của sóng siêu âm (µs): travel_time = pulse_duration
  • Tốc độ của sóng siêu âm: speed = SPEED_OF_SOUND = 340 m/s = 0.034 cm/µs

Vậy:

  • Quãng đường truyền của sóng siêu âm (cm): travel_distance = speed × travel_time = 0.034 × pulse_duration
  • Khoảng cách giữa cảm biến và vật cản (cm): distance = travel_distance / 2 = 0.034 × pulse_duration / 2 = 0.017 × pulse_duration

Raspberry Pi - Cảm Biến Siêu Âm

Các chân của Raspberry Pi có thể tạo ra xung 10 microsecond và đo độ dài của xung. Điều này cho phép chúng ta tính toán khoảng cách từ cảm biến siêu âm bằng cách sử dụng hai chân Raspberry Pi. Vậy, chúng ta chỉ cần sử dụng hai chân của Raspberry Pi:

  • Một chân được kết nối với chân TRIG của cảm biến siêu âm để tạo ra xung 10µs.
  • Chân còn lại được kết nối với chân ECHO của cảm biến siêu âm để đo xung từ cảm biến

Sơ Đồ Kết Nối

Raspberry Pi cảm biến siêu âm sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Cách Lập Trình Cho Cảm Biến Siêu Âm

  • Tạo xung 10 microsecond trên chân 9 của Raspberry Pi bằng cách sử dụng các hàm GPIO.output()time.sleep().
  • Ví dụ:
  • Đặt chân 9 ở mức HIGH với digitalWrite() và sau đó delay 10 microseconds với delayMicroseconds().
GPIO.output(TRIG_PIN, GPIO.HIGH) time.sleep(0.00001) GPIO.output(TRIG_PIN, GPIO.LOW)
  • Xác định thời lượng xung (µs) trên chân 8 của Raspberry Pi bằng cách sử dụng hàm pulseIn(). Ví dụ:
while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start
  • Xác định khoảng cách (cm):
distance = pulse_duration * 34300 / 2

Code Raspberry Pi

Các Bước Thực Hiện

  • Đảm bảo bạn đã cài đặt Raspbian hoặc hệ điều hành tương thích Raspberry Pi khác trên Pi của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối với cùng mạng cục bộ với PC của bạn.
  • Đảm bảo Raspberry Pi của bạn được kết nối internet nếu bạn cần cài đặt một số thư viện.
  • Nếu đây là lần đầu tiên bạn sử dụng Raspberry Pi, hãy xem Raspberry Pi - Cài Đặt Phần Mềm
  • Kết nối PC của bạn với Raspberry Pi thông qua SSH sử dụng SSH client tích hợp trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
  • Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, hãy cài đặt bằng lệnh sau:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Tạo file script Python ultrasonic_sensor.py và thêm code sau:
# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/tutorials/raspberry-pi/raspberry-pi-ultrasonic-sensor import RPi.GPIO as GPIO import time # Set the GPIO mode (BCM or BOARD) GPIO.setmode(GPIO.BCM) # Define GPIO pins for the ultrasonic sensor TRIG_PIN = 23 ECHO_PIN = 24 # Set the trigger and echo pins GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) def get_distance(): # Send a short pulse to the trigger pin GPIO.output(TRIG_PIN, GPIO.HIGH) time.sleep(0.00001) GPIO.output(TRIG_PIN, GPIO.LOW) # Measure the duration for the echo pulse while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start # Calculate the distance based on the speed of sound (34300 cm/s) distance = pulse_duration * 34300 / 2 return distance try: while True: distance = get_distance() print(f"Distance: {distance:.2f} cm") time.sleep(1) except KeyboardInterrupt: # If the user presses Ctrl+C, clean up the GPIO configuration GPIO.cleanup()
  • Lưu file và chạy script Python bằng cách thực thi lệnh sau trong terminal:
python3 ultrasonic_sensor.py
  • Đặt tay bạn trước cảm biến siêu âm
  • Kiểm tra khoảng cách giữa cảm biến và bàn tay của bạn hiển thị trên Terminal
PuTTY - Raspberry Pi
distance: 29.4 cm distance: 27.6 cm distance: 26.9 cm distance: 17.4 cm distance: 16.9 cm distance: 14.3 cm distance: 15.6 cm distance: 13.1 cm

Script chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

Giải Thích Code

Hãy xem giải thích từng dòng có trong các comment của mã nguồn!

Cách Lọc Nhiễu Từ Phép Đo Khoảng Cách Của Cảm Biến Siêu Âm

Kết quả đo từ cảm biến siêu âm có thể chứa nhiễu dẫn đến hoạt động không mong muốn trong một số ứng dụng. Để loại bỏ nhiễu này, có thể sử dụng thuật toán sau:

  1. Thực hiện nhiều phép đo và lưu chúng trong một mảng
  2. Sắp xếp mảng theo thứ tự tăng dần
  3. Lọc nhiễu bằng cách:
    • Các mẫu nhỏ nhất được coi là nhiễu và nên bỏ qua
    • Các mẫu lớn nhất được coi là nhiễu và nên bỏ qua
    • Lấy trung bình của các mẫu ở giữa làm giá trị đo

    Code ví dụ sau thực hiện 20 phép đo:

    • Bỏ qua năm mẫu nhỏ nhất, được coi là nhiễu.
    • Bỏ qua năm mẫu lớn nhất, cũng được coi là nhiễu.
    • Lấy trung bình của 10 mẫu ở giữa (từ thứ 5 đến thứ 14).
    # Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/tutorials/raspberry-pi/raspberry-pi-ultrasonic-sensor import RPi.GPIO as GPIO import time TRIG_PIN = 23 # Raspberry Pi GPIO pin connected to TRIG pin of ultrasonic sensor ECHO_PIN = 24 # Raspberry Pi GPIO pin connected to ECHO pin of ultrasonic sensor GPIO.setmode(GPIO.BCM) GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) def get_distance(): filter_array = [] num_samples = 20 # Taking multiple measurements and store in an array for _ in range(num_samples): filter_array.append(ultrasonic_measure()) time.sleep(0.03) # To avoid ultrasonic interference (30 milliseconds delay) # Sorting the array in ascending order filter_array.sort() # Filtering noise # Discard the five smallest and five largest samples filtered_samples = filter_array[5:-5] # Calculate the average of the remaining samples distance = sum(filtered_samples) / len(filtered_samples) return distance def ultrasonic_measure(): GPIO.output(TRIG_PIN, True) time.sleep(0.00001) GPIO.output(TRIG_PIN, False) while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance_cm = 0.017 * pulse_duration return distance_cm try: while True: distance = get_distance() print("Distance: {:.2f} cm".format(distance)) time.sleep(1) # Wait for 1 second before taking the next measurement except KeyboardInterrupt: print("Measurement stopped by the user.") finally: GPIO.cleanup()

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Thử Thách Bản Thân

Sử dụng cảm biến siêu âm để hoàn thành một trong các dự án sau:

  • Xây dựng hệ thống tránh va chạm cho xe điều khiển từ xa.
  • Đo lượng vật liệu trong thùng rác.
  • Giám sát mức độ đầy của thùng rác.
  • Tự động mở và đóng thùng rác. Gợi ý: Tham khảo Raspberry Pi - Servo Motor.

Ứng Dụng Cảm Biến Siêu Âm

  • Tránh Va Chạm
  • Phát Hiện Độ Đầy
  • Đo Mức Độ
  • Phát Hiện Gần