2015-11-01 15:59:21 +01:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
# Python driver for SRF04 and SRO05 Ultrasonic sensors
|
|
|
|
# Modified to use PINS not BCM : Dave Conway-Jones
|
|
|
|
|
|
|
|
#import
|
|
|
|
import RPi.GPIO as GPIO
|
|
|
|
import time
|
|
|
|
import sys
|
|
|
|
import os, select
|
|
|
|
|
|
|
|
# Turn off warnings if you run it a second time...
|
|
|
|
GPIO.setwarnings(False)
|
|
|
|
|
|
|
|
ECHO = 0
|
|
|
|
TRIGGER = 0
|
|
|
|
OLD = 0
|
2017-08-14 10:20:18 +02:00
|
|
|
SLEEP = 0.5
|
2015-11-01 15:59:21 +01:00
|
|
|
|
|
|
|
def Measure():
|
|
|
|
start = 0
|
|
|
|
GPIO.output(TRIGGER, True)
|
|
|
|
time.sleep(0.00001)
|
|
|
|
GPIO.output(TRIGGER, False)
|
2017-05-08 09:57:29 +02:00
|
|
|
|
2017-09-07 22:12:33 +02:00
|
|
|
channel = GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=200)
|
|
|
|
if channel is None:
|
|
|
|
print("Ultrasonic sensor timed out (pre-echo).")
|
|
|
|
GPIO.remove_event_detect(ECHO)
|
|
|
|
restart()
|
|
|
|
# else:
|
|
|
|
# print("Echo start detected")
|
|
|
|
start = time.time()
|
|
|
|
|
|
|
|
GPIO.wait_for_edge(ECHO, GPIO.BOTH, timeout=400)
|
|
|
|
if channel is None:
|
|
|
|
print("Ultrasonic sensor timed out (post-echo).")
|
|
|
|
GPIO.remove_event_detect(ECHO)
|
|
|
|
restart()
|
|
|
|
# else:
|
|
|
|
# print("Echo finish detected")
|
|
|
|
stop = time.time()
|
|
|
|
|
2015-11-01 15:59:21 +01:00
|
|
|
elapsed = stop-start
|
2017-09-07 22:12:33 +02:00
|
|
|
distance = (elapsed * 34300)/2 # Using speed of sound at 20C (68F)
|
2015-11-01 15:59:21 +01:00
|
|
|
|
|
|
|
return distance
|
|
|
|
|
2017-09-07 22:12:33 +02:00
|
|
|
def restart():
|
|
|
|
# print("Restarting...")
|
|
|
|
GPIO.setmode(GPIO.BOARD) # Use GPIO BOARD numbers
|
|
|
|
GPIO.setup(TRIGGER, GPIO.OUT) # Trigger
|
|
|
|
GPIO.output(TRIGGER, False) # Set low
|
|
|
|
GPIO.setup(ECHO, GPIO.OUT) # Echo
|
|
|
|
GPIO.output(ECHO, False)
|
|
|
|
time.sleep(0.1)
|
|
|
|
GPIO.setup(ECHO,GPIO.IN)
|
|
|
|
GPIO.add_event_detect(ECHO, GPIO.BOTH)
|
|
|
|
time.sleep(2.0)
|
2015-11-01 15:59:21 +01:00
|
|
|
|
|
|
|
# Main program loop
|
|
|
|
if len(sys.argv) > 1:
|
|
|
|
pins = sys.argv[1].lower().split(',')
|
2017-08-14 10:20:18 +02:00
|
|
|
if len(pins) != 3:
|
|
|
|
print "Bad parameters supplied"
|
2015-11-01 15:59:21 +01:00
|
|
|
print pins
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
TRIGGER = int(pins[0])
|
|
|
|
ECHO = int(pins[1])
|
2017-08-14 10:20:18 +02:00
|
|
|
SLEEP = float(pins[2])
|
2015-11-01 15:59:21 +01:00
|
|
|
|
2017-09-07 22:12:33 +02:00
|
|
|
restart()
|
2015-11-01 15:59:21 +01:00
|
|
|
|
|
|
|
# Flush stdin so we start clean
|
|
|
|
while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0:
|
|
|
|
os.read(sys.stdin.fileno(), 4096)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
distance = int( Measure() + 0.5 )
|
2017-09-07 22:12:33 +02:00
|
|
|
if distance != OLD and distance > 2 and distance < 400:
|
2015-11-01 15:59:21 +01:00
|
|
|
print(distance)
|
2017-05-08 10:01:45 +02:00
|
|
|
OLD = distance
|
2017-08-14 10:20:18 +02:00
|
|
|
time.sleep(SLEEP)
|
2017-09-07 22:12:33 +02:00
|
|
|
except Exception as e: # try to clean up on exit
|
|
|
|
print(e) # Print error message on exception
|
|
|
|
GPIO.remove_event_detect(ECHO)
|
2015-11-01 15:59:21 +01:00
|
|
|
GPIO.cleanup(TRIGGER)
|
|
|
|
GPIO.cleanup(ECHO)
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
else:
|
|
|
|
print "Bad params"
|
2017-08-14 10:20:18 +02:00
|
|
|
print " sudo nrsrf.py trigger_pin,echo_pin,rate_in_seconds"
|
2015-11-01 15:59:21 +01:00
|
|
|
sys.exit(0)
|