Teil 3
Elektrizitätslehre für Hobby-Elektroniker und solche, die es werden wollen. Warum wir manchmal eine externe Spannungsversorgung brauchen.
In dem ersten und zweiten Teil dieses Blog-Beitrags haben wir uns einen Überblick verschafft, welche elektronischen Bauteile wir für welchen Zweck einsetzen, und einfache Berechnungen mit dem Ohm’schen Gesetz durchgeführt.
Als Wiederholung halten wir fest, dass wir die maximal zulässige Spannung bzw. Stromstärke an den GPIO-Ports nicht überschreiten dürfen. Diese Angaben finden wir konkret im Datenblatt, merken können wir uns als Faustformel Vmax = 3,3 V für Raspberry Pi und Co. Nur die großen Arduinos vertragen 5 V. Und der Strom sollte 15mA/Pin nicht übersteigen. Wenn wir Relais, Motoren oder viele LEDs ansteuern wollen, benötigen wir eine externe Spannungsversorgung.
Wir haben Spannungsteiler kennen gelernt, und auch wenn es explizit nicht gesagt wurde, wissen wir, dass auch ein Potentiometer nur ein Spannungsteiler ist. Der nutzt uns jedoch wenig, wenn wir die Helligkeit einer LED regeln wollen. Denn wir hatten gesehen, dass es einer gewissen Mindestspannung bedarf (die jeweilige Flussspannung des Halbleiter-Übergangs); darüber hinaus kann der Strom ungehindert fließen, solange wir keinen Vorwiderstand einsetzen. Aber die Helligkeit der LED können wir so nicht regeln. Es bedarf einer anderen Lösung, und die heißt PWM.
PWM steht im deutschen für Pulsweiten-Modulation und im englischen für pulse width modulation (synonym ist auch PDM für Puls-Dauer-Modulation bzw. pulse duration modulation) und das bedeutet, dass wir anstelle einer konstanten Gleichspannung Pulse aussenden, also den Strom immer an- und abschalten. Das geschieht jedoch so schnell, dass wir es nicht sehen. Wie im Kino oder im Fernsehen, wo 24 bzw. 25 Bilder / Sekunde für unser Auge einen Film ergeben. Wie oft in einer Sekunde ein- und ausgeschaltet wird (die Frequenz, engl. „rate“ oder „frequency“), ist eine der Kenngrößen unserer PWM.
Die zweite Kenngröße ist das Verhältnis der Pulsdauer zur Gesamtdauer eines Zyklus, bestehend aus Puls + Pause. Diese Kenngröße nennt man Tastgrad (engl. „duty cycle“).
Was bedeutet das für unsere gedimmte LED? Die Frequenz muss so hoch sein, dass unser Auge getäuscht wird. Dafür reichen bereits 50 oder 100 Hz (50 Hertz = 50/s). Und die Spannung bleibt höher als die notwendige Flussspannung, während der Strom nur zeitanteilig gemäß dem Tastgrad fließt. Damit wird der LED weniger elektrische Energie zugeführt.
Genau diesen Effekt machen wir uns auch für die Drehzahlregelung von Motoren zunutze. Denn mit der H-Brücke im vorherigen Teil hatten wir ja nur die Drehrichtung des Motors geändert. Die dort vorgestellten Motortreiber-Module und Darlington-Transistoren funktionieren bei unseren Basteleien übrigens wunderbar auch mit PWM.
Wie bekommen wir denn nun diese so manipulierte Spannung an unsere Ausgangsports? Bislang haben wir die Pins ja nur programmgesteuert ein- oder ausgeschaltet, z.B. im Sekundentakt bei dem Beispiel-Sketch Blink. Die gute Nachricht ist: Unsere Micro-Computer oder Micro-Controller können PWM ausgeben, ggf. müssen wir nur gewisse Einschränkungen bei der Auswahl des Ausgangsports hinnehmen. Beim Arduino sind diese Pins mit einer Tilde ~ gekennzeichnet, beim Uno die digitalen Pins 3, 5, 6, 9, 10 und 11.
Und auch die Programmierung ist recht einfach: Wir benutzen die Funktion analogWrite(), mit der Syntax analogWrite(pin, value), wobei pin die Pinnummer ist, ohne dass diese vorher als Ausgang definiert wird, und value eine Integerzahl zwischen 0 und 255 ist, also z.B. 25% entspricht 63.
Nach Aufruf von analogWrite() generiert die Funktion eine stetige Rechteckwelle mit angegebenem Zyklus, bis der nächste Aufruf von analogWrite() (oder digitalRead() oder digitalWrite()) auf dem gleichen Pin erfolgt.
Weitere Einzelheiten finden Sie auf der Referenzseite von arduino.cc, wo ich folgenden Beispielcode kopiert habe, der vor allem interessant ist, weil die analoge Eingangsgröße eine 10-Bit-Auflösung (max. 1023) hat, während der Ausgangswert max. 255 sein darf.
Der Code setzt die Ausgabe auf dem LED-Pin 9 proportional (Faktor 4) zu dem Wert, der von einem Potentiometer an A3 gelesen wird.
int ledPin = 9; // LED auf Digitalpin 9 verbunden int analogPin = 3; // Potentiometer auf Pin 3 verbunden int val = 0; // Variable, um den gelesenen Wert zu speichern void setup() { pinMode(ledPin, OUTPUT); // Setzt den Pin als output. } void loop() { val = analogRead(analogPin); // Liest den Wert vom Pin ein analogWrite(ledPin, val / 4); // analogRead: Werte von 0 bis 1023, analogWrite: Werte von 0 bis 255 }
Genauso einfach ist das Ganze in der Programmiersprache Python am Raspberry Pi, zumindest, wenn man das Modul gpiozero verwendet. Man instanziiert das Objekt led aus der Klasse gpiozero.PWMLED und weist diesem Objekt einen Wert zwischen 0 und 1 zu.
from gpiozero import PWMLED
from time import sleep
led = PWMLED(17)
while True:
led.value = 0 # off
sleep(1)
led.value = 0.5 # half brightness
sleep(1)
led.value = 1 # full brightness
sleep(1)
Eine besondere Form der Pulsweiten-Modulation wird benutzt, um die Auslenkung von Servomotoren (oder kurz Servos) zu kontrollieren. Diese kleinen Bauteile sind bei Makern und Modellbauern sehr beliebt, benötigen in der Regel mindestens 5 Volt und haben außer der Spannungsversorgung einen dritten Anschluss: die Steuerleitung. Die Servos unterscheiden sich bei den maximal möglichen Drehwinkeln, der zwischen plus/minus 90° und plus/minus 180° liegen kann, und im maximalen Drehmoment (Stellkraft).
Wenn Sie die Marionette von Simon Monk mit vier Servos nachbauen möchten, reichen die preiswerten SG90 Micro Servo Motor auf dem ersten Bild. Wer das Ventil für die Gartenbewässerung betätigen möchte, benötigt schon den MG995 mit bis zu 15 kg Stellkraft.
Und wie funktioniert nun die PWM hier, und warum ist es eine besondere Form
Der Servo wird nicht wie in den vorherigen Fällen mit weniger Strom versorgt, sondern bekommt stets die volle Kraft über die rote und braune Leitung. Über das orange Kabel erhält der Servo sein Steuersignal, wieviel Prozent der maximalen Auslenkung er drehen soll.
Dabei ist die Frequenz mit 50 Hz verhältnismäßig niedrig. Und der Tastgrad (duty cycle) variiert nur zwischen 5% und 10%. In Zahlen bedeutet das: innerhalb von 20 ms wird ein Signal zwischen 1 und 2 ms gesendet. Dabei bedeutet: 1 ms = linker Vollausschlag, 2 ms = rechter Vollausschlag und 1,5 ms Mittelposition.
Da die Bilder im Internet nicht maßstabsgetreu sind, habe ich versucht, den kleinen Ausschnitt des zulässigen „duty cycle“ so gut wie möglich zu visualisieren. Die plus/minus 90° sind exemplarisch dargestellt; wenn der Servo plus/minus 120° oder sogar plus/minus 180° Spielraum hat, sieht es auf der Zeitachse genauso aus.
Für die Verwendung eines Servos am Arduino und anderen Micro-Controllern gibt es Programmbibliotheken (libraries), die man in der Arduino IDE in seinen Sketch einbinden kann. Sie finden diese auf der Produktseite unter der Rubrik Wichtige Downloads & Links.
Und die Programmierung in Python ist mit gpiozero wieder sehr einfach. Man instanziiert ein Objekt servo aus der Klasse gpiozero.Servo mit der Pinnummer für den orangen Anschluss und gibt einen der beiden folgenden Beispiel-Codes ein:
from gpiozero import Servo from time import sleep servo = Servo(17) while True: servo.min() sleep(1) servo.mid() sleep(1) servo.max() sleep(1)
Im zweiten Beispiel kann der Wert (value) zwischen -1 und +1 liegen mit value = 0 für die Mittelposition
from gpiozero import Servo servo = Servo(17) servo.value = 0.5
Wenn Sie merken, dass Ihr Servo in der neuen Stellung nicht verharrt, sondern ruckelt, können Sie zunächst versuchen, dies im Programmcode korrigieren. Der häufigste Fall für dieses Ruckeln tritt in den Endlagen auf.
Hier müssen wir verstehen, dass wir keine Schweizer Uhren in Händen halten, sondern einen sehr preiswerten Massenartikel mit gewissen Toleranzen. Probieren Sie einfach vom Betrag her kleinere Werte aus (z.B. -0.95 anstelle -1 oder 0.95 anstelle von 1). Außerdem können Sie eine kleine Unterbrechung in Ihrem Programm oder Sketch einfügen, z.B. sleep(0. 15) bzw. delay(15).
Eine zweite Fehlerquelle sind die hohen Ströme, die ggf. zu Spannungseinbrüchen führen. Sie können einen einzelnen Servo am Raspberry Pi oder Micro-Controller anschließen und mit 5 V versorgen. Schließen Sie dann zusätzlich einen großen Kondensator, z.B. 2200 µF (Polung beachten), als Energiespeicher vor die Servos an, damit der Raspi nicht wegen Unterspannung einen Neustart macht.
Empfehlung und bei mehreren Servos unbedingt notwendig ist eine externe Spannungsversorgung, aber das wussten Sie ja schon. Auf dem Bild sehen Sie den PCA9685 16-Channel 12-bit PWM Servo Driver sowohl für Arduino als auch für Raspberry Pi. Im Bildvordergrund sehen Sie die Anschlussbuchsen für die externe Spannungsversorgung der Servos (Empfehlung: 6V) sowie den Elektrolytkondensator. Die Anschlüsse rechts sind für die Spannungsversorgung der Steuerelektronik und den I2C-Bus.
Wenn Sie Ihre Schaltung von Hand aufbauen, denken Sie auch an die Verbindung zwischen Ground der externen Spannungsversorgung und dem GND-Anschluss des Raspberry Pi bzw. Micro-Controllers, ansonsten ist der Steuerstromkreis nicht geschlossen.
Im nächsten Teil werden wir auch die Mikro-Controller ohne Steckdose betreiben. Weitere Informationen, Beispiele und Erklärungen finden Sie in unseren E-Books und Blog-Beiträgen. Viel Spaß beim Basteln und Programmieren.
Auf vielfachen Wunsch hier der Download des Blog-Beitrags als pdf-Dokument.
3 commenti
Georg
Wäre nett, wenn Ihr auch die anderen Teile der Serie hier verlinken würdet
Bert
Danke! Und ein Vorschlag, könnten Sie ein Webseite veröffentlichen, auf der ein Index aller bisheriger Beiträge (und eventuell ausgegraut die vorgesehenen zukünftigen) zum Ansehen und Downloaden steht?
Und, ein zweiter, nun thematischer. ein Einführung in Längs- und Step-Down-Regler mit den grundlegenden ersten Berechnungen von Lasten und Verträgichkeiten wäre schön. Mir sind gerade ein Breadboardnetzteil (Längsregler9 und ein mp3-Player durch NIchtbeachtung dieses Problems gestorben.
Evandro Franceschini
👌🏻grazie!