Materialien zum Unterricht

RGB-LED mit PWM ansteuern

Das bedeutet: Eine Lichtemitterdiode (LED), die aus drei einfarbigen LED besteht (R=Rot, G=Grün, B=Blau) wird über das Verfahren der Pulsweitenmodulation (PWM) so angesteuert, dass sie in verschiedenen Helligkeiten und Farben leuchten kann.

Klingt vernünftig, ist aber nicht selbstverständlich!

Der Mikrocontroller arbeitet digital, er kennt nur die beiden Werte Aus oder An (0 oder 1). Dazwischen gibt es für ihn nichts. Die RGB-LED soll aber analog leuchten, also viele verschiede Farben und Helligkeiten zeigen. Der Mikrocontroller und die RGB-LED müssen zusammengebracht werden. Und das geht über die Pulsweitenmodulation. Der Begriff klingt viel schlimmer, als es eigentlich ist.

Es wird als erstes eine Taktzeit festgelegt. Sie beträgt im Beispiel eine Tausenstel Sekunde. Das entspricht einer Frequenz vom 1 kHz=1000 Hz. Während dieser Zeit kann ein digitaler Ausgang nur sehr kurz auf 1 (An) und die meiste Zeit auf 0 (Aus) sein oder eben genau anders herum, mehr An als Aus. Da unser Auge recht träge reagiert, bekommt es die schnellen Wechsel gar nicht mit. Im ersten Fall sieht es die LED einfach dunkler als im zweiten Fall.

PWM

Ist das nun schwer zu programmieren? NEIN! Es gibt eine fertige Klasse mit dem Namen PWM, die bereits alles kann. Man braucht die Klasse nur zu importieren und dann Instanzen davon ableiten.

Die neuen Objekte heißen pwm_rot, pwm_gruen und pwm_blau. Sie wissen nachder Initialisierung, an welchen Pin ihre LED angeschlossen ist (Rot: 4, Grün: 2 und Blau 0). Die Pins sind für die Ausgabe bereit (Pin.OUT) und die Frequenz ist auf 1000 Hz eingestellt.

PWM

Um die Helligkeit für eine Farbe einzustellen, schreibt man nun einfach

pwm_rot.duty(1023)

oder, da die Farbobjekte in dem Array farben stecken

farben[0].duty(1023)

Der Parameter, der der Methode duty übergeben werden muss, liegt zwischen 0 und 1023. Je größer der Wert ist, um so länger sind je einen Takt die LED-An-Phasen.

Achtung: An dem hier genuzten ESP32-Modul ist eine RGB-LED fest eingebaut, die eine gemeinsame Anode für alle drei LEDs hat. Das heißt, der gemeinsame Anschluss (Anode) ist am Pluspol angeschlossen sein. Wenn dann am Pin eine logische 1 (Spannung) anliegt, kann durch die LED kein Strom fließen und sie leuchtet nicht. Erst eine 0 (keine Spannung, Minus) bringt sie zum Leuchten. Die Funktion helligkeit_led(... regelt es aber so, dass wieder alles schön logisch erscheint.

Die Funktion für die Helligkeit einer LED erwartet 4 Parameter:

  1. das Array der Objekte
  2. die Nummer der Farbe, die geändert werden soll (0: Rot, 1: Grün, 2: Blau)
  3. die Helligkeit der LED zwischen 0 (Aus) und 1023 (An)
  4. eine Wartezeit in Millisekunden, damit unser träges Gehirn überhaut etwas sieht
PWM

Bevor man nun den Regenbogen startet, stellt man die wartezeit und die Starthelligkeiten ein: Rot auf ganz hell und Grün und Blau auf ganz aus.

PWM

In der unendlichen Schleife beginnt man mit dem Einschalten von Grün und dann dem Ausschalten von Rot. Insgesamt 6 for-Schleifen bringen den Regenbogen zustande.

ABER: Die RGB-LED ist nicht dafür geeignet, schöne Farben zu erzeugen. Sie ist eher eine schwache Funzel, die sich aber bemüht. Das reicht wie üblich nicht aus.

PWM