16-bit LED-Array am LPT-Port


Welche Teile werden benötigt?
- 2 74HCT573 Latches (je ca. 0.50 €)
- 2 ULN2803A Darlington Arrays (je 1€)
- 16 LEDs (mit passenden Widerständen für 5V) (je 0.05-1€)
- 1 DSUB-25-Stecker (männlich) (1-2€)
- Lochrasterplatine und Kabel (5-8€)

Hinweise:
- 74HCT373 und 74HCT573 sind funktionsgleich, nur die Pinbelegung ist unterschiedlich, der 573er ist für solche Anwendungen natürlich praktischer, da sich die In und Out-Pins auf den gegenüberliegenden Seiten befinden.

- Um die passenden Widerstände zu berechnen, könnt ihr die folgende Formel verwenden: (5 - U) / I
U ist die Betriebsspannung des LEDs (bei grünen meist 2,1V),
I die aufgenommene Stromstärke (grün ca. 25 mA), diese Angaben sollten im Händlerkatalog stehen.
Für diesen grünen LED wäre der benötigte Vorwiderstand demnach ca: (5V - 2,1V) / 0.025A = 116 Ohm, also würde ich hier z.B. einen 120 Ohm-Widerstand kaufen.

- Es lohnt sich, passende IC-Sockel zu kaufen, denn die ICs vertragen nicht allzu viel Hitze beim Löten und sie sind sehr empfindlich was statische Ladung betrifft, man kann sie schon durch kleine Ladungen (z.b. eines Netzlötkolbens) unbrauchbar machen.

- Die Transistorarrays (ULN2803A) sind nicht unbedingt nötig, die Latches geben bis zu 35 mA pro Pin (LEDs brauchen ca. 20mA, grüne, blaue und weisse etwas mehr), doch sie isolieren den Parallelport zusätzlich und da sie den Minuspol des Busses bilden, haben sie die Verlötung der von mir benutzten LEDs vereinfacht ;).
Wer sich die paar Euro sparen will, muss dann die umgekehrte Polarität auf dem Schaltplan beachten, die Ausgänge am Latch sind positiv.

Ich habe assemblierte 2mm-LEDs für Plattenmontage mit eingebautem Vorwiderstand für 5V benutzt, da die üblichen 3mm-LEDs zu viel Platz gebraucht hätten.
Vorteil: man braucht keine Widerstände zu verlöten und kann vor allem die LEDs schön nebeneinander aufstellen.
Nachteil: schweineteuer - ca. 1€ das Stück


Schaltplan
Link zum Schaltplan
Der Schaltplan ist relativ einfach und analog zu den 8-LED-Varianten mit einem 373/573-IC aufgebaut, nur dass diesmal die Latchfunktion der ICs wirklich benutzt wird. Die Diode D1 und den Kondensator C1 kann man streichen, ich brauchte die nur, weil ich ein LC-Display am gleichen Kabel hängen hatte. Wer ganz korrekt sein will lötet alle GND-Pins vom Stecker (siehe dazu Link zu unterst) zusammen und verbindet sie mit GND des Schaltkreises, ich war zu faul dazu ;).
Die Pins 2 bis 9 des Steckers gehören zum Datenregister und werden mit den entsprechenden Eingängen an den Latches verbunden, Pin 1 und 14 sind die ersten beiden Controlbits, C0 (Pin 1) wird mit dem Latch-Enable-Pin des ersten Latches und C1 (Pin 14) mit dem des zweiten Latches verbunden:



Hier einpaar Bilder der fertigen Platine, sie ist schon am LCD montiert, und war zu faul das ganze wieder auseinander zu nehmen, deswegen sieht man nicht die ganze Platine.



LED VU
Ich habe zu diesem LED-Array noch ein Programm geschrieben welches sich im Systray einnistet und als VU-Meter für den Recordkanal fungiert, sprich damit ist die LED-Anzeige anders als bei Winamp-Plugins immer aktiv.
Das Programm funktioniert mit 8 und 16 LEDs (lässt sich einstellen) und die Kernelmode-Treiber sind im EXE enthalten, er benötigt also keine weiteren DLLs. Probleme könnten mit dem EPP-Modus des Parallelports entstehen, ECP sollte laufen, aber falls unerklärliche Probleme auftreten, einfach mal im BIOS auf SPP (oder "Normal") umschalten. LED-VU startet sich standardmässig im 8bit Modus ohne Peak, durch Parameter lässt sich das bequem steuern:

ledvu.exe -16bit -peak

wäre zum Beispiel 16bit-Modus mit Peak.
Ihr müsst im Mixer eurer Soundkarte Record auf den Kanal einstellen, den ihr angezeigt haben wollt (mit Creative-Soundkarten geht z.b. auch "What U Hear", damit wird alles aufgenommen was ihr hört) - ich weiss, dass diese Methode z.B. mit Teamspeak unschön ist, weil ihr vorher immer Record auf Microphone umstellen müsst, aber anders gehts leider nicht ;)

Download LED-VU
LED-VU [52 kB] - Das Programm selber (wenn's unter Vista/Win7 läuft, würds mich ganz ehrlich wundern... hab's aber nicht getestet)
Hier noch ein kleines Video dazu [1,3 MB] - (16bit und Peak, die Qualität ist nicht so toll, aber es gibt einen ersten Eindruck). Falls irgendwelche Probleme auftauchen sollten, bitte eine möglichst genaue Beschreibung des Problems an ledvu@pez.li.

Funktionsweise
Dieser Abschnitt ist für Leute, die sich gern weiter informieren wollen und selber was mit ihrem LED-Array machen wollen ;)
Da wir nur 8 Datenbits zu Verfügung haben, müssen wir die 16 LEDs in zwei Durchgängen aktualisieren. Damit dies möglich ist, brauchen wir einen Zwischenspeicher, in diesem Fall die Latches. Die hier verwendeten haben 20 Pins - 8 Eingänge, 8 Ausgänge, ein VCC, ein GND und zwei Steuerungspins. OE steht für Output-Enable, beim 573er ist der Pin mit einem logischen NOT versehen, wenn der Pin also unter Strom steht, sind die Ausgänge deaktiviert, deswegen wird dieser Pin mit GND verbunden weil die Ausgänge immer aktiv bleiben sollen. Der zweite Steuerungspin ist LE (Latch-Enable), wenn dieser unter Strom steht, dann übernimmt der interne Speicher den Zustand der Eingänge.
Im ersten Durchgang schreiben wir die Daten für den ersten Latch in den Datenregister und blinken kurz mit dem ersten Controlpin damit der Latch die Daten speichert, anschliessend schreiben wir die Daten für den zweiten Latch und blinken mit dem zweiten Controlpin und so weiter.
Wer selber ein Programm schreiben möchte, muss aber noch eine Kleinigkeit beachten, die Controlpins des Parallelports sind alle Low-Active, das heisst sie sind "low" wenn sie "active" sind, also wenn ihr "1" in das Controlregister schreibt, dann ist Pin C0 deaktiviert, C1-3 aktiv.
An einem Beispiel lässt sich das am besten erläutern:

base = 888;//(in Hex 378) LPT Datenregister Adresse (es sollte bei 99% der heutigen PCs an dieser Adresse zu finden sein)
Out(base+2,3);//Das Controlregister befindet sich 2 Bytes weiter, wir schreiben 3 damit die ersten beiden Pins deaktiviert sind.
Out(base,255);//nun schreiben wir [11111111] in das Datenregister
Out(base+2,2);//anschliessend aktivieren wir C0 (erstes Bit = 0 setzen) damit der erste Latch die Daten speichert - die ersten 8 LEDs sollten nun alle aufleuchten
Out(base+2,3);//C0 deaktivieren, der Latch hält den Zustand
Out(base,255);//Daten für Latch 2
Out(base+2,1);//Latch 2 aktivieren

Weitere Details zum Parallelport findet ihr z.B. hier.