12/08/2018, 13:36

Phát hiện và đo khoảng cách tới vật thể với Raspberry Pi và cảm biến HC-SR04

Hẳn các bạn đã biết tới máy tính siêu nhỏ Raspberry Pi với hàng loạt những ứng dụng của nó trong cuộc sống, để tận dụng được sức mạnh của Raspberry Pi ta cần tới những cảm biến để giúp nó cảm nhận được thế giới bên ngoài. Trong bài này mình sẽ giới thiệu và demo cảm biến HC-SR04 sử dụng với ...

Hẳn các bạn đã biết tới máy tính siêu nhỏ Raspberry Pi với hàng loạt những ứng dụng của nó trong cuộc sống, để tận dụng được sức mạnh của Raspberry Pi ta cần tới những cảm biến để giúp nó cảm nhận được thế giới bên ngoài. Trong bài này mình sẽ giới thiệu và demo cảm biến HC-SR04 sử dụng với Raspberry Pi (Mình viết tắt là RP cho dễ nhé)

Giới thiệu HC-SR04

Trên đây là hình ảnh thực thế của HC-SR04, bạn có thể mua ở các cửa hàng linh kiện điển tử với giá tầm 28k (Mình mua ở cửa hàng linhkien69). Cảm biến có 4 đầu giao tiếp lần lượt là VCC, Trig, Echo, GND

Như trên hình mô tả, ta có 2 đầu ngoài cùng để dẫn nguồn điện vào là VCC và GND, đầu Trig sẽ nhận tín hiệu để phát đi sóng siêu âm dùng để phát hiện vật thể, đầu Echo sẽ trả về tín hiệu điện thông báo phát hiện va chạm. Hình dưới mô tả cách thức hoạt động của cảm biển, một ống trụ sẽ mang nhiệm vụ phát sóng và ống trụ còn lại có nhiệm vụ nhận sóng phản hồi.

Với cảm biến này, đầu Echo cũng chỉ trả về cho ta tín hiệu điện chứ không có giá trị cao siêu gì cả, vậy nên để đo khoảng cách của vật thể khi va chạm, ta cần dựa vào thời gian từ lúc phát sóng tới lúc nhận được tín hiệu điện từ Echo để tính toán ra khoảng cách tương đối.

Demo

Thiết bị cần thiết :

  • Raspberry Pi phiên bản nào cũng được.
  • 1 điện trở 1kΩ
  • 1 điện trở 2kΩ
  • HC-SR04
  • Bảng mạch testboard và đống dây cắm (Hoặc bạn có thể nối trực tiếp cũng được nếu không có sẵn =]])

Đây là sơ đồ mạch điện ta sẽ nối (Ảnh lấy từ trang tham khảo)

Tại sao ta cần thêm điện trở? Vấn đề là nguồn điện nuôi sống HC-SR04 là 5V, và tín hiệu điện xuất ra ở đầu Echo cũng là 5V, trong khi các cổng giao tiếp của RP được thiết kế để nhận điện thế 3,3V, việc đưa điện thế lớn hơn có nguy cơ làm hỏng mạch. Vậy tại sao là 1kΩ và 2kΩ? Đây là ảnh sơ đồ điện chi tiết Và đây là bài giải tạo sao ta cần 2 điện trở kia

Vậy đó, giờ ta đã biết tại sao lại cần 2 điện trở 1kΩ và 2kΩ. Dựa vào sơ đồ trên cùng, ta có thể lắp mạch cho chính xác, chi tiết như sau: (Hình ảnh minh họa sẽ lấy ở trên trang web mình tham khảo do mạch điện của mình toe toét, chụp xong nhìn cũng không rõ đầu nào cắm vào đầu nào =]])

  • Nối 4 dây vào cảm biến với thứ tự : Đỏ - VCC, Xanh - Trig, Vàng - Echo, Đen - GND.
  • Ta nối dây VCC tới bảng mạch với màu đỏ nối tới cột dương (+) và dây màu đen từ GND tới cột âm (-)
  • Từ mạch RP, ta nối đầu GPIO 5V (Pin 2) tới cột dương của bảng mạch và GPIO GND (Pin 6) tới cột âm của bảng mạch.
  • Cắm dây Trig từ cảm biến tới 1 lỗ nào đó trên bảng mạch và nối một dây từ hàng đó trên bảng mạch tới RP tại GPIO 23 (Pin 16), khi đó đầu Trig của cảm biến đã được nối trực tiếp tới GPIO 23 của RP.
  • Tiếp tục nối dây Echo tới một lỗ khác hàng với những cái ta đã cắm, và từ đó nối tiếp tới một hàng khác bằng điện trở R1 1kΩ, sau đó từ hàng ta mới nối tiếp đến, gắn con điện trở R2 vào vào nối nó tới cột âm trên bảng mạch. Nói thế chắc cũng khó hiểu, bạn nhìn tạm cái hình sẽ hiểu ngay thôi, để ý từ cái dây màu vàng nhé.
  • Nối dây từ GPIO 24 (Pin 18) tới giữa đường nối tiếp 2 con điện trở kia. Bạn để ý dây vàng mới xuất hiện nhé, là nó đấy.
  • Xong, thành quả là như hình dưới

Vậy là đã xong phần cứng, giờ ta sờ tới phần chương trình, vì code python đọc cũng dễ hiểu nên mình sẽ hạn chế giải thích nhé.

# Import thư viện time và thư viện giao tiếp với GPIO
import time
import RPi.GPIO as GPIO

# Khai báo sử dụng cách đánh dấu PIN theo BCM
# Có 2 kiểu đánh dấu PIN là BCM và BOARD
GPIO.setmode(GPIO.BCM)

# Khởi tạo 2 biến chứa GPIO ta sử dụng
GPIO_TRIGGER = 23
GPIO_ECHO = 24

print "Ultrasonic Measurement"

# Thiết lập GPIO nào để gửi tiến hiệu và nhận tín hiệu
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo

# Khai báo này ám chỉ việc hiện tại không gửi tín hiệu điện
# qua GPIO này, kiểu kiểu ngắt điện ấy
GPIO.output(GPIO_TRIGGER, False)

# Cái này mình cũng không rõ, nhưng họ bảo là để khởi động cảm biến
time.sleep(0.5)

# Kích hoạt cảm biến bằng cách ta nháy cho nó tí điện rồi ngắt đi luôn.
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)

# Đánh dấu thời điểm bắt đầu
start = time.time()
while GPIO.input(GPIO_ECHO)==0:
  start = time.time()
# Bắt thời điểm nhận được tín hiệu từ Echo
while GPIO.input(GPIO_ECHO)==1:
  stop = time.time()

# Thời gian từ lúc gửi tín hiêu
elapsed = stop-start

# Distance pulse travelled in that time is time
# multiplied by the speed of sound (cm/s)
distance = elapsed * 34000

# That was the distance there and back so halve the value
distance = distance / 2

print "Distance : %.1f" % distance

# Reset GPIO settings
GPIO.cleanup()

Xong, giờ ta có thể đặt một vật thể phía trước, hướng 2 đầu ống trú hướng ra và tốt nhất là trong góc 30 để có thể tính toán được khoảng cách tốt hơn, sau đó chạy đoạn script trên để HC-SR04 có thể làm việc và phát tín hiệu lại cho RP. Qua bài viết trên các bạn sẽ phần nào hiểu được cách thức hoạt động của HC-SR04 cũng như cách kết nối đơn giản với RP hay cách lập trình các chân GPIO một cách đơn giản, từ đó hãy xây dựng những mô hình thực thế sử dụng HC-SR04 và RP để có những ứng dụng thực tiễn nhé bạn. Do kiến thức còn hạn hẹp nên bài viết khó tránh khỏi sai sót, mong cách bạn nhiệt tình góp ý để mình hoàn thiện thêm kiến thức cũng như giúp bài viết chính xác và giàu thông tin hơn. Cảm ơn các bạn rất nhiều. Nội dung và hình ảnh bài viết được tham khảo và sử dụng qua bài viết : HC-SR04 Ultrasonic Range Sensor on the Raspberry Pi

0