[Tutor] Thread Object integration with GPIO
Marc Eymard
marc_eymard at hotmail.com
Sun Apr 30 05:14:12 EDT 2017
Hello there,
I have hooked up an ultrasonic sensor to my Raspberry Pi-enabled robot
in order to get continuous distance-to-obstacle reading.
The sensor is properly connected via GPIO and already reads the distance
properly when running a simple script.
However, I need to integrate the sensor reading logic to an existing
script provided by PiBorg called YetiBorg.py
The way I have decided to go about implementing the sensor reading is by
creating a Thread object and update the distance attribute of this very
same object from the run() function. The idea is to encapsulate the
distance reading within the sensor object as much as possible by i.
creating a sensor/thread object and by ii. avoiding global variables.
Below the script I have come up along with the error print.
I believe there are multiple issues, but at least it gives an idea of
what I currently want to achieve and how.
Can a charitable soul advise whether my approach makes sense and whether
I am using the right type of object for the task at hands?
I am looking for guidance and willing try completely different
approach/objects if necessary.
Thanks in advance for sending me into the right direction.
Marc
----Python Shell----
2.7.9
----OS-----
Raspian Pixel on Raspberry Pi Zero
---traceback----
Traceback (most
recent call last):
File
"/home/pi/Desktop/distance sensor class object.py", line
57, in <module>
SensorA = Sensor(interval=1, gpio_trig=23, gpio_echo=24)
File"/home/pi/Desktop/distance sensor class object.py", line
23, in __init__self.start()
RuntimeError:
thread.__init__() not called
------sensor.py-----
import threading
import RPi.GPIO as GPIO
import time
#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
class Sensor(threading.Thread):
"""ultrasonic sensor continous distance reading at given interval in seconds"""
def __init__(self,interval, gpio_trig, gpio_echo):
self.inter = interval
self.trig = gpio_trig
self.echo = gpio_echo
#set GPIO pins direction (IN / OUT)
GPIO.setup(gpio_trig, GPIO.OUT)
GPIO.setup(gpio_echo, GPIO.IN)
self.dist = 0
self.terminated = False
self.start()
def run(self):
while not self.terminated:
# set Trigger to HIGH
GPIO.output(gpio_trig, True)
# set Trigger to LOW after 0.01ms
time.sleep(0.00001)
GPIO.output(gpio_trig, False)
StartTime = time.time()
StopTime = time.time()
# save StartTime
while GPIO.input(gpio_echo) == 0:
StartTime = time.time()
# save time of arrival
while GPIO.input(gpio_echo) == 1:
StopTime = time.time()
# time difference between start and arrival
TimeElapsed = StopTime - StartTime
# multiply by sonic speed (34300 cm/s)
# and divide by 2, because there and back
self.dist = (TimeElapsed * 34300) / 2
time.sleep(self.inter)
def get_dist(self):
return self.dist
#Sensor object "instanciated" with GPIO programmable pins 23 and 24
SensorA = Sensor(interval=1, gpio_trig=23, gpio_echo=24)
try:
while True:
print("Measured Distance = %.1f cm" % SensorA.get_dist())
except KeyboardInterrupt:
GPIO.cleanup()
SensorA.terminated = True
More information about the Tutor
mailing list