Simple Social Distance Detector

Avatar davisde | March 13, 2021 225 Views 2 Likes 5 On 1 Rating

2 Rate it


Introduction

Find out how far away something is using SOUND?!?! Recently, I've been playing around a lot with the Raspberry Pi Pico, and I thought it'd be cool to create a full project from start to finish and show each step. The project? Well, the current pandemic begs for a Social Distance Bot that alerts you when someone is within 2 meters (6 feet). How does it alert you? In the most annoying way possible…a piezo buzzer. I've tried to document everything so you can make one of these yourself.

Chapter 1: What you will need

Chapter 2: How Ultrasonic Sensors Work

How Ultrasonic Sensors Work

An Ultrasonic Sensor can be controlled to emit a high pitched sound that is undetectable by humans. If an object is in front of the sensor, the sound waves will bounce off of it and return to the sensor. If a return sound is detected, the Ultransonic Sensor knows that something is in front of it.

Ultrasonic Sensor HC-SR04 and Arduino - Complete Guide

But how do we measure distance from using sound waves? We start by using this formula that can derive distance from time and speed.

DISTANCE = SPEED x TIME

The SPEED in this equation is the speed of sound, which is 343 meters per second. Since the Ultrasonic Sensor primarily deals in microseconds and centimeters, converting the speed of time makes it 0.0343 centimeters per microsecond.

The TIME is going to be the time it takes for the sensor to emit a sound and receive a response. This will be determined programmatically.

One last thing to note is that we are basing the distance off of the echo received from the emitted sound. This means the distance of the object would be half of the time it takes for the echo to be received. So we'll have to divide the whole equation by two.

DISTANCE = (0.0343 x echo_time) / 2


Steps


Chapter 3: Wiring

Wiring

First we need to wire up all the components to the Pi Pico. You can download the Fritzing diagram, or just use the diagram image to the left. Here's how it will look:

HC-SR04
VCC > Pin 40
GND > GND
Trig > GP3
Echo > GP2

SSD1306
VCC > Pin 36
GND > GND
SDA > GP0
SCL > GP1

Buzzer
GND > GND
Power > GP13

Chapter 4: Code

Code

I'm using the Thonny python editor.

# IMPORT NECESSARY DEPENDENCIES
# THE SSD1306 DEPENDENCY IS AN EXTERNAL DEPENDENCY
from machine import Pin, I2C, Timer, PWM
from ssd1306 import SSD1306_I2C
import utime


# INITIALIZE DISPLAY
i2c = I2C(0,sda=Pin(0),scl=Pin(1),freq=40000)
oled = SSD1306_I2C(128,64,i2c)

# INITIALIZE HC-SR04 SENSOR
trigger = Pin(3, Pin.OUT)
echo = Pin(2, Pin.IN)

# INITITALIZE BUZZER #
buzzer = PWM(Pin(13))
# set audio frequency
buzzer.freq(500)
# set audio volume from 0 to 1000
buzzer.duty_u16(1000)

# INITIALIZE VARIABLES #
target_distance = 2 #meters

# CREATE A FUNCTION TO CHECK FOR DISTANCE #
def sensor():
    # turn off trigger, and wait for 2 microseconds
    trigger.low()
    utime.sleep_us(2)
    # turn on trigger, and wait for 5 microseconds
    trigger.high()
    utime.sleep_us(5)
    # turn off trigger
    trigger.low()
    # count time it takes to receive an echo
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
    timepassed = signalon - signaloff
    #convert the time to measurements
    #measurement in cm
    #distance = (timepassed * 0.0343) / 2
    #measurement in m
    distance = (timepassed * 0.000343) / 2
    #measurement in feet
      #distance = (timepassed * 1125) / 2
    return distance

# ADD MAIN LOOP TO 'TRY' STATEMENT IN CASE OF ERRORS #
try:
    # CREATE MAIN LOOP #
    while True:
        # WIPE DISPLAY SCREEN #
        oled.fill(0)
        # GET RESULT FROM SENSOR #
        result = sensor()
        if result < target_distance:
            buzzer.duty_u16(1000)
            oled.text("TOO CLOSE!",0,20)
        else:
            buzzer.duty_u16(0)
        oled.text("Distance:",0,0)
        oled.text(str(result) + " m",0,10)
        oled.text("",0,20)
        oled.show()
        utime.sleep(1)            
except KeyboardInterrupt:
    pass


Comments

This post currently has no responses.

Leave a Reply