Cảm biến siêu âm HC-SR04 với Raspberry Pi Pico sử dụng MicroPython

Cảm biến siêu âm HC-SR04 với Raspberry Pi Pico sử dụng MicroPython

Giới thiệu cảm biến siêu âm HC-SR04

Để giao tiếp cảm biến siêu âm HC-SR04 với Raspberry Pi Pico, chúng ta nên biết chức năng của từng chân của cảm biến siêu âm. Bằng cách biết chức năng của chân đầu vào và đầu ra, chúng tôi sẽ có thể xác định chân GPIO nào của Raspberry Pi Pico nên được sử dụng để giao tiếp với HC-SR04.

Sơ đồ chân HC-SR04

Hình dưới đây cho thấy cấu hình pin của cảm biến siêu âm. Nó bao gồm bốn chân cụ thể là; Vcc, Ground, Trigger và Echo pin.

Sơ đồ pinout cảm biến siêu âm HC-SR04

Vcc và Ground được sử dụng để cung cấp năng lượng cho cảm biến. Chúng ta nên cung cấp 5 volt cho chân Vcc và kết nối chân GND với cực nối đất của nguồn điện.

Kích hoạt: Nó là một chân đầu vào. Một chân kích hoạt được sử dụng để khởi động cảm biến siêu âm để bắt đầu đo khoảng cách hoặc phạm vi khoảng cách. Khi người dùng muốn nhận các phép đo khoảng cách từ cảm biến, chúng tôi áp dụng xung 10μs cho chân này.

Tiếng vang: Đây là một chân đầu ra xung. Chân dội lại tạo ra xung dưới dạng đầu ra. Độ rộng của xung hoặc đúng giờ của xung phụ thuộc vào khoảng cách giữa cảm biến siêu âm và chướng ngại vật được đặt trước cảm biến HC-SR04. Trong điều kiện không tải, chân này vẫn ở mức thấp hoạt động.

Thông tin chi tiết về hoạt động của cảm biến siêu âm được cung cấp trong phần tiếp theo.

Cảm biến HC-SR04 hoạt động như thế nào?

Cảm biến siêu âm HC-SR04 đo khoảng cách bằng cách sử dụng sóng âm thanh siêu âm không nghe được tần số 40KHz. Giống như sóng âm thanh, sóng siêu âm truyền qua không khí và nếu có bất kỳ chướng ngại vật nào trước mặt, chúng phản xạ theo góc độ tới của chúng. Hơn nữa, nếu một vật thể được đặt song song với máy phát siêu âm, sóng siêu âm phản xạ chính xác ở góc 180 độ. Do đó, để đo khoảng cách với cảm biến HC-SR05, chúng tôi đặt đối tượng đang được thử nghiệm chính xác ở vị trí song song với cảm biến siêu âm như trong hình bên dưới.

HC-SR04 và vị trí khoảng cách đối tượng

Cảm biến siêu âm HC-SR05 bao gồm hai mô-đun cơ bản như máy phát siêu âm và mô-đun máy thu siêu âm. Mạch máy phát chuyển đổi tín hiệu điện thành một loạt 40KHz gồm 8 xung sóng sonar. Tín hiệu điện đầu vào mạch máy phát là đầu vào xung 10μs đến chân kích hoạt của cảm biến HC-SR04. Như chúng tôi đã đề cập trước đó, chúng tôi áp dụng tín hiệu đầu vào kích hoạt này thông qua Raspberry Pi Pico hoặc bất kỳ bộ vi điều khiển nào. Mặt khác, mạch máy thu siêu âm lắng nghe các sóng siêu âm được tạo ra bởi mạch phát.

Đo thời gian xung tiếng vọng HC-SR04 với Raspberry Pi Pico

Cảm biến siêu âm HC-SR04 hoạt động

  • Để bắt đầu phạm vi với HC-SR04, trước tiên, chúng tôi áp dụng xung 10μs cho chân kích hoạt của cảm biến HC-SR04 từ chân đầu ra kỹ thuật số Raspberry Pi Pico.

  • Ngay khi tín hiệu kích hoạt đầu vào 10μs trở nên hoạt động thấp, mạch máy phát tạo ra một loạt 8 xung sonar siêu âm. Đồng thời, chân Echo cũng thực hiện chuyển đổi từ mức thấp logic sang mức cao logic.

  • Khi chân Echo tăng cao, Chúng tôi bắt đầu đo thời gian bằng chức năng đo thời lượng Raspberry Pi Pico.

  • Những sóng này truyền qua không khí và nếu có bất kỳ vật thể nào được đặt song song với cảm biến, những sóng này sẽ phản xạ trở lại sau khi va chạm với vật thể.

  • Ngay sau khi sóng siêu âm nhận được bởi mạch thu sau khi tấn công với một vật thể, chân tiếng vọng sẽ xuống thấp. Raspberry Pi Pico phát hiện sự chuyển đổi này của tín hiệu đầu ra tiếng vang từ mức cao hoạt động sang mức thấp hoạt động và dừng phép đo.

Nói tóm lại, bằng cách đo đúng thời gian của tín hiệu xung đầu ra Echo, chúng ta có thể đo khoảng cách. Hình dưới đây minh họa tín hiệu đầu ra tiếng vang với tín hiệu kích hoạt đầu vào tôn trọng và 8 xung sonar.

Sơ đồ thời gian HC-SR04

Thời lượng mà tín hiệu đầu ra tiếng vang vẫn cao phụ thuộc vào khoảng cách giữa cảm biến siêu âm và đối tượng mà chúng ta đặt trước cảm biến. Khoảng cách càng cao, thời gian sóng sonar sẽ mất càng cao để quay trở lại mạch thu siêu âm. Bởi vì sóng siêu âm truyền qua không khí với tốc độ âm thanh và tốc độ không đổi.

Cách chuyển đổi khoảng thời gian thành khoảng cách

Trong phần tiếp theo, chúng ta sẽ xem cách đo thời lượng xung bằng Raspberry Pi Pico. Giả sử rằng chúng ta đã đo xung đầu ra đúng giờ (t) bằng Raspberry Pi Pico. Bây giờ câu hỏi là làm thế nào để chuyển đổi thời gian đo được này thành khoảng cách.

Chà, đây là phần rõ ràng nhất của hướng dẫn này. Ở trường trung học, tất cả chúng ta đều nghiên cứu một phương trình khoảng cách thời gian nổi tiếng là S = vt. Chúng ta có thể chuyển đổi thời lượng xung (t) thành khoảng cách (S) bằng phương trình này.

Distance (S) = Speed (v) * t  //distance in meters

Ở đây v là tốc độ của sóng siêu âm trong không khí. Tốc độ của sóng siêu âm trong không khí bằng với tốc độ âm thanh là 340 m / s (mét trên giây).

Phương trình trên sẽ cho đầu ra khoảng cách tính bằng đơn vị mét. Tuy nhiên, nếu bạn muốn khoảng cách tính bằng đơn vị centimet, hãy nhân 340 với 100. Do đó, phương trình trên trở thành:

S = 34000 * t   // distance in cm

Thời gian đưa ra trong công thức trên cũng nên được chia cho hai. Bởi vì sóng siêu âm truyền từ máy phát đến chướng ngại vật và sau đó phản xạ trở lại mạch thu bằng cách di chuyển cùng một khoảng cách. Chúng tôi chỉ muốn tìm khoảng cách giữa HC-SR04 và đối tượng. Do đó, công thức tính khoảng cách trở thành:

S = 17000 * t    // distance in cm

Lưu ý: Bạn không cần phải lo lắng về những tính toán này vì chúng tôi sẽ sử dụng thư viện MicroPython cho cảm biến siêu âm HC-SR04 để thực hiện các phép đo khoảng cách.

Làm thế nào để giao tiếp cảm biến siêu âm HC-SR04 với Raspberry Pi Pico?

Cho đến bây giờ chúng ta đã thấy hoạt động của cảm biến siêu âm và các chi tiết pin. Bây giờ chúng ta biết điều đó để giao tiếp cảm biến HC-SR04 với Raspberry Pi Pico. Chúng tôi cần bốn chân trong đó hai chân là chân cấp nguồn và hai chân là chân đầu ra đầu vào kỹ thuật số. Một chân GPIO của Raspberry Pi Pico sẽ được sử dụng làm chân đầu ra kỹ thuật số để cung cấp tín hiệu kích hoạt cho cảm biến siêu âm. Tương tự, một chân GPIO sẽ được sử dụng làm chân đầu vào kỹ thuật số để thu tín hiệu đầu ra tiếng vang của cảm biến đầu ra.

Raspberry Pi Pico với sơ đồ kết nối HC-SR04

Bây giờ hãy tạo kết nối Raspberry Pi Pico với cảm biến HC-SR04 theo sơ đồ kết nối này.

HC-SR04 ·

Quả mâm xôi Pi Pico

VCC

VSYS (5V)

GND ·

GND ·

Kích hoạt

GP2 ·

Tiếng dội

GP3 ·

Raspberry Pi Pico với HC-SR04

Thư viện MicroPython HC-SR04

Theo mặc định, MicroPython không triển khai cảm biến HC-SR04. Tuy nhiên, MicroPyhon cung cấp API I2C có thể được sử dụng để đọc các giá trị từ cảm biến HC-SR04. May mắn thay, có một thư viện có sẵn được phát triển bởi Adafruit và có thể được tải xuống từ liên kết này. Tải xuống thư viện sau và tải nó lên bảng Raspberry Pi Pico với tên hcsr04.py trong thư mục lib.

import machine, time

from machine import Pin

 

__version__ = '0.2.0'

__author__ = 'Roberto S鐠嬶箯chez'

__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"

 

class HCSR04:

    """

    Driver to use the untrasonic sensor HC-SR04.

    The sensor range is between 2cm and 4m.

    The timeouts received listening to echo pin are converted to OSError('Out of range')

    """

    # echo_timeout_us is based in chip range limit (400cm)

    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):

        """

        trigger_pin: Output pin to send pulses

        echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor

        echo_timeout_us: Timeout in microseconds to listen to echo pin. 

        By default is based in sensor limit range (4m)

        """

        self.echo_timeout_us = echo_timeout_us

        # Init trigger pin (out)

        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)

        self.trigger.value(0)

 

        # Init echo pin (in)

        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)

 

    def _send_pulse_and_wait(self):

        """

        Send the pulse to trigger and listen on echo pin.

        We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.

        """

        self.trigger.value(0) # Stabilize the sensor

        time.sleep_us(5)

        self.trigger.value(1)

        # Send a 10us pulse.

        time.sleep_us(10)

        self.trigger.value(0)

        try:

            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)

            return pulse_time

        except OSError as ex:

            if ex.args[0] == 110: # 110 = ETIMEDOUT

                raise OSError('Out of range')

            raise ex

 

    def distance_mm(self):

        """

        Get the distance in milimeters without floating point operations.

        """

        pulse_time = self._send_pulse_and_wait()

 

        # To calculate the distance we get the pulse_time and divide it by 2 

        # (the pulse walk the distance twice) and by 29.1 becasue

        # the sound speed on air (343.2 m/s), that It's equivalent to

        # 0.34320 mm/us that is 1mm each 2.91us

        # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 

        mm = pulse_time * 100 // 582

        return mm

 

    def distance_cm(self):

        """

        Get the distance in centimeters with floating point operations.

        It returns a float

        """

        pulse_time = self._send_pulse_and_wait()

 

        # To calculate the distance we get the pulse_time and divide it by 2 

        # (the pulse walk the distance twice) and by 29.1 becasue

        # the sound speed on air (343.2 m/s), that It's equivalent to

        # 0.034320 cm/us that is 1cm each 29.1us

        cms = (pulse_time / 2) / 29.1

        return cms

Cảm biến siêu âm MicroPython HC-SR04 Mã Raspberry Pi Pico

Sau khi tải thư viện HC-SR04 lên bảng Raspberry Pi Pico, bây giờ chúng ta có thể sử dụng các chức năng có sẵn trong thư viện HC-SR04 để đọc cảm biến.

HC-SR04 MicroPython Ví dụ

Bây giờ chúng ta hãy xem xét tập lệnh MicroPython cho HC-SR04 để có được các bài đọc từ xa. Sao chép đoạn mã sau vào tệp main.py và tải tệp main.py lên Raspberry Pi Pico.

Tập lệnh MicroPython này đọc khoảng cách từ cảm biến HC-SR04 và in nó trên bảng điều khiển shell MicroPython.

from hcsr04 import HCSR04

from time import sleep

 

sensor = HCSR04(trigger_pin=2, echo_pin=3, echo_timeout_us=10000)

 

while True:

    distance = sensor.distance_cm()

    print('Distance:', distance, 'cm')

    sleep(1)

Mã hoạt động như thế nào?

Nhập thư viện

Đầu tiên, chúng tôi nhập hcsr04 và mô-đun ngủ để chúng tôi có thể truy cập các phương thức của nó thông qua các lớp đã xác định của nó.

from hcsr04 import HCSR04

from time import sleep

Xác định chân Raspberry Pi Pico GPIO cho HC-SR04

Bây giờ, chúng tôi khởi tạo các chân gpio của Raspberry Pi Pico cho cảm biến HC-SR04. Đối số đầu tiên chỉ định chân GPIO cho chân kích hoạt. Điều này được đưa ra dưới dạng GPIO2. Tham số thứ hai chỉ định chân GPIO cho chân dội âm. Điều này được đưa ra dưới dạng GPIO3. Đối số cuối cùng là thời gian di chuyển tối đa của sóng âm thanh.

HC-SR04 tạo một đối tượng của phương thức HCSR04() từ lớp HCSR04 với tên gọi "cảm biến".

sensor = HCSR04(trigger_pin=2, echo_pin=3, echo_timeout_us=10000)

Nhận giá trị cảm biến HC-SR04

Bên trong vòng lặp while, lấy số đọc của cảm biến bằng cách sử dụng một đối tượng "cảm biến" trên quảng cáo distance_cm() lưu giá trị trong biến khoảng cách.

distance = sensor.distance_cm()

Sau đó, in các giá trị khoảng cách trên bảng điều khiển shell MicroPython sau mỗi một giây.

print('Distance:', distance, 'cm')

sleep(1)

Demo

Để kiểm tra tập lệnh MicroPython cho HC-SR04 với Raspberry Pi Pico, hãy tải tệp main.py lên bảng của bạn.

Bạn sẽ thấy giá trị khoảng cách được in trên bảng điều khiển shell sau mỗi một giây như sau:

Raspberry Pi Pico với các bài đọc Bảng điều khiển Shell HC-SR04

MicroPython: Hiển thị giá trị cảm biến HC-SR04 trên Màn hình OLED

Trong phần này, chúng ta sẽ xem cách hiển thị số đọc khoảng cách đo được trên màn hình OLED SSD0 96.1306 bằng MicroPython và Raspberry Pi Pico.

Màn hình OLED SSD1306 Thư viện MicroPython

Đối với màn hình OLED, chúng tôi cũng sẽ cần tải thư viện lên Raspberry Pi Pico.

  • Để làm điều đó thành công, hãy mở Thonny IDE của bạn với Raspberry Pi Pico được cắm vào hệ thống của bạn. Đi tới Công cụ > Quản lý gói. Điều này sẽ mở ra Trình quản lý gói Thonny.

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED MicoPython 1

  • Tìm kiếm "ssd1306" trong thanh tìm kiếm bằng cách nhập tên của nó và nhấp vào nút 'Tìm kiếm trên PyPI.'

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED MicoPython 2

  • Từ các kết quả tìm kiếm sau, hãy nhấp vào kết quả được đánh dấu bên dưới: Micropython-SSD1306

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED MicoPython 3

Cài đặt thư viện này.

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED MicoPython 4

Sau một lúc, thư viện này sẽ được cài đặt thành công. Bây giờ chúng tôi đã sẵn sàng để lập trình Raspberry Pi Pico của mình với màn hình OLED.

Kết nối màn hình OLED SSD1306 với Raspberry Pi Pico và HC-SR04

Chúng tôi sẽ cần các thành phần sau để kết nối Raspberry Pi Pico của chúng tôi với Màn hình OLED và HC-SR04.

  1. Raspberry Pi Pico

  2. HC-SR04 ·

  3. Màn hình OLED SSD1306

  4. Dây kết nối

Màn hình OLED có 4 thiết bị đầu cuối mà chúng tôi sẽ kết nối với Raspberry Pi Pico. Vì màn hình OLED yêu cầu điện áp hoạt động trong phạm vi 3.3-5V, do đó chúng tôi sẽ kết nối thiết bị đầu cuối VCC với 5V, điểm chung với bo mạch và HC-SR04. SCL của màn hình sẽ được kết nối với chân SCL của mô-đun và SDA của màn hình sẽ được kết nối với SDA của mô-đun. Mặt bằng của cả ba thiết bị sẽ được tổ chức chung.

Màn hình OLED SSD1306

Quả mâm xôi Pi Pico

VCC

5V

SDA

GP0 (I2C0 SDA)

SCL

GP1 (I2C0 SCL)

GND ·

GND ·




 

Các kết nối giữa ba thiết bị mà chúng tôi đang sử dụng có thể được nhìn thấy bên dưới.

HC-SR04 ·

Raspberry Pi Pico

VCC

5V

GND ·

GND ·

Kích hoạt

GP2 ·

Tiếng dội

GP3 ·

 

Sơ đồ Raspberry Pi Pico với OLED và HC-SR04

Thực hiện theo sơ đồ dưới đây kết nối chúng cho phù hợp.

Raspberry Pi Pico với HC-SR04 và sơ đồ kết nối OLED

Raspberry Pi Pico với HC-SR04 và oled

Mã MicroPython: Hiển thị khoảng cách HC-SR04 trên màn hình OLED

from machine import Pin, I2C

from hcsr04 import HCSR04

from time import sleep

from ssd1306 import SSD1306_I2C

 

sensor = HCSR04(trigger_pin=2, echo_pin=3, echo_timeout_us=10000)

 

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 

oled = SSD1306_I2C(128, 64, i2c)

 

while True:

  oled.fill(0)

  distance = str(sensor.distance_cm())

 

  oled.text("Distance", 0,15)

  oled.text(distance +" cm", 0,35)

  oled.show()

  sleep(1)

  

Mã hoạt động như thế nào?

Trong phần này, chúng tôi chỉ giải thích phần mã Micropython được sử dụng để hiển thị các giá trị cảm biến HC-SR04 trên OLED. Bởi vì phần còn lại của code giống như chúng ta đã sử dụng trong phần trước để hiển thị các bài đọc khoảng cách trên bảng điều khiển shell.

Chúng tôi sẽ nhập ssd1306 là thư viện màn hình OLED mà chúng tôi đã cài đặt trước đó. Điều này sẽ giúp chúng ta truy cập tất cả các chức năng được xác định bên trong nó. Ngoài ra, chúng tôi sẽ nhập lớp Pin và lớp I2C từ mô-đun máy. Điều này là do chúng tôi phải chỉ định chân cho giao tiếp I2C.

from machine import Pin, I2C

from ssd1306 import SSD1306_I2C

Tiếp theo, chúng tôi sẽ khởi tạo các chân I2C GPIO cho SCL và SDA tương ứng. Chúng tôi đã sử dụng chân I2C0 SCL và I2C0 SDA.

Chúng ta đã tạo ra một phương thức I2C() lấy bốn tham số. Tham số đầu tiên là kênh I2C mà chúng ta đang sử dụng. Tham số thứ hai chỉ định chân I2C GPIO của bo mạch được kết nối với đường SDA. Tham số thứ ba chỉ định chân I2C GPIO của bo mạch được kết nối với dòng SCL. Tham số cuối cùng là kết nối tần số.

Chúng tôi đang đặt SCL trên chân 1 và SDA trên chân 0.

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 

Bây giờ, chúng ta sẽ tạo một đối tượng 'oled' của SSD1306_I2C sử dụng width, height và đối tượng i2c làm tham số.

oled = SSD1306_I2C(128, 64, i2c)

Xóa màn hình OLED với led.fill() thường xuyên.

 oled.fill(0)

Cuối cùng, hiển thị văn bản cùng với khoảng cách đọc trên OLED sau mỗi 1 giây.

 

  distance = str(sensor.distance_cm())

 

  oled.text("Distance", 0,15)

  oled.text(distance +" cm", 0,35)

  oled.show()

  sleep(1)

Cuối cùng, hãy gọi phương thức show() trên phương thức oled để các thay đổi hiển thị trên OLED.

oled.show()

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn