| ################################################################################# | ################################################################################# | ||||
| class Ultrasonic(): | class Ultrasonic(): | ||||
| '''This class is responsible for handling i2c requests to an ultrasonic sensor''' | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll ein Datenbyte an den Ultraschallsensor senden um eine Messung zu starten | |||||
| def write(self,value): | |||||
| return 0 | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll den Lichtwert auslesen und zurueckgeben. | |||||
| def get_brightness(self): | |||||
| return 0 | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll die Entfernung auslesen und zurueckgeben. | |||||
| def get_distance(self): | |||||
| return 0 | |||||
| def get_address(self): | |||||
| return self.address | |||||
| '''This class is responsible for handling i2c requests to an ultrasonic sensor''' | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll ein Datenbyte an den Ultraschallsensor senden um eine Messung zu starten | |||||
| def write(self,value): | |||||
| try: | |||||
| bus.write_byte_data(self.address, 0x00, 0x51) | |||||
| except: | |||||
| print "ERROR: Ultrasonic sensor start failed!" | |||||
| return 0 | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll den Lichtwert auslesen und zurueckgeben. | |||||
| def get_brightness(self): | |||||
| try: | |||||
| light_v = bus.read_byte_data(self.address, 0x01) | |||||
| except: | |||||
| print "ERROR: Ultrasonic sensor get brightness failed!" | |||||
| return light_v | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll die Entfernung auslesen und zurueckgeben. | |||||
| def get_distance(self): | |||||
| try: | |||||
| range_High_Byte = bus.read_byte_data(self.address, 0x02) | |||||
| range_Low_Byte = bus.read_byte_data(self.address, 0x03) | |||||
| dist = (range_High_Byte << 8) + range_Low_Byte | |||||
| except: | |||||
| print "ERROR: Ultrasonic sensor get distance failed!" | |||||
| return dist | |||||
| def get_address(self): | |||||
| return self.address | |||||
| class UltrasonicThread(threading.Thread): | class UltrasonicThread(threading.Thread): | ||||
| ''' Thread-class for holding ultrasonic data ''' | |||||
| # distance to obstacle in cm | |||||
| distance = 0 | |||||
| # brightness value | |||||
| brightness = 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Schreiben Sie die Messwerte in die lokalen Variablen | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| continue | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| ''' Thread-class for holding ultrasonic data ''' | |||||
| stop = False | |||||
| # distance to obstacle in cm | |||||
| distance = 0 | |||||
| # brightness value | |||||
| brightness = 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address): | |||||
| try: | |||||
| threading.Thread.__init__(self) | |||||
| time.sleep(0.1) | |||||
| self.ultrasonic = Ultrasonic(address) | |||||
| self.setDaemon(True) | |||||
| self.start() | |||||
| except: | |||||
| print "ERROR: Ultrasonic sensor thread init failed!" | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Schreiben Sie die Messwerte in die lokalen Variablen | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| distance = self.ultrasonic.get_distance() | |||||
| brightness = self.ultrasonic.get_brightness() | |||||
| continue | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| ################################################################################# | ################################################################################# | ||||
| # Compass | # Compass | ||||
| ################################################################################# | ################################################################################# | ||||
| class Compass(object): | class Compass(object): | ||||
| '''This class is responsible for handling i2c requests to a compass sensor''' | |||||
| '''This class is responsible for handling i2c requests to a compass sensor''' | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll den Kompasswert auslesen und zurueckgeben. | |||||
| def get_bearing(self): | |||||
| b = 0 | |||||
| try: | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll den Kompasswert auslesen und zurueckgeben. | |||||
| def get_bearing(self): | |||||
| b = 0 | |||||
| try: | |||||
| bear1 = bus.read_byte_data(address, 2) | bear1 = bus.read_byte_data(address, 2) | ||||
| bear2 = bus.read_byte_data(address, 3) | bear2 = bus.read_byte_data(address, 3) | ||||
| bear = (bear1 << 8) + bear2 | bear = (bear1 << 8) + bear2 | ||||
| b = bear/10.0 | b = bear/10.0 | ||||
| except: | except: | ||||
| print "Bearing konnte nicht ausgelesen werden!" | |||||
| return b | |||||
| print "Bearing konnte nicht ausgelesen werden!" | |||||
| return b | |||||
| class CompassThread(threading.Thread): | class CompassThread(threading.Thread): | ||||
| ''' Thread-class for holding compass data ''' | |||||
| ''' Thread-class for holding compass data ''' | |||||
| # Compass bearing value | |||||
| bearing = 0 | |||||
| # Compass bearing value | |||||
| bearing = 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll den Kompasswert aktuell halten. | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| continue | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll den Kompasswert aktuell halten. | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| continue | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| ################################################################################# | ################################################################################# | ||||
| # Infrared | # Infrared | ||||
| ################################################################################# | ################################################################################# | ||||
| class Infrared(object): | class Infrared(object): | ||||
| '''This class is responsible for handling i2c requests to an infrared sensor''' | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # In dieser Methode soll der gemessene Spannungswert des Infrarotsensors ausgelesen werden. | |||||
| def get_voltage(self): | |||||
| voltage = 0 | |||||
| try: | |||||
| voltage = bus.read_byte(self.address) | |||||
| except: | |||||
| print "Spannung konnte nicht ausgelesen werden!" | |||||
| return voltage | |||||
| # Aufgabe 3 | |||||
| # | |||||
| # Der Spannungswert soll in einen Distanzwert umgerechnet werden. | |||||
| def get_distance(self): | |||||
| # v=(readChannel(0)/1023.0)*3.3 | |||||
| '''This class is responsible for handling i2c requests to an infrared sensor''' | |||||
| def __init__(self,address): | |||||
| self.address = address | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # In dieser Methode soll der gemessene Spannungswert des Infrarotsensors ausgelesen werden. | |||||
| def get_voltage(self): | |||||
| voltage = 0 | |||||
| try: | |||||
| voltage = bus.read_byte(self.address) | |||||
| except: | |||||
| print "Spannung konnte nicht ausgelesen werden!" | |||||
| return voltage | |||||
| # Aufgabe 3 | |||||
| # | |||||
| # Der Spannungswert soll in einen Distanzwert umgerechnet werden. | |||||
| def get_distance(self): | |||||
| # v=(readChannel(0)/1023.0)*3.3 | |||||
| v = self.get_voltage() | v = self.get_voltage() | ||||
| # interpolation von https://tutorials-raspberrypi.de/wp-content/uploads/gp2y0a02yk-600x455.png | # interpolation von https://tutorials-raspberrypi.de/wp-content/uploads/gp2y0a02yk-600x455.png | ||||
| dist = 16.2537 * v**4 - 129.893 * v**3 + 382.268 * v**2 - 512.611 * v + 301.439 | dist = 16.2537 * v**4 - 129.893 * v**3 + 382.268 * v**2 - 512.611 * v + 301.439 | ||||
| return dist | |||||
| return dist | |||||
| class InfraredThread(threading.Thread): | class InfraredThread(threading.Thread): | ||||
| ''' Thread-class for holding Infrared data ''' | |||||
| ''' Thread-class for holding Infrared data ''' | |||||
| # distance to an obstacle in cm | |||||
| distance = 0 | |||||
| # distance to an obstacle in cm | |||||
| distance = 0 | |||||
| # length of parking space in cm | |||||
| parking_space_length = 0 | |||||
| # length of parking space in cm | |||||
| parking_space_length = 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address, encoder=None): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, address, encoder=None): | |||||
| return 0 | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| read_infrared_value() | |||||
| calculate_parking_space_length() | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| read_infrared_value() | |||||
| calculate_parking_space_length() | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll den Infrarotwert aktuell halten | |||||
| def read_infrared_value(self): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll den Infrarotwert aktuell halten | |||||
| def read_infrared_value(self): | |||||
| return 0 | |||||
| # Aufgabe 5 | |||||
| # | |||||
| # Hier soll die Berechnung der Laenge der Parkluecke definiert werden | |||||
| def calculate_parking_space_length(self): | |||||
| return 0 | |||||
| # Aufgabe 5 | |||||
| # | |||||
| # Hier soll die Berechnung der Laenge der Parkluecke definiert werden | |||||
| def calculate_parking_space_length(self): | |||||
| return 0 | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| ################################################################################# | ################################################################################# | ||||
| # Encoder | # Encoder | ||||
| ################################################################################# | ################################################################################# | ||||
| class Encoder(object): | class Encoder(object): | ||||
| ''' This class is responsible for handling encoder data ''' | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Wieviel cm betraegt ein einzelner Encoder-Schritt? | |||||
| STEP_LENGTH = 0 # in cm | |||||
| # number of encoder steps | |||||
| count = 0 | |||||
| def __init__(self, pin): | |||||
| self.pin = pin | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Jeder Flankenwechsel muss zur Berechnung der Entfernung gezaehlt werden. | |||||
| # Definieren Sie alle dazu noetigen Methoden. | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll die gesamte zurueckgelegte Distanz zurueckgeben. | |||||
| def get_travelled_dist(self): | |||||
| return 0 | |||||
| ''' This class is responsible for handling encoder data ''' | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Wieviel cm betraegt ein einzelner Encoder-Schritt? | |||||
| STEP_LENGTH = 0 # in cm !!!ONP: to measure the wheel!!! | |||||
| # number of encoder steps | |||||
| counter = 0 | |||||
| def __init__(self, pin): | |||||
| self.pin = pin | |||||
| GPIO.add_event_detect(encoder_pin, GPIO.BOTH, callback=count, bouncetime=1) | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Jeder Flankenwechsel muss zur Berechnung der Entfernung gezaehlt werden. | |||||
| # Definieren Sie alle dazu noetigen Methoden. | |||||
| def count(channel): | |||||
| global counter | |||||
| counter = counter + 1 | |||||
| print "Number of impulses" + str(counter) | |||||
| # Aufgabe 2 | |||||
| # | |||||
| # Diese Methode soll die gesamte zurueckgelegte Distanz zurueckgeben. | |||||
| def get_travelled_dist(self): | |||||
| global counter | |||||
| global STEP_LENGTH | |||||
| dist = counter * STEP_LENGTH | |||||
| return dist | |||||
| class EncoderThread(threading.Thread): | class EncoderThread(threading.Thread): | ||||
| ''' Thread-class for holding speed and distance data of all encoders''' | |||||
| ''' Thread-class for holding speed and distance data of all encoders''' | |||||
| # current speed. | |||||
| speed = 0 | |||||
| # current speed. | |||||
| speed = 0 | |||||
| # currently traversed distance. | |||||
| distance = 0 | |||||
| # currently traversed distance. | |||||
| distance = 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, encoder): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Hier muss der Thread initialisiert werden. | |||||
| def __init__(self, encoder): | |||||
| try: | |||||
| GPIO.setmode(GPIO.BCM) | |||||
| GPIO.setup(encoder_pin, GPIO.IN) | |||||
| except: | |||||
| print "ERROR: Encoder GPIO init failed!" | |||||
| return 0 | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| get_values() | |||||
| def run(self): | |||||
| while not self.stopped: | |||||
| get_values() | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll die aktuelle Geschwindigkeit sowie die zurueckgelegte Distanz aktuell halten. | |||||
| def get_values(self): | |||||
| return 0 | |||||
| # Aufgabe 4 | |||||
| # | |||||
| # Diese Methode soll die aktuelle Geschwindigkeit sowie die zurueckgelegte Distanz aktuell halten. | |||||
| def get_values(self): | |||||
| return 0 | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| def stop(self): | |||||
| self.stopped = True | |||||
| ################################################################################# | ################################################################################# | ||||
| # Main Thread | # Main Thread | ||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| # The GPIO pin to which the encoder is connected | |||||
| encoder_pin = 23 | |||||
| # The GPIO pin to which the encoder is connected | |||||
| encoder_pin = 23 | |||||
| # Aufgabe 1 | |||||
| # | |||||
| # Tragen Sie die i2c Adressen der Sensoren hier ein | |||||
| # Aufgabe 1 | |||||
| # | |||||
| # Tragen Sie die i2c Adressen der Sensoren hier ein | |||||
| # The i2c addresses of front and rear ultrasound sensors | |||||
| ultrasonic_front_i2c_address = 0x00; | |||||
| ultrasonic_rear_i2c_address = 0x00; | |||||
| # The i2c addresses of front and rear ultrasound sensors | |||||
| ultrasonic_front_i2c_address = 0x70; | |||||
| ultrasonic_rear_i2c_address = 0x71; | |||||
| # The i2c address of the compass sensor | |||||
| compass_i2c_address = 0x00 | |||||
| # The i2c address of the compass sensor | |||||
| compass_i2c_address = 0x60 | |||||
| # The i2c address of the infrared sensor | |||||
| infrared_i2c_address = 0x00 | |||||
| # The i2c address of the infrared sensor | |||||
| infrared_i2c_address = 0x4f | |||||
| # Aufgabe 6 | |||||
| # | |||||
| # Hier sollen saemtlichen Messwerte periodisch auf der Konsole ausgegeben werden. | |||||
| # Aufgabe 6 | |||||
| # | |||||
| # Hier sollen saemtlichen Messwerte periodisch auf der Konsole ausgegeben werden. |