Ultrasonic Sensor HC-SR04

From Sketching with Hardware at LMU Wiki
Revision as of 15:28, 11 June 2024 by 185.38.2.4 (talk)
Jump to navigation Jump to search

Description

The HC-SR04 is an ultrasonic distance sensor that can measure distances from 2cm to 400cm. It sends out an ultrasound signal and detects the echo. By measuring the time you can calculate the distance.

Hc-sr04-1.JPG Ultra1.JPG

more details:

How to connect it electrically

Hc-sr04-e.JPG

Required Module and Files


How to control it in MicroPython

 1 from hcsr04 import HCSR04
 2 from time import sleep
 3 
 4 sensor = HCSR04(trigger_pin=12, echo_pin=14)
 5 sleep(1)
 6 i=0
 7 
 8 while True:
 9   distance = sensor.distance_cm()
10   print(i, ': Distance:', distance, 'cm')
11   i=i+1
12   sleep(0.5)



Related Tutorial Videos


Background

connecting it to the ESP8266 and reading the signal in without a library/module.

Connect Trig to Pin5 and Echo to Pin4 of the ESP8266.

Hc-03.JPG Hc04-03.JPG Hc-sr04-1.JPG


 1 import machine
 2 import utime
 3 
 4 
 5 while True:
 6   trig=machine.Pin(5, machine.Pin.OUT)
 7   trig.off()
 8   utime.sleep_us(2)
 9   trig.on()
10   utime.sleep_us(10)
11   trig.off()
12   echo=machine.Pin(4, machine.Pin.IN)
13   while echo.value() == 0:
14     pass
15   t1 = utime.ticks_us()
16   while echo.value() == 1:
17     pass
18   t2 = utime.ticks_us()
19   cm = (t2 - t1) / 58.0
20   print(cm)
21   utime.sleep(2)

Code for RP2040

 1 import machine, time
 2 from machine import Pin
 3 
 4 __version__ = '0.2.0'
 5 __author__ = 'Roberto Sánchez'
 6 __license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"
 7 
 8 class HCSR04:
 9     """
10     Driver to use the untrasonic sensor HC-SR04.
11     The sensor range is between 2cm and 4m.
12 
13     The timeouts received listening to echo pin are converted to OSError('Out of range')
14 
15     """
16     # echo_timeout_us is based in chip range limit (400cm)
17     def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
18         """
19         trigger_pin: Output pin to send pulses
20         echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
21         echo_timeout_us: Timeout in microseconds to listen to echo pin. 
22         By default is based in sensor limit range (4m)
23         """
24         self.echo_timeout_us = echo_timeout_us
25         # Init trigger pin (out)
26         self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
27         self.trigger.value(0)
28 
29         # Init echo pin (in)
30         self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
31 
32     def _send_pulse_and_wait(self):
33         """
34         Send the pulse to trigger and listen on echo pin.
35         We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
36         """
37         self.trigger.value(0) # Stabilize the sensor
38         time.sleep_us(5)
39         self.trigger.value(1)
40         # Send a 10us pulse.
41         time.sleep_us(10)
42         self.trigger.value(0)
43         try:
44             pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
45             return pulse_time
46         except OSError as ex:
47             if ex.args[0] == 110: # 110 = ETIMEDOUT
48                 raise OSError('Out of range')
49             raise ex
50 
51     def distance_mm(self):
52         """
53         Get the distance in milimeters without floating point operations.
54         """
55         pulse_time = self._send_pulse_and_wait()
56 
57         # To calculate the distance we get the pulse_time and divide it by 2 
58         # (the pulse walk the distance twice) and by 29.1 becasue
59         # the sound speed on air (343.2 m/s), that It's equivalent to
60         # 0.34320 mm/us that is 1mm each 2.91us
61         # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 
62         mm = pulse_time * 100 // 582
63         return mm
64 
65     def distance_cm(self):
66         """
67         Get the distance in centimeters with floating point operations.
68         It returns a float
69         """
70         pulse_time = self._send_pulse_and_wait()
71 
72         # To calculate the distance we get the pulse_time and divide it by 2 
73         # (the pulse walk the distance twice) and by 29.1 becasue
74         # the sound speed on air (343.2 m/s), that It's equivalent to
75         # 0.034320 cm/us that is 1cm each 29.1us
76         cms = (pulse_time / 2) / 29.1
77         return cms
78 
79 
80 
81 
82 from time import sleep
83 sensor = HCSR04(trigger_pin=25, echo_pin=15)
84 sleep(1)
85 i=0
86 
87 
88 while True:
89   distance = sensor.distance_cm()
90   print(i, ': Distance:', distance, 'cm')
91   i=i+1
92   sleep(0.5)