Für unseren Balkon haben wir eine LED-Lichterkette gekauft, genauer gesagt folgende:
6M LED Lichterkette, 4,5W 125er LEDs, Warmweiß, erhältlich z.B. bei Amazon.
Toll wäre eine Möglichkeit, die Helligkeit nachjustieren zu können, also sollte ein LED-Dimmer her.
Ein Blick in die technischen Daten und auf das Netzteil überraschte, die Lichterkette wird mit nur 3 Volt und 800 mA betrieben:
„Fertige“ Lösungen oder Bausätze beziehen sich oftmals auf wesentlich höhere Spannungen, oft 12-24 V. Also entschied ich mich für einen Selbstbau mit einem Mikrocontrollerboard, genauer einem Arduino UNO R3.
Vorweg – ich sehe den Selbstbau als reines Übungsprojekt – ich bin kein Elektotechniker und übernehme keine Gewähr dafür, sollte sich jemand dazu entschließen, meinen hier geschilderten Aufbau umzusetzen 😉 Aber ich bin sehr an Feedback interessiert, vielleicht hat der ein oder andere noch weitere Ideen oder Optimierungsvorschläge oder verdreht gänzlich die Augen aufgrund meiner Umsetzung 😉
Doch warum ein Mikrokontrollerboard? Zunächst stellte sich heraus, daß das Dimmen von LEDs alles andere als trivial ist. Hierzu wird eine Technik angewendet, welche sich Pulsweitenmodulation (PWM) nennt:
Vorbereitung:
Nach den ersten Überlegungen stellte sich folgende Konstellation heraus:
Die Spannungsversorgung sollte über ein 9 Volt 1500 mA Netzteil erfolgen, welches den Arduino versorgt. Das gleiche Netzteil versorgt auch die Lichterkette, hier wird über einen Schaltregler die Spannung auf die Versorgungsspannung der Lichterkette reduziert, genauer 3,5 V (direkt am Original-Netzteil ermittelt). Die Ausgangsspannung lässt sich mittels einer kleinen Stellschraube am Schaltregler und einem Multimeter exakt einstellen. Ich habe ein 1500 mA Netzteil gewählt, um 800 mA für die Lichterkette und den Rest für den Arduino bereitzustellen – genug Reserve also.
In den Versorgungsstromkreis der Lichterkette wird ein NPN-Transistor eingebunden, welcher über den Arduino geschaltet wird und somit die Lichterkette ein-/ausschaltet. Die Pulsweitenmodulation wird also durch den Mikrocontroller vorgenommen.
Die Regelung des PWM-Intervalls erfolgt über ein Drehpotentiometer, welches an den Arduino angeschlossen wird.
Mit Hilfe der Fritzing Software habe ich den geplanten Aufbau skizziert und einen groben Schaltplan erstellt – erfahrene Elektrotechniker mögen über diesen bitte wohlwollend hinwegsehen 😉
In diesen Skizzen ist kein Ein-/Ausschalter berücksichtigt, dieser wurde nachträglich implementiert.
Nachtrag 09.08.2017: Als Basiswiderstand B2 habe ich anstelle 220 Ω einen 140 Ω Widerstand gewählt, siehe auch Abschnitt „Anfänger-Stolpersteine – bitte beachten!“
Benötigte Materialien und Kosten:
1x Arduino UNO R3 (ATmega328) – ca. 12,- EUR, z.B. hier, oder hier.
1x Platine ohne Cu-Auflage 100 mm x 50 mm, Rastermaß 2,54 mm – ca. 0,79 EUR
1x LM2596 Schaltreglermodul, DC-DC, verstellbarer Abwärtswandler – ca. 2,- EUR
1x Lüsterklemme – ca. 0,95 EUR
1x 9V-Netzteil oder Universal Netzteil 1500 mA – ca. 13,- EUR
1x Adapterkabel mit Netzgerätebuchse 5,5/2,1 mm – ca. 1,85 EUR
1x rote LED 3mm – ca. 0,10 EUR
1x Metallschicht-Widerstand 220 Ω – (für LED-Versuchsaufbau) ca. 0,08 EUR
1x Metallschicht-Widerstand 140 Ω – (Basiswiderstand für Transistor) ca. 0,08 EUR
1x NPN Transistor BC337/25TA TO-92-3 – ca. 0,20 EUR
1x Leitplastik-Potentiometer Mono 10 kΩ – ca. 1,10 EUR
1x Drehknopf schwarz – ca. 1,80 EUR
1x Kippschalter – ca. 2,70 EUR
1x Gehäuse 150 x 80 x 50 – ca. 3,- EUR
1x Jumper Kabel 20 cm männlich/männlich – ca. 4,- EUR
Gesamtkosten (ohne Kabel): ca. 44,- EUR – wobei die beiden teuersten Komponenten, Arduino und Netzteil insgesamt schon 25,- EUR ausmachen – sollten diese bereits vorhanden sein, sind die Gesamtkosten durchaus im Rahmen dessen, was fertige Lösungen im Verkauf kosten würden. Wer die Komponenten günstiger beschaffen kann, kriegt den gesamten Aufbau vielleicht schon für die Hälfte hin.
Weitere Komponenten:
- Kabel 0,5/0,75 mm^2 (ca. 0,50 EUR/m)
- Bohrmaschine + Bohrer
- Lötkolben incl. Zubehör
- Heißklebepistole
- Isolierband
- Multimeter
- Schraubendreher
- Maulschlüssel
Versuchsaufbau
Hier kann man das Grundprinzip nachvollziehen. Die rote LED zeigt den Status (an/aus), die grüne LED dient als Platzhalter für die spätere Lichterkette. Den Aufbau des Arduino Quelltexts für die Pulsweitenmodulation (PWM) sowie die Verwendung des Potentiometers konnte ich dank der vielen sehr guten Tutorials im Web erlernen und nachvollziehen.
Ich habe noch ein paar Optimierungen vorgenommen:
- Der analoge Eingang mit dem angeschlossenen Potentiometer wird mehrfach abgefragt und ein Mittelwert berechnet, um evtl. Ausreißer durch Schwankungen zu vermeiden.
- Implementierung eines Schwellenwertes für die min/max Aussteuerung
// LED dimmen via PWM und Poti
const int numReadings = 10;
const int analogInPin = A1; // Input-Pin fuer Potentiometer (0-1023)
const int analogOutPin = 3; // Pin fuer LED (0-255)
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int inputPin = analogInPin;
int sensorValue = 0; // Berechneter Mittelwert von Poti
int outputValue = 0; // Wert fuer PWM-Output
void setup() {
// Serial.begin(9600); // For Bugfixing
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
pinMode(inputPin, INPUT);
digitalWrite(inputPin, HIGH);
}
void loop() {
// subtract the last reading:
total = total - readings[readIndex];
// read from the sensor:
readings[readIndex] = analogRead(inputPin);
// add the reading to the total:
total = total + readings[readIndex];
// advance to the next position in the array:
readIndex = readIndex + 1;
// if we're at the end of the array...
if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;
}
// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits
sensorValue = average;
// Werte in Bereich des Analog-Out mappen:
outputValue = map(sensorValue, 0, 1023, 0, 255);
if (outputValue < 6) {
outputValue = 0;
}
else if (outputValue > 250) {
outputValue = 255;
}
// Wert ausgeben
analogWrite(analogOutPin, outputValue);
// For Bugfixing
/*
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
*/
delay(2); // delay in between reads for stability
}
Aufbau der Platine
Anschließend habe ich die Komponenten auf eine Platine gesetzt und miteinander verbunden. Spannungsregler und Lüsterklemmen wurden mittels Heißkleber fixiert. Beim Einbau das Transistors bitte die Pinbelegung gemäß Datenblatt heranziehen (Emitter, Basis und Kollektor).
Anfänger-Stolpersteine – bitte beachten!
Wie man ersehen kann, habe ich die ersten Versuchsaufbauten mit kleinen LEDs vorgenommen und für die Verkabelung Jumperkabel verwendet. Zudem hatte ich zunächst einen zu kleinen Transistor (2N3904TA) und die Basis mit einen 10 kOhm Widerstand verbunden. Für den Versuchsaufbau stellte dies alles kein Problem dar, doch bei der finalen Umsetzung zeigten sich hierbei mehrere Probleme – die Lichterkette leuchtete nur noch mit 50% Leuchtstärke.
Meine Idee, Jumperkabel an ein Potentiometer zu löten, war in vielerlei Hinsicht eine schlechte Idee: Der Drahtquerschnitt war so gering, das die Verbindung alles andere als stabil war und zu stark schwankenden Eingangswerten führte. Ich habe diese durch Drähte mit 0.5 mm^2 Querschnitt ersetzt und diese an Stiftbrücken gelötet, um die Verbindung mit dem Arduino herzustellen.
Anschließend war der gewählte Transistor zwar für LEDs ausreichend, doch mit 200 mA Kollektorstrom bewirkte dieser nur ein schwaches Leuchten der Lichterkette. Nach der Umrüstung auf einen BC337/25TA Transistor mit 800 mA Kollektorstrom war dann auch dieses Problem gelöst.
Danach stellte sich heraus, das ein 10 kOhm Widerstand an der Basis des Transistors viel zu hoch bemessen war – ich habe diesen durch einen 140 Ohm Widerstand ersetzt.
Berechnung Basiswiderstand
Als Nachtrag vom 09.08.2017 füge ich die Berechnung des Basiswiderstandes für den Transistor bei. Ich habe mich dabei nach dem Artikel Basiswiderstand auf mikrocontroller.net orientiert.
Folgende Werte habe ich hierbei berücksichtigt:
\(U_{E}=5V\) Steuerspannung
\(I_{C}=800 mA\) für den Verbraucher, also die Lichterkette
\(h_{FE}= 100\) DC Current Gain des Transistors laut Datenblatt bei \(V_{CE}=1V, I_{C}=100mA\)
Zunächst die Abschätzung der Stromverstärkung in Sättigung für die weitere Berechnung:\(h_{FE}=\frac{h_{FE}}{3,7}=\frac{100}{3,7}\approx 27\)
Berechnung des Basisstroms: \(I_{b}=\frac{I_{C}}{h_{FE}}=\frac{800mA}{27}\approx 30mA\)
Berechnung des Basiswiderstands: \(R_{b}=\frac{U_{E}-0,7V}{I_{B}}=\frac{5V-0,7V}{0,030 A}\approx 143 \Omega\)
Anmerkung: 0,7 V werden von der Steuerspannung abgezogen, da diese an der Basis-Emitter Strecke des Transistors abfallen.
Nach dieser Auslegung habe ich einen 140 Ohm Basiswiderstand gewählt.
Einbau in das Gehäuse
Das Gehäuse habe ich nach den Gegebenheiten meines Aufbaus ausgewählt, es geht sicherlich auch deutlich kompakter 🙂
Wie man ersehen kann, habe ich den Arduino mittels M3 Schrauben und Muttern mit dem Gehäuse verschraubt und in den Deckel des Gehäuses die Bohrungen für Schalter, Potentiometer und Status LED eingebracht.
Die Buchse für die Stromversorgung wird seitlich herausgeführt und wurde im Gehäuse mit Heißkleber fixiert.
Die Zugentlastung des nach außen geführten Kabels für die Lichterkette erfolgt mittels eines Kabelbinders. Die offenen Kabelenden an Schalter, Potentiometer und Status LED wurden mit Isolierband versehen.
Wir haben das Gehäuse mittels eines Nagels an der Wand befestigt.
Der Praxistest:
Auch wenn das Gerät sehr „Retro“-lastig erscheint, erfüllt es seinen Zweck und ist – hey – immerhin selbstgebaut.
Nach dem Einschalten lässt sich die Leuchtstärke der LED-Lichterkette stufenlos mit dem Drehregler einstellen und sorgt so stets für die gewünschte Beleuchtung. Ich habe ein paar Fotos in den Einstellungen maximal, mittel und gering beigefügt. Man möge die schlechte Aufnahmequalität in der Nacht verzeihen, doch erkennt man gut den Effekt.