Arbeiten mit LEDs/ RGB
Beschreibung
[Bearbeiten]Hier wird gezeigt, wie man mit einer RGB LED und einem Microcontroller eine kleine Lichtspielerei machen kann.
Pulsweiten Modulation
[Bearbeiten]Man beachte:
Es leuchtet immer nur eine LED, was sowohl die Programmierung erleichtert als auch Stromspitzen vermeidet.
Effekt verstärken
[Bearbeiten]Ich empfehle, über der LED eine Art Diffusor (Papier, zerknüllte Plastikfolie ...) zu befestigen, weil er die Farbmischung gleichmäßiger und damit spektakulärer macht.
Schema
[Bearbeiten]Wenn die Schaltung mit Batterie laufen soll, sollte der Spannungsregler entfernt werden, weil er die Effizienz stark vermindert. Ein Abblockkondensator ist in diesem Fall auch nicht nötig, (weil Verbindung kurz) und auch nicht zu empfehlen (Leckstrom durch den Kondensator).
Der PIC arbeitet mit Spannungen von 2.0 V bis 5.5 V, eine sinkende Batteriespannung stört den PIC also nicht besonders. Zu bedenken ist aber, dass insbesondere die blaue LED eine relativ hohe Flussspannung hat (=Spannung, die an der LED abfällt). Das hat zur Folge, dass die Farbzusammensetzung vom Ladezustand der Batterie abhängt.
Der PIC12F509 kann problemlos durch einen PIC12F508 ersetzt werden, dafür muss im Quellcode nur 12F509 durch 12F508 ersetzt werden.
Die meisten Drei-Farb-LEDs können direkt angeschlossen werden, da der Controller 25 mA treiben kann. Sollten die verwendeten LEDs einen gemeinsamen Anodenanschluss haben, müssen die Konstanten
#Define Blue B'001'
#Define Green B'010'
#Define Red B'100'
#Define Black B'000'
entsprechend angepasst werden. z.B. so:
#Define Blue B'110'
#Define Green B'101'
#Define Red B'011'
#Define Black B'111'
Die LEDs sind untereinander vertauschbar. Es spielt also keine Rolle, ob Blau an GP0 ist oder Rot. Orientiere dich daran, wie du es am einfachsten verdrahten/layouten kannst.
GPIO3 lässt sich nur als Eingang verwenden. Mit dem untenstehenden Quellcode holt der angeschlossene Schalter den PIC aus dem Sleepmodus.
GPIO4 kann man auch als Jumper ausführen. Ist dieser Pin auf Highpegel (+5 Volt) läuft nur ein Farbübergang ab. Ist er auf Lowpegel (0 Volt), laufen 3 Farbübergänge ab. Selbstverständlich kann, wer es sich zutraut, dem Pin auch eine andere Funktion geben.
Zu beachten im Schema: GPIO5 ist noch frei. Beispiele, was man damit machen kann:
- Triggersignal für ein Oszilloskop
- Jumper für die Geschwindigkeit
- ...
Widerstände
[Bearbeiten]Die Vorwiderstände der LEDs kann man ganz normal berechnen. Eventuell muss man mit den Widerstandswerten experimentieren, um eine gleichmässige Helligkeit zu erhalten.
Die Wahl der Pullup-Widerstände ist nicht kritisch. Werte zwischen 10 kOhm und 50 kOhm sind sinnvoll. Bei Batteriebetrieb sollte der Pullupwiderstand eher 47 kOhm als 10 kOhm haben.
Struktogramme
[Bearbeiten]Hauptprogramm
[Bearbeiten]PWM
[Bearbeiten]Quellcode
[Bearbeiten];--------------------------------------------------------------------
;
; RGB.asm
;
; Version: 17
; Datum: 24.07.2007
; Controller: PIC12F509-Prozessor mit internem Oszillator
; Licenses: GPL 3 or any later
; GFDL 1.2 or any later
;
; Funktion:
; Eine 3-Farb-LED wird so angesteuert, so dass der komplette
; RGB-Farbraum abgefahren wird.
;--------------------------------------------------------------------
; Assembler-Direktiven
list P=12F509, r=hex
include p12f509.inc
__CONFIG _WDT_OFF & _MCLRE_OFF & _CP_OFF & _IntRC_OSC
#Define Blue B'001'
#Define Green B'010'
#Define Red B'100'
#Define Black B'000'
;--------------------------------------------------------------------
; MACROS
;--------------------------------------------------------------------
movlf macro const8,var1
movlw const8
movwf var1
endm
movff macro var1,var2
movf var1,w
movwf var2
endm
fade macro Start,Stopp
movlf Start, b0
movlf Stopp, b1
Call FADE0
endm
;--------------------------------------------------------------------
; Variablen
;--------------------------------------------------------------------
cblock h'10'
c0
c1
c2
b1 ; (=Bitmuster 1)
b0 ; (=Bitmuster 0)
ver ; Verhaeltnis
zu ; (=Zustand -> Entscheid über Startfarbe)
zu1 ; (=Zustand -> Anzahldurchläufe)
r0 ;Temporäre Zählervariable
r1 ;Temporäre Zählervariable
endc
;--------------------------------------------------------------------
; Initialisierung
;--------------------------------------------------------------------
movlf Black, GPIO ; init outputs
movlw B'01001111' ; see Datasheet
option
movlf B'00000000',OSCCAL
movlw B'00011000' ;init tris-register
tris GPIO
;--------------------------------------------------------------------
; Das eigentliche Programm
;--------------------------------------------------------------------
BEGIN
movlf d'1', zu1 ;Ein Durchlauf
btfsc GPIO,4
goto START
movlf d'3', zu1 ;Alle drei Durchläufe
START:
BTFSC zu,1 ;bei jedem mal drücken eine neue Start Farbe
goto Z2
BTFSC zu,0
goto Z1
Z0: fade Black, Green
fade Green, Blue
fade Blue, Red
fade Red, Green
fade Green, Black
movlf d'1', zu
goto FOOT
Z1: fade Black, Blue
fade Blue, Green
fade Green, Red
fade Red, Blue
fade Blue, Black
movlf d'2', zu
goto FOOT
Z2: fade Black, Red
fade Red, Green
fade Green, Blue
fade Blue, Red
fade Red, Black
movlf d'0', zu
goto FOOT
FOOT: call BREAK
decfsz zu1, f ;mehrere Durchläufe ausführen
goto START
btfsc GPIO,4 ;nochmal drei Durchläufe?
goto S0
movlf d'3', zu1
goto START
S0: btfsc GPIO,3 ;nochmal ein Durchlauf?
goto S1
movlf d'1', zu1
goto START
S1: movlf Black, GPIO
SLP: sleep ; Wechsel in Sleep Modus
goto SLP
;--------------------------------------------------------------------
; Unterprogramm fade
;--------------------------------------------------------------------
; Parameter:
; b0 (=Bitmuster 0) beginnt bei 100% und geht nach 0%
; b1 (=Bitmuster 1) beginnt bei 0% und geht nach 100%
;
; Wenn das Verhältniss zwischen 0100 0000b (64d)
; und 0111 1111b (127d)
; (also Bit 6 gesetzt) ist, werden mehr durchläufe
; gemacht als sonst. (32 statt 16 durchläufe)
; Damit werden die Mischfarben betont.
FADE0: movlf d'0', ver ;Verhaeltnis=0
LOP1: incf ver, 1 ;Verhaeltnis=Verhaeltnis+1
btfsc ver, 6 ;Verhaeltnis Bit 6 gesetzt?
goto JA
movlf d'16', r1 ;r1=16
goto LOP2
JA: movlf d'32', r1 ;r1=32
LOP2: movff b0, GPIO ;b0 ausgeben
COMF ver, 0 ;r0=254-Verhaeltnis
movwf r0
L1: DECFSZ r0, 1 ;r0=r0-1, bis r0=0
goto L1
movff ver, r0 ;r0=Verhaeltnis
movff b1, GPIO ;b1 ausgeben
L0: DECFSZ r0, 1 ;R0=R0-1, Bis R0=0
goto L0
DECFSZ r1, 1 ;R1=R1-1, Bis R1=0
goto LOP2
movf ver,w ;Bis Verhaeltnis=254
xorlw h'FE'
btfss STATUS,Z
goto LOP1
retlw h'0'
;--------------------------------------------------------------------
; Subprogramm Break
;--------------------------------------------------------------------
; Zeit die vergeht:
; Rund 500ms
BREAK: movlf d'5',c2
BL2: movlf d'133',c1
BL1: movlf d'250',c0
BL0: DECFSZ c0, f
goto BL0
DECFSZ c1, f
goto BL1
DECFSZ c2, f
goto BL2
retlw d'0'
;--------------------------------------------------------------------
END
;-------------------------------------------------------------------------
Geschrieben für MPASM, case sensitivity enabled, "generate-absolute-code"
zu Beachten
[Bearbeiten]Um den Code zu assemblieren, muss man sich von http://www.microchip.com/ die Entwicklungsumgebung MPLAB runter laden.
Um die Software auf den Controller zu bekommen, benötigt man noch ein Programmiergerät. Der Autor hat ein PicKit2 von Microchip verwendet.
Galerie
[Bearbeiten]-
Prototyp mit zwei Tastern
-
Miniatur Prototyp