Modul in Klasse vererben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
elchico
User
Beiträge: 29
Registriert: Dienstag 10. März 2015, 00:06

Hallo zusammen,

ich stelle mich grade etwas dumm an, glaube ich: Ich möchte ein importiertes Modul in einer selbstgeschriebenen Klasse implementieren. Allerdings funktioniert es nicht so wie ich mir das vorstelle. Dazu habe ich zwei Lösungsvorschläge, die beide andere Fehlermeldungen auswerfen. Mir ist weder beim ersten noch beim zweiten Versuch klar, warum es nicht geht.

Über Anregungen bin ich dankbar =)
LG
Michi

Code, welcher gar nicht funktioniert:

Code: Alles auswählen

from gpiozero import DistanceSensor
import time

class US_sensor(DistanceSensor):
    def __init__(self, pins, name):
        self.pins = pins
        self.name = name
        DistanceSensor.__init__(self,self.pins)
        
# main function
def main():
    sensor = US_sensor([16,26],"sensor")
    while True:
        print('Distance to nearest object is', sensor.distance*100, 'cm')
        time.sleep(0.5)

if __name__ == '__main__':
    main()
Fehlermeldung dazu:

Code: Alles auswählen

Traceback (most recent call last):
  File "Ultrasonic_HC-SR04_Lib.py", line 17, in <module>
    main()
  File "Ultrasonic_HC-SR04_Lib.py", line 11, in main
    sensor = US_sensor([16,26],"sensor")
  File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 124, in __call__
    self = super(GPIOMeta, cls).__call__(*args, **kwargs)
  File "Ultrasonic_HC-SR04_Lib.py", line 8, in __init__
    DistanceSensor.__init__(self,self.pins)
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 856, in __init__
    partial=partial, ignore=frozenset({None}), pin_factory=pin_factory
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 277, in __init__
    pin_factory=pin_factory)
  File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 197, in __init__
    super(EventsMixin, self).__init__(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 98, in __init__
    super(InputDevice, self).__init__(pin, pin_factory=pin_factory)
  File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 520, in __init__
    self.pin_factory.reserve_pins(self, pin)
  File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 100, in reserve_pins
    requester, *(self.pi_info.to_gpio(pin) for pin in pins))
  File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 100, in <genexpr>
    requester, *(self.pi_info.to_gpio(pin) for pin in pins))
  File "/usr/lib/python3/dist-packages/gpiozero/pins/data.py", line 1209, in to_gpio
    spec = spec.upper()
AttributeError: 'list' object has no attribute 'upper'
Code, welcher nichts ausgibt:

Code: Alles auswählen

from gpiozero import DistanceSensor
import time

class US_sensor(DistanceSensor):
    pass
    
# main function
def main():
    sensor = US_sensor(16,26)
    while True:
        print('Distance to nearest object is', sensor.distance*100, 'cm')
        time.sleep(0.5)

if __name__ == '__main__':
    main()
Fehlermeldung, wenn ich mit Strg+C unterbreche:

Code: Alles auswählen

Traceback (most recent call last):
  File "Ultrasonic_HC-SR04_Lib.py", line 18, in <module>
    main()
  File "Ultrasonic_HC-SR04_Lib.py", line 14, in main
    print('Distance to nearest object is', sensor.distance*100, 'cm')
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 927, in distance
    return self.value * self._max_distance
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 937, in value
    return super(DistanceSensor, self).value
  File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 341, in value
    return self._queue.value
  File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 541, in value
    self.full.wait()
  File "/usr/lib/python3.7/threading.py", line 552, in wait
    signaled = self._cond.wait(timeout)
  File "/usr/lib/python3.7/threading.py", line 296, in wait
    waiter.acquire()
KeyboardInterrupt
Sirius3
User
Beiträge: 17752
Registriert: Sonntag 21. Oktober 2012, 17:20

Im ersten Beispiel erwartet gpiozero.DistanceSensor die Pins als zwei Argumente und nicht als Liste.

Beim zweiten Beispiel: Strg+C löst in Python eine Exception aus, die Du siehst. Wenn Du die nicht sehen willst, mußt Du sie abfangen:

Code: Alles auswählen

from gpiozero import DistanceSensor
import time

def main():
    sensor = DistanceSensor(16,26)
    try:
        while True:
            print(f'Distance to nearest object is {sensor.distance*100} cm')
            time.sleep(0.5)
    except KeyboardInterrupt:
        pass

if __name__ == '__main__':
    main()
Was soll eigentlich der Grund für die zusätzliche Klasse sein?
elchico
User
Beiträge: 29
Registriert: Dienstag 10. März 2015, 00:06

@ Sirius3: Vielen Dank für Deine Antwort. Bist bei mir häufig der Erste, das weiß ich zu schätzen!

Grund für die Vererbung ist eigentlich nur Spielerei: Ich habe noch nie vererbt und wollte es einfach mal ausprobieren. Ein sehr einfacher Anwendungsfall könnte jetzt sein, dass man den Sensor von gpiozero um die Funktion "Berechne cm" erweitern möchte (geht gewiss auch im Code, wie gesagt, ist Spielerei um mir Vererbung im allgemeinen anzuschauen).
Zu Beispiel 1: Danke, das stimmt.
Zu Beispiel 2: Ging darum, dass der Bildschirm quasi schwarz blieb, es kam keine Output vom Sensor. Der hat einfach nur auf ein Echo gewartet und es kam keines...

Wie dem auch sei:
Es funktioniert jetzt mit der Vererbung. War zu deppert um bis 1 zu zählen ... ^.^

Jetzt habe ich noch eine "Hardware/Software" Frage, aber ich weiß nicht, ob ich hierfür hier richtig bin bzw. das noch in diesen Thread mit reingehört. Ich probiere es einfach mal, sonst stell ich die Frage nochmal extra:

Unten steht der aktuelle Code. Es kommt auch ein Output, der UNGEFÄHR stimmt. Ungefähr heißt: ca. +/- 2 cm. Wenn ich jetzt etwas näher rutsche, bleibt der Wert häufig konstant. Näher als 10.4 cm darf ich scheinbar nicht kommen, weil dann bleibt er konstant bei diesen 11 - 10 cm. Außerdem soll er angeblich auf 0.3 mm genau sein (siehe Reichelt).

Hast Du bzw. hat jemand noch eine Idee, warum dies so ist?
Specs vom Sensor: https://cdn.sparkfun.com/datasheets/Sen ... HCSR04.pdf
Reichelt:
https://cdn-reichelt.de/documents/daten ... ASHEET.pdf

Code: Alles auswählen

from gpiozero import DistanceSensor
import time

class US_sensor(DistanceSensor):
    def __init__(self, pins, name, maxDis):
        self.pins = pins
        self.name = name
        self.maxDistance = maxDis
        DistanceSensor.__init__(self,echo=self.pins[0],trigger=self.pins[1],max_distance=self.maxDistance)
        
# main function
def main():
    sensor = US_sensor(pins=[16,26],name="sensor",maxDis=4)
    while True:
        print('Distance to nearest object is', sensor.distance*100, 'cm')
        time.sleep(1)

if __name__ == '__main__':
    main()
Output vom Sensor:

Code: Alles auswählen

# Anfangsabstand waren ca. 8 cm, unverändert, trotzdem schwankt der Wert um ca. 1 cm (Messungenauigkeit?), mal davon abgesehen, dass er 3 cm drüber ist
Distance to nearest object is 11.567724679953244 cm
Distance to nearest object is 11.499089858554726 cm
Distance to nearest object is 11.61923083678812 cm
Distance to nearest object is 11.584904856386856 cm
Distance to nearest object is 11.5162528331457 cm
Distance to nearest object is 11.46474670753014 cm
Distance to nearest object is 11.516235693741692 cm
Distance to nearest object is 11.481926883963752 cm
Distance to nearest object is 10.486490029783454 cm
Distance to nearest object is 11.378931678478693 cm
Distance to nearest object is 10.366349020330743 cm
Distance to nearest object is 11.378948849102017 cm
Distance to nearest object is 11.310296857080175 cm
Distance to nearest object is 11.447600841123858 cm
# Hier bin ich kurz mit der Hand dazwischen auf ca. 5 cm -- Letzter Wert wird dann einfach kopiert
Distance to nearest object is 11.34460569807743 cm
Distance to nearest object is 11.34460569807743 cm
Distance to nearest object is 11.34460569807743 cm
# Hand raus
Distance to nearest object is 11.378948880321332 cm
Distance to nearest object is 11.413274860722595 cm
Distance to nearest object is 11.430437835313569 cm
Distance to nearest object is 11.361768672668404 cm
Distance to nearest object is 11.2587907002453 cm
Distance to nearest object is 11.378948880321332 cm
Distance to nearest object is 11.464763878153462 cm
Distance to nearest object is 11.36176870388772 cm
Distance to nearest object is 11.396111854912306 cm
Distance to nearest object is 11.499089858554726 cm
Distance to nearest object is 11.60206783097783 cm
Distance to nearest object is 11.430420695909561 cm
Distance to nearest object is 12.85494967865452 cm
Distance to nearest object is 11.327459862890464 cm
Distance to nearest object is 11.481926852744436 cm
# Habe mein Objekt entfernt und jetzt ist die Wand ca. 19 cm entfernt, habe nach einem Messwert eine Kiste auf ca. 8 cm dazwischen gestellt
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
Distance to nearest object is 23.8048235698152 cm
# Kiste raus und habe den Sensor etwas näher zur Wand gerückt und wieder etwas dazwischen gehalten
Distance to nearest object is 20.715517895447192 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
Distance to nearest object is 21.024434704531814 cm
# Spiele ein wenig mit den Entfernungen (näher rutschen, weiter weg)
Distance to nearest object is 24.611484561924954 cm
Distance to nearest object is 11.36176870388772 cm
Distance to nearest object is 11.516252864365015 cm
Distance to nearest object is 20.97294571832026 cm
Distance to nearest object is 21.299042703838495 cm
Distance to nearest object is 11.2587907002453 cm
Distance to nearest object is 11.275970876678912 cm
# Kiste steht jetzt ca. 5 cm entfernt, Distance geht nie unter 10.45 cm. Warum?
Distance to nearest object is 10.452146847539552 cm
Distance to nearest object is 11.413274860722595 cm
Distance to nearest object is 11.361785874511042 cm
Distance to nearest object is 11.481926852744436 cm
Distance to nearest object is 11.499089858554726 cm
Distance to nearest object is 11.55056170536227 cm
Distance to nearest object is 11.499072687931402 cm
Distance to nearest object is 11.516235693741692 cm
Distance to nearest object is 11.499072719150718 cm
Distance to nearest object is 11.430437866532884 cm
elchico
User
Beiträge: 29
Registriert: Dienstag 10. März 2015, 00:06

Hat sich erledigt, PiGPIO war die Lösung.

LG
Michi
Antworten