tbs1-bo / ea_rpi_modul

Python Bibliothek für ein E/A-Modul für den RaspberryPi.
1 stars 0 forks source link

Unerwünschtes Verhalten beim Dimmen #4

Closed elektroschule closed 8 years ago

elektroschule commented 8 years ago

Beim Testen ist mir etwas aufgefallen. Wenn ich eine (oder mehrere) LED zunächst auf auf einen Wert zwischen 1-99 dimme und anschließend auf 100 % erhöhe, geht die betreffende LED aus. Beim Schalten von 0 auf 100, geht sie wie gewünscht an.

Getestet habe ich es mit dem client,und folgenden Eingaben:

0 0 0           # schaltet LED aus
100 100 100     # schaltet LED ein
99 99 99        # dimmt LED auf 99 %
100 100 100     # schaltet LED aus :(
pintman commented 8 years ago

Danke für den Hinweis.

Im Quelltext sehe ich das Problem nicht direkt. Das muss ich mal mit angeschlossener Hardware testen. Vermutlich komme sich die direkte Beschaltung mit GPIO.output() und die Verwendung des PWM mit pwm.ChangeDutyCycle() ins Gehege.

Vielleicht kann ich einfach immer PWM nutzen.

pintman commented 8 years ago

Es scheint ein Timing-Problem zu sein. Ich habe für jede LED ein PWM. Dieses wird gestoppt, bevor die LED geschaltet wird.

    if 0 <= led_farbe < len(self.__leds):
        if an_aus == 1 or an_aus == 0:
            # LED ein oder ausschalten                                                             
            self.__pwms[led_farbe].stop()
            # Konvertierung nach int notwendig, falls an_aus = 1.0 oder 0.0                        
            GPIO.output(self.__leds[led_farbe], int(an_aus))

        elif isinstance(an_aus, float) and 0 <= an_aus <= 1:
            # LED dimmen                                                                           
            pwm = self.__pwms[led_farbe]
            pwm.start(an_aus*100)
            pwm.ChangeDutyCycle(an_aus*100)

stop() scheint nicht zu blockieren, sondern in einem anderen Thread zu laufen. Der Aufruf output() läuft daher ins Leere.

ea.schalte_led(0, 1) ->klappt nicht ... warten ... ea.schalte_led(0, 1) -> klappt. :-/

Mir fallen zwei mögliche Lösungen ein:

  1. Komplett auf das Dimmen zu verzichten.
  2. Nur noch auf PWM zu setzen und die LED bei vollständiger Helligkeit mit einem DutyCycle von 100% zu betreiben.

Leider flackert bei Version 2 meine LED auf dem Board immer wieder. Liegt es vielleicht an der Hardware? Kannst du mal folgenden Quelltext testen?

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(33, GPIO.OUT) # rote LED
p = GPIO.PWM(33, 50)  # channel=12 frequency=50Hz
p.start(80)

Bei mir flackert die rote LED hierbei alle paar Sekunden kurz. :( Eine Änderung der Frequenz bringt keine besseren Resultate.

pintman commented 8 years ago

Musst den Quelltext nicht testen. Bei mir lief ein wilder lxpanel-Prozess im Hintergrund, der für das Flackern verantwortlich war. :-( Ich werde daher die Variante umsetzen, die komplett auf PWM setzt.

pintman commented 8 years ago

Mit Version 0.3.3 sollte es nun klappen.