Editing Ultrasonic Sensor HC-SR04

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 81: Line 81:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==  Code for RP2040 (with the library in the main code) ==
 
 
This is the version for the Arduino Nano Connect RP2040 using GPIO25 as trigger_pin and GPIO15 as echo_pin.
 
 
<syntaxhighlight lang="python" line='line'>
 
 
import machine, time
 
from machine import Pin
 
 
#acknowlegement for the library
 
__version__ = '0.2.0'
 
__author__ = 'Roberto Sánchez'
 
__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
 
 
 
# contributed at the UBISS2024 Seminar
 
 
from time import sleep
 
sensor = HCSR04(trigger_pin=25, echo_pin=15)
 
sleep(1)
 
i=0
 
 
 
while True:
 
  distance = sensor.distance_cm()
 
  print(i, ': Distance:', distance, 'cm')
 
  i=i+1
 
  sleep(0.5)
 
 
</syntaxhighlight>
 
 
[[Category:Sensor]]
 
[[Category:Sensor]]

Please note that all contributions to Sketching with Hardware at LMU Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see My wiki:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)