Mini Lampka RGB


Urządzenie jest prostym sterownikiem trójkolorowych diod led. Ma za zadanie podświetlać różnokolorowym światłem kryształ, imitację kamienia lub inny podobny przedmiot. Zastosowanie mikrokontrolera zapewnia małe wymiary układu, prostotę wykonania i bardzo dobry efekt wizualny dzięki generowaniu całej palety barw. W układzie pracuje mikrokontroler AT89C2051 oraz kilka elementów pomocniczych. Lampka składa się z dwóch części. Płytka z procesorem i diodami umieszczona jest w podstawie kryształu, natomiast w obudowie zasilacza wtyczkowego zawarty jest stabilizator i klawiatura dwuprzyciskowa umożliwiająca regulację szybkości animacji.

Działanie:


Na rysunku poniżej przedstawiony jest schemat ideowy sterownika:

Głównym elementem układu jest procesor U1 (AT89C4051) współpracujący z rezonatorem kwarcowym X (12MHz) i kondensatorami C1 (33pF) i C2 (33pF). Dioda D1 zabespiecza przed odwrotną polaryzacją napięcia zasilania. Kondensator C4 (100uF) filtruje napięcie zasilające a C3 (4,7uF) pracuje w obwodzie resetu mikrokontrolera i ma umożliwić mu poprawne rozpoczęcie pracy po włączeniu zasilania. Złącze GP1 (goldpin) zapewnia kontakt z zasilaczem i przyciskami. Rezystory R5 (180R), R6 (180R) i R7 (100R) ograniczają prąd diody D2 (LED RGB) natomiast R8 (180R), R9 (180R) i R10 (100R) diody D3 (LED RGB). Elementy R7 i R10 mają mniejsze wartości ze względu na gorszą sprawność czerwonych diod led i konieczność zasilania ich większym prądem. D2 i D3 podłączone są do innych wyprowadzeń mikrokontrolera poniważ wydajność prądowa portów procesora jest mała a w ten sposób nie są konieczne dodatkowe tranzystory.

Schemat ideowy zasilacza przedstawia poniższy rysunek:

Układ U1 (7805) wraz z kondensatorami C1 (1000uF) i C2 (47uF) zapewnia stabilizowane napięcie 5V dla mikrokontrolera i współpracujących elementów. Przyciski S1 (N.C.) i S2 (N.C.) służą do ustawiania szybkości zmiany kolorów. Dioda D1 sygnalizuje stan pracy urządzenia a rezystor R1 (510R) ogranicza jej prąd. Złącze GP1 zapewnia kontakt z płytką sterownika.

Budowa:


Sterownik można zbudować korzystając z płytki dostępnej tutaj. Gdyby konieczny był rysunek w odbiciu lustrzanym to można skorzystać z rysunku dostępnego tutaj. Montaż urządzenia jest bardzo prosty. Należy zwrócić uwagę na prawidłowe przylutowanie diod led RGB. Pod mikrokontroler U1 podstawka jest bezwzględnie konieczna, gdyż w przeciwnym razie nimożliwe będzie jego zaprogramowanie. Płytkę sterownika należy umieścić w przezroczystej matowej obudowie żeby zapewnić optymalne warunki miesznia się barw (najlepszy jest jakiś kryształ). Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj. Zasilacz i przyciski zostały zlutowane w "pająku", bez płytki drukowanej i zamontowane w obudowie transformatora zasilającego. Przyciski użyte w układzie są typu N.C. (normalnie zwarte) ze względu na fakt że akurat takie miałem w czarnym kolorze. Można zastosować zwykłe uSwitch'e ale wtedy konieczna będzie zmiana dwóch linijek programu.

Wykaz Elementów:

Sterownik:


1x GOLDPIN 1x5

2x 100R
4x 180R

2x 33pF
1x 4,7uF Elektrolit
1x 100uF Elektrolit

1x Rezonator Kwarcowy 12MHz
1x 1N4007
2x Dioda LED RGB
1x AT89C4051 +Podstawka

Zasilacz:


2x Przycisk dowolny (N.C.)

1x 510R

1x 47uF Elektrolit
1x 1000uF Elektrolit

1x 7805
1x Dioda LED
1x Mostek Prostowniczy 1A

Programowanie:


Mikrokontroler do sterownika został zaprogramowany w wersji demo programu BASCOM 8051 firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

Dim Rled As Byte , Gled As Byte , Bled As Byte
Dim Licznik As Byte
Dim Flaga As Bit , Ctrled As Bit
Dim N As Byte , Pomoc As Byte , Prz1 As Byte , Prz2 As Byte
Dim Dziel As Word , Dziel2 As Word , Szybkosc As Word
 
Enable Interrupts
Config Timer0 = Timer , Gate = Internal , Mode = 2
On Timer0 Przerwanie
Load Timer0 , 1
Enable Timer0
Start Timer0
 
P1 = 255
P3 = 255
Rled = 100
Gled = 0
Bled = 0
Szybkosc = 6000
N = 1
Pomoc = 0
 
'Nazwy pinow
'****************************
Rd Alias P1.4
Gd Alias P1.3
Bd Alias P1.2
Rd2 Alias P1.7
Gd2 Alias P1.6
Bd2 Alias P1.5
Plsw Alias P3.0
Misw Alias P3.1
Contled Alias P3.2
'****************************
 
Do
 If Flaga = 1 Then
    Flaga = 0
 
    Ctrled = Not Ctrled
    Contled = Ctrled
 
    Select Case N
    Case 1:
     Incr Gled
     If Gled = 100 Then N = 2
    Case 2:
     Decr Rled
     If Rled = 0 Then N = 3
    Case 3:
     Incr Pomoc
     If Pomoc = 100 Then
      N = 4
      Pomoc = 0
     End If
    Case 4:
     Incr Bled
     If Bled = 100 Then N = 5
    Case 5:
     Decr Gled
     If Gled = 0 Then N = 6
    Case 6:
     Incr Pomoc
     If Pomoc = 100 Then
      N = 7
      Pomoc = 0
     End If
    Case 7:
     Incr Rled
     If Rled = 100 Then N = 8
    Case 8:
     Decr Bled
     If Bled = 0 Then N = 9
    Case 9:
     Incr Pomoc
     If Pomoc = 100 Then
      N = 10
      Pomoc = 0
     End If
    Case 10:
     Incr Gled
     If Gled = 10 Then N = 11
    Case 11:
     Incr Bled
     If Bled = 100 Then N = 12
    Case 12:
     Decr Rled
     If Rled = 10 Then N = 13
    Case 13:
     Incr Gled
     If Gled = 100 Then N = 14
    Case 14:
     Decr Bled
     If Bled = 10 Then N = 15
    Case 15:
     Incr Rled
     If Rled = 100 Then N = 16
    Case 16:
     Incr Bled
     If Bled = 100 Then N = 17
    Case 17:
     Incr Pomoc
     If Pomoc = 80 Then
      N = 18
      Pomoc = 0
     End If
    Case 18:
     Decr Bled
     If Bled = 0 Then N = 19
    Case 19:
     Decr Gled
     If Gled = 0 Then N = 20
    Case 20:
     Incr Pomoc
     If Pomoc = 100 Then
      N = 1
      Pomoc = 0
     End If
   End Select
 
 End If
Loop
End
 
Przerwanie:
 
 Incr Licznik
 If Licznik = 100 Then Licznik = 0
 
 If Licznik < Rled Then
  Reset Rd
  Reset Rd2
 Else
  Set Rd
  Set Rd2
 End If
 
 If Licznik < Gled Then
  Reset Gd
  Reset Gd2
 Else
  Set Gd
  Set Gd2
 End If
 
 If Licznik < Bled Then
  Reset Bd
  Reset Bd2
 Else
  Set Bd
  Set Bd2
 End If
 
 Incr Dziel
 If Dziel >= Szybkosc Then
   Dziel = 0
   Set Flaga
 End If
 
 Incr Dziel2
 If Dziel2 = 200 Then
  Dziel2 = 0
  Gosub Przyciski
 End If
 
Return
 
Przyciski:
 
 If Plsw = 1 Then                                             '+
  Incr Prz1
  If Prz1 = 2 Then
   Prz1 = 0
   Szybkosc = Szybkosc - 200
   If Szybkosc < 200 Then Szybkosc = 200
  End If
 Else
  Prz1 = 0
 End If
 
 If Misw = 1 Then                                             '-
  Incr Prz2
  If Prz2 = 2 Then
    Prz2 = 0
    Szybkosc = Szybkosc + 200
    If Szybkosc > 12000 Then Szybkosc = 12000
  End If
 Else
  Prz2 = 0
 End If
 
Return

Zdjęcia Projektu:

AttachmentSize
Schemat41.85 KB
Schemat Zasilacza18.06 KB
Płytka7.98 KB
Płytka (odbicie lustrzane)7.89 KB
Płytka (6 na stronie)35.38 KB
Montowanie10.51 KB
Kod źródłowy3.15 KB
Program po kompilacji (BIN)1.12 KB
Program po kompilacji (HEX)3.18 KB



gosc's picture

Na jakiej zasadzie sygnał z wyprowadzeń ?

Hej gratuluje projektu , ale mam jedno pytanie . Czy nogi diód nie powinny być zwarte z wyprowadzeniami odpowiedzialnymi za sygnał PWM ? nurtuje mnie to dość długo a jakoś sam nie potrafię sobie tego wytłumaczyć.

mirley's picture

Mini Lampka

Wyprowadzenia diod są dobrze podłączone a opisywana lampka działa poprawnie juz długi czas. Układ działa na programowej implementacji prostego PWM. Jest to poprostu licznik zliczający impulsy do pewnej wartosci ustalonej (w tym przypadku 100) i jedna instrukcja warunkowa sprawdzająca czy jest on mniejszy od zmiennej określającej wypełnienie przebiegu podawanego na diodę. Fragment programu za to odpowiedzialny przedstawiam poniżej:

 Incr Licznik
 If Licznik = 100 Then Licznik = 0
 
 If Licznik < Rled Then
  Reset Rd
  Reset Rd2
 Else
  Set Rd
  Set Rd2
 End If

Dzięki temu że sterowanie portami odbywa się w klasyczny sposob nie jest istotne do jakich wyprowadzeń zostały podłączone diody

gosc's picture

Witam! Na początku jest

Witam!
Na początku jest napisane, że to AT89C2051 a później że C4051...
Jest jakaś różnica między tymi Elementami? Bo wgrałem wsad na C2051 (a nie mam zielonego pojęcia o uP)
i nie wiem czy zatrybi, a badzo mi na tym zależy... Proszę o szybką odpowiedź

mirley's picture

Re: 2051<->4051

Mikrokontroler 2051 różni się od 4051 tylko pamięcią flash na program. W opisie napisalem że 2051 ma być a potem dałem 4051 bo taki miałem pod ręką. Nie ma to znaczenia.

Dla pewności przekompiluj program w BASCOM 8051 wybierając w opcjach poprawny mikrokontroler i dopiero potm zaprogramuj

gosc's picture

Kurczę już trochę za późno.

Kurczę już trochę za późno. mam nadzieje że wstanie. Programatora nie mam. Mikrokontroler programował kuzyn...
A tak z innej beczki - ta dioda w schemacie zasilacza to od czego? bo jest wpięta "zaporowo" (tak się na to mówi :P) i już nie czaje kiedy ona ma świecić. Bascoma nie znam heh...

mirley's picture

Re: Lampka

Faktycznie dioda jest wpieta zaporowo, mój błąd :). Oczywiście ma być włączona przeciwnie, tak aby miała szansę zaświecić w normalnych warunkach pracy

gosc's picture

kurczę, nie podoba mi się

kurczę, nie podoba mi się jeszcze to wyprowadzenie. wygląda na to, że do nogi GND w AT89c dochodzi prąd o napięciu 5V. Bo w tej złączce na zasilaczu 1 to 5V a to ma się łączyć z 1 na sterowniku i tu ta jedynka idzie do GND. Nie czaje już tego... To ja się mylę czy jest błąd na schemacie?

mirley's picture

Re: Lampka

Problem jest taki że ten projekt robiony był w czasach kiedy o stronie internetowej jeszcze nie myslałem, więc coś takiego jak dbanie o to aby do pinu 1 na płytce pasował pin 1 na drugiej płytce było totalnie bez znaczenia.

Oczywiście złącze należy podłączyć tak aby GND pasowało do GND procesora i tak samo VCC. Kolejność pozostałych pinów jest dobra, należy tylko złącza podłączyć do siebie 1-5, 2-4, 3-3, itd

Jak znajdę trochę czasu to ten schemat poprawnie przerysuję

gosc's picture

przepraszam za moją

przepraszam za moją upierdliwość :P wiem, że działam na nerwy ale chciałem się upewnić, czy te diody są napewno ze wspólną katodą? Bo jutro jade do elektronicznego (święto ;-) ) i nie chcę kupić złych.

gosc's picture

Niet niet to są diody ze

Niet niet to są diody ze wspólną Anodą czyli z łączonym plusem.

gosc's picture

te kondy przy kwarcu mogą być

te kondy przy kwarcu mogą być 36pF albo 30pF?
jeśli tak to które lepssze?

mirley's picture

Re: kondensatory

Zastosuj 30pF

gosc's picture

czy trzeba

mam pytanie czy trzeba programowca ten układ bo ja amator a chcail bym sobie robic cos takiego bym kupil elementy zrobił płytkę i po lutował i czy to bedzie dzialac

gosc's picture

Jak zaprogramujesz, to będzie

Jak zaprogramujesz, to będzie działać ;)

Poczytaj: http://mirley.firlej.org/jak_zaprogramowac_pierwszy_avr to nie jest trudne ;)

mirley's picture

Re: Lampka RGB

Oczywiście procesor trzeba zaprogramować i trzeba miec do tego programator dość złożony. Zajmij sie budową Lampki RGB 2 ona jest zbudowana na innym procesorze, którego będziesz mógł zaprogramować według opisu podanego we wczesniejszym poście.

Ps. Procesor bez programu nie robi dokładnie nic :)

gosc's picture

Lampka RGB

tak ale ja chciał bym bez tych guzików lampę co mi jest potrzebne do zaprogramowania

mirley's picture

Re: Lampka

Zajmij się drugą wersją lampki. Jak zaprogramować i co jest potrzebne napisałem w artykule: http://mirley.firlej.org/jak_zaprogramowac_pierwszy_avr

Ps. Pytania do lampki RGB 2 pisz już pod jej opisem. Najpierw jednak dokładnie poczytaj co napisałem a wszystko się wyjaśni

gosc's picture

Hey to znowu ja (ten, co przy

Hey to znowu ja (ten, co przy jego komentach jest taka gąbka żółta z zębem na wierzchu :P) i kurde mam pytankobo zrobiłem w końcu to cudeńko i druga dioda mi tak świieci że prawie wcale jej nie widać, a poza tym w innych kolorach :/ to ja pomyślał, że zrobie ja na tranzystorach z jednego działającego wyjścia no i polutował je ja Panie i inwersja mi się zrobiła i muszę przeprogramować kłostke a nie wiem jak zmienić program.
Pomoże Pan bo ja prosty chłopak ze wsi i się na takich rzeczach nie znam totalnie?

mirley's picture

Re: Lampka RGB

Zmiana programu nie jest skomplikowana. Wystarczy fragment:

If Licznik < Rled Then
  Reset Rd
  Reset Rd2
 Else
  Set Rd
  Set Rd2
 End If
 
 If Licznik < Gled Then
  Reset Gd
  Reset Gd2
 Else
  Set Gd
  Set Gd2
 End If
 
 If Licznik < Bled Then
  Reset Bd
  Reset Bd2
 Else
  Set Bd
  Set Bd2
 End If

Zamienić na ten poniżej w którym jest inwersja stanów na wyjściu:
If Licznik < Rled Then
  Set Rd
  Set Rd2
 Else
  Reset Rd
  Reset Rd2
 End If
 
 If Licznik < Gled Then
  Set Gd
  Set Gd2
 Else
  Reset Gd
  Reset Gd2
 End If
 
 If Licznik < Bled Then
  Set Bd
  Set Bd2
 Else
  Reset Bd
  Reset Bd2
 End If

Ps. Tak szczerze mówiąc to ja też z miasta nie jestem :))

gosc's picture

O! Gorące Bóg zapłać ;-) A to

O! Gorące Bóg zapłać ;-)
A to normalne, że układ startuje po kilku / kilkunastu sekundach?

mirley's picture

Re: Lampka

Zadbaj o to aby w ustawieniach bascoma był zaznaczony odpowiedni typ mikrokontrolera i rezonator kwarcowy 12MHz i przekompiluj jeszcze raz program.

Ten programik jest trochę stary i nie ma ustawień wpisanych w kod źródłowy, tak jak to mam w późniejszych opracowaniach

gosc's picture

"Przyciski użyte w układzie

"Przyciski użyte w układzie są typu N.C. (normalnie zwarte) ze względu na fakt że akurat takie miałem w czarnym kolorze. Można zastosować zwykłe uSwitch'e ale wtedy konieczna będzie zmiana dwóch linijek programu. "

...a można wiedzieć których i jak? :)

mirley's picture

Re: Przyciski Lampka

W procedurze obsługi przycisków należy zmienić:

Przyciski:
 
 If Plsw = 0 Then  'zmienić z 1 na 0
 ......
 
 If Misw = 0 Then  'zmienić z 1 na 0
 .....

Po prostu zamiast wykrywać wysoki stan z rozwarcia po naciśnięciu należy wykrywać niski przy zwieraniu do masy.

gosc's picture

przyciski

schemat pozostaje bez zmian...

mirley's picture

Re: Lampka

Schemat pozostaje bez zmian. Wstaw przyciski zwykłe (normalnie rozwarte) w miejsce tych na schemacie.

gosc's picture

przyciski

ok wielkie dzięki

gosc's picture

Witam, mógłbyś opisać jaką

Witam,

mógłbyś opisać jaką rolę pełni tutaj zmienna

pomoc

Dzięki

mirley's picture

Re: Lampka RGB

Np fragment:

 Incr Pomoc
     If Pomoc = 100 Then
      N = 7
      Pomoc = 0
     End If

Zmienna ta pracuje jako licznik pomocniczy. Odlicza ilość kroków w których kolor pozostaje nie zmieniony. W poprzednich krokach kolor był zmieniany o jedną wartość co krok. Po czym program wpada na fragment powyżej i czeka poprostu 100 kroków zwiększając tą zmienną. Po odliczeniu 100 kroków przechodzi do modyfikowania następnego koloru i znowu trafia na fragment gdzie czeka jakiś czas itd

gosc's picture

A czy if nie powinien być

A czy if nie powinien być zamknięty w każdym case?

gosc's picture

Niedawno zacząłem się uczyć

Niedawno zacząłem się uczyć bascoma, i pytanie którego nie mogę rozgryźć...
Deklarujesz zmienne Bled Gled i Rled, ok.
Zmieniają swoje wartości od 0 do 100, ok.
Ale nigdzie nie widzę powiązania tej zmiennej z aliasem żadnym, no za chiny nie rozumiem jak to działa, że on podaje coraz większe napięcia / natężenia na linie portu :(

mirley's picture

Re; Lampka

Są dwie konstrukcje if, jeśli jest jedno polecenie w tej samej linijce to nie ma end if. jesli masz kilka poleceń lub przeniesiesz je do linijki niżej to trzeba end if.

Polecenie alias o którym wspominasz totalnie nic nie robi a jedynie pozwala wygodnie nazwać porty i piny procesora. Przejście między Zmiennymi Rled ,Bled.... a portem jest we fragmencie:

If Licznik < Rled Then
  Reset Rd
  Reset Rd2
 Else
  Set Rd
  Set Rd2
 End If


Nie sterujemy tu żadnym napięciem czy prądem, sterowanie odbywa sie na zasadzie PWM, czyli regulacją szerokości impulsu przy stałej częstotliwości. Cyklicznie zwiekszana jest wartość Licznik od 0 do 100, jeśli ustawisz Rled = 50 to porównanie ze zmienną licznik ustawi stan niski na porcie jak licznik będzie 0-49 a stan wysoki jak będzie licznik równy 50-99 itp. Wartości można dobrać sobie dowolnie. jak ustawisz zmienną Rled = 100 to zawsze Rled > Licznik i stan na porcie jest zawsze 0 co owocuje świeceniem na maxa. W przypadku Rled=50 wypełnienie jest 50%

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • Use the special tag [adsense:format:slot] or [adsense:format:[group]:[channel][:slot]] or [adsense:block:location] to display Google AdSense ads.
  • You can enable syntax highlighting of source code with the following tags: [code], [blockcode], [c], [cpp], [java], [javascript], [php], [python], [qb].
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.

More information about formatting options