Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A

ukking 18 Jul 2010 01:41 19019 31
IGE-XAO
  • Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A

    Lampka powstała z myślą o mojej kobiecie. Chciałem, zrobić coś bardziej interesującego niż projekty dostępne w sieci. Sterowanie z pilota RC5, pozwala na przełączanie zapisanych sekwencji, prędkości zmiany kolorów, zapauzowanie aktualnego koloru, oraz ręczne ustawienie koloru.

    Dopiero co zaczynam bawić się w programowanie więc pisząc kod nauczyłem sie dużo nowych rzeczy. Język programowania to assembly. Użyłem pic16f648a bo akurat taki był dostępny a w dodatku posiada wewnętrzny oscylator.

    Schemat jest bardzo prosty. Układ polutowałem na płytce uniwersalnej. Do zasilania lampki użyłem ładowarki Samsunga 5V/0.7A.

    Wymagane komponenty:

    - 3W RGB LED
    - 3x BC337
    - 3x 330Ω
    - 10kΩ
    - 100Ω
    - 12Ω/1W
    - 2x 6.8Ω/1W
    - 100nF
    - 100µF
    - TSOP2236
    - 2x łączniki impulsowe
    - 2 gniazda na podłączenie programatora i diody RGB
    - PIC16F648A (program powinien też działać na innych mikrokontrolerach z tej serii, np: PIC16F628(A) lub PIC16F627(A))


    Dwa przyciski służą do przelączania sekwencji i zmiany prędkości. Mogą zostać pominięte.

    Funkcje przycisków pilota:

    Standby - włącza/wyłącz lampkę
    Program+ - następna sekwencja
    Głos+ - Przyśpiesza prędkość zmian
    Głos- - Zwalnia prędkość zmian
    8 - Pauzowanie/vice versa
    9 - Przejście w tryb ręczny/vice versa

    W trybie ręcznym:
    1- Dodaj czerwonego
    4 - Ujmij czerwonego
    2- Dodaj zielonego
    5 - Ujmij zielonego
    3- Dodaj niebieskiego
    6 - Ujmij niebieskiego


    Można ustawić sześć prędkości zmian:
    Maksymalna prędkość/1
    Maksymalna prędkość/2
    Maksymalna prędkość/4
    Maksymalna prędkość/8
    Maksymalna prędkość/16
    Maksymalna prędkość/32


    W załączniku udostępniam kod programu więc funkcje pilota i sekwencje zmiany kolorów mogą być ustawione jak komu wygodnie.


    Ustawienia przycisków pilota:
    Code:
    ;            command:      program function:
    
    ;                  |            |
    _f1      set   .12   ;standby   sleep
    _f1_0   set   .12   ;standby   wake-up
    _f2      set   .32   ;P+         next
    _f3      set   .17   ;Vol-      speed -
    _f4      set   .16   ;Vol+      speed +
    _f5      set   .0   ;0         reset
    _f6      set   .8   ;8         pause
    _f7      set   .1   ;1         R+
    _f8      set   .4   ;4         R-
    _f9      set   .2   ;2         G+
    _f10      set   .5   ;5         G-
    _f11      set   .3   ;3         B+
    _f12      set   .6   ;6         B-
    _f13      set   .9   ;9         manual mode
          



    Typowa sekwencja:
    Code:
                
    
    ;           --------------------------------- number of interrupts making
    ;          |                              one period (PWM base)
    ;          |        ------------------------- 1/0  - fading on/off
    ;          |       |        ----------------- new R mark value
    ;          |       |       |        --------- new G mark value
    ;          |       |       |       |        - new B mark value
    ;          |       |       |       |       |

          
          dt   .255,   .1,      .255,   .1,      .1
          dt   .255,   .1,      .160,   .160,   .1
          dt   .255,   .1,      .1,      .255,   .1
          dt   .255,   .1,      .1,      .160,   .160
          dt   .255,   .1,      .1,      .1,      .255
          dt   .255,   .1,      .160,   .1,      .160
          dt   .0

    Pierwsza wartość (podstawa PWM) ustawia liczbę kroków przejścia kolorów (im większa tym płynniejsze będą zmiany). Druga wartość ustawia przejście płynne (1) lub skokowe (0). Trzy kolejne liczby ustawiają nowe wartości czerwonego, zielonego i niebieskiego (nie powinny być większe niż pierwsza wartość ani też 0, minimalna wartość to 1).
    Każda sekwencja powinna być zakończona zerem, a ostatnia dwoma.


    Wypełnienie PWM może być obliczone jako stosunek wartości koloru do wartości podstawy PWM

    Różne wartości podstawy PWM nie powinny być użyte obok siebie w jednej sekwencji jeśli płynne przejście jest ustawione, bo może to spowodować błędne określenie kierunku zmian.
    Powinny one być rozdzielone linią gdzie wartości RGB mogą być najpierw wyzerowane (wartość 1), wtedy nowa podstawa PWM może być użyta.



    Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A
    Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A
    Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A Mood lamp - moja lampka RGB na pilota + kod na PIC16F648A


    23.07.2010.
    Zauważyłem, że lampka czasami potrafi się sama zresetować. Powodem tego było za mało ustawionego miejsca na wykonywanie kodu pomiędzy interrupt'ami. Zmieniłem wartość "pwm_base" z 40 na 45 i wydaje się, że usunęło to problem. Poprawiona wersja kodu jest już w załączniku.

    Płytka drukowana.

    A tutaj wersja 1.3 z funkją ustawienia czasu po którym lampka ma się wyłączyć. Dużo innych rzeczy zostało też poprawionych.

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    ukking
    Level 12  
    Offline 
    Has specialization in: elektronika ogólna
    ukking wrote 67 posts with rating 74, helped 3 times. Live in city Southampton. Been with us since 2007 year.
  • IGE-XAO
  • #2
    adi84_84
    Level 14  
    Nawet nieźle ci to wyszło.Z czego została wykonana obudowa?
  • #3
    Fazi87
    Level 24  
    Ciekawa konstrukcja, myślę czy nie zbudować czegoś podobnego opierając się o Twój projekt. Tylko mam jedno pytanie, piszesz o pilocie RC5, możesz napisać dokładnie jaki pilot jest używany przez Ciebie?
  • IGE-XAO
  • #5
    ukking
    Level 12  
    adi84_84 wrote:
    Nawet nieźle ci to wyszło.Z czego została wykonana obudowa?

    LORDUS wrote:
    Fajnie wyszła ci ta lampa. A obudowa to z odzysku?


    Obudowa jest z odzysku. Kupiłem na rynku z rupieciami za 7zł. a prezentuje się znakomicie.

    Fazi87 wrote:
    ...piszesz o pilocie RC5, możesz napisać dokładnie jaki pilot jest używany przez Ciebie?


    Pilot jest od telewizora Wharfedale. Jest to bardzo popularny tym pilotów. Jak coś to można zawsze jakiś uniwersalny ustawić.

    leonow32 wrote:
    Całkiem przyjemna konstrukcja ;) wrzuć jeszcze schemat

    Za ile kupiłeś diody RGB?


    Schemat, wsad i kod do obróbki jest już w załączniku.

    Diodę RGB kupiłem kiedyś za 25zł z tme.pl:
    Link
  • #6
    markovip
    Level 34  
    Powinieneś użyć mocniejszego zasilacza, 1,5A przynajmniej. Przy kolorze białym, tj. wszystkie kolory na 100% na zasilaniu mogą powstać niebezpieczne tętnienia.
  • #7
    profesorek_96
    Level 16  
    W czym jest lepsza dioda mocy rgb od zwykłej diody rgb?
  • #8
    markovip
    Level 34  
    Nie jest lepsza, po prostu ma większą moc. W tym przypadku 3x1W. Normalne diody RGB 5mm, mają przeważnie 3x0,1W.
  • #9
    ukking
    Level 12  
    markovip wrote:
    Powinieneś użyć mocniejszego zasilacza, 1,5A przynajmniej. Przy kolorze białym, tj. wszystkie kolory na 100% na zasilaniu mogą powstać niebezpieczne tętnienia.


    Maksymalny prąd przy białym kolorze może osiągnać 600mA przy wszystkich kolorach wysterowanych na maxa. Poszczególne sekwencje są ustawione tak aby biały kolor nie był jaśniejszy niż poszczególne kolory oddzielnie. LED nie pracuje tutaj na pełnej mocy. Lampka świeci bardzo jasno przy wybranych wartościach rezystorów i nie grzeje się za bardzo, a poza tym dłużej pochodzi jeśli dioda jest trochę oszczędniej wykorzystana. Takie tanie diody zazwyczaj szybko tracą na jasności lub niebieski kolor wysiada jak są nadmiernie wykorzystywane. Wybrany zasilacz jest impulsowy i doskonale daje sobie radę z prądami do podanych 700mA. Potem to ewentualnie zabezpieczenie odpali i się zresetuje, ale to już chyba tylko w wypadku awarii :D.
  • #10
    Fazi87
    Level 24  
    Mam pytanko, jakie komendy w kodzie bym musiał zmienić żeby układ po wciśnięciu powiedzmy jedynki zapalał tylko jeden kolor, dwójki drugi a trójki trzeci?
  • #11
    ukking
    Level 12  
    Fazi87 wrote:
    Mam pytanko, jakie komendy w kodzie bym musiał zmienić żeby układ po wciśnięciu powiedzmy jedynki zapalał tylko jeden kolor, dwójki drugi a trójki trzeci?


    Trochę by tego wyjaśniać. Na szybkiego stworzyłem dwa macro i dodałem taką opcję:

    Jeśli zapauzujesz sekwencję to wtedy używając przycisków na pilocie 1 do 7 możesz ustawić kolejno kolory:

    1 - czerwony
    2 - żółty
    3 - zielony
    4 - turkusowy
    5 - niebieski
    6 - różowo-fioletowy
    7 - biały

    Plik z programem w załączniku.

    Jeśli chcesz inne kolory to możesz edytować tą tabelę w kodzie:
    Code:
          ;static colours:
    
          
                ;   pwm      r      g      b      
    _col1   colour   .255,   .255,   .001,   .001
    _col2   colour   .255,   .160,   .160,   .001
    _col3   colour   .255,   .001,   .255,   .001
    _col4   colour   .255,   .001,   .160,   .160
    _col5   colour   .255,   .001,   .001,   .255
    _col6   colour   .255,   .160,   .001,   .160
    _col7   colour   .255,   .130,   .130,   .130


    Jeśli chcesz użyć również 0, 8 i 9, to musisz przypisać nowe przyciski do wykonywania funkcji: reset, pauza i tryb ręczny, dodać sprawdzanie tych przycisków tak jak w "func_20" w kodzie i dodać nowe wiersze w powyższej tabeli.
  • #12
    nerevarine
    Level 21  
    Przede wszystkim - bardzo udana konstrukcja. Gratuluję :)

    Chciałbym zapytać, czy zamiast diody RGB można podłączyć najzwyklejsze diody? Chciałbym wykonać taką lampkę jako listwę schowaną za łóżkiem ;)
    Musiałoby tam być tak conajmniej 45 diodek - 15 na kolor.
    Na pewno mocniejszy zasilacz, ale czy by działało bez problemów?

    Czy posiada Kolega może rysunek płytki? ;)
  • #13
    yogi009
    Level 43  
    Z tego, co widzę, to chyba jest płytka uniwersalna. Bardzo ciekawy projekt, dobry efekt przy małym nakładzie pracy. Nie jestem jeszcze obeznany z techniką procesorową. Czym programowałeś ten scalak ? Czy ew. wchodzi w grę zaprogramowanie tego PIC'a u Ciebie i wysyłka ? Podoba mi się ten projekt, już sobie wyobrażam zadowolenie kobiet :-)
  • #16
    Fazi87
    Level 24  
    kolego nerevarine stronka która podałeś opisuje programowanie procesorów avr a nie pic... programator piców mozna znaleść na alledrogo za ok 10 zł co nie jest dużym wydatkiem
  • #17
    nerevarine
    Level 21  
    Przepraszam za wprowadzenie w błąd i dziękuję za zwrócenie uwagi. Faktycznie - czytałem projekty Mirleya, projekty na picu i najwyraźniej niewłaściwie podałem info..

    I mała rehabilitacja ;) Dla tych, którzy oczywiście chcą wykonać programator samodzielnie :)
    http://hobby-elektronika.eu/programator.html
    http://radzio.dxp.pl/picprog/
  • #18
    ukking
    Level 12  
    nerevarine wrote:
    Przede wszystkim - bardzo udana konstrukcja. Gratuluję :)

    Chciałbym zapytać, czy zamiast diody RGB można podłączyć najzwyklejsze diody? Chciałbym wykonać taką lampkę jako listwę schowaną za łóżkiem ;)
    Musiałoby tam być tak conajmniej 45 diodek - 15 na kolor.
    Na pewno mocniejszy zasilacz, ale czy by działało bez problemów?

    Czy posiada Kolega może rysunek płytki? ;)


    Możesz tym sterować nawet żarówki. Zastosowane tranzystory powinny być wystarczające dla 15 diod na kanał pobierających 20mA każda (300mA na kolor). Powinieneś przeliczyć jakie rezystory będziesz musiał użyć szeregowo z diodami. Jeden rezystor na diodę.

    W projekcie użyłem płytki uniwersalnej bo schemat jest banalny ale jak będę miał czas to może szybko zaprojektuję płytkę drukowana.

    yogi009 wrote:
    ...Czym programowałeś ten scalak ? Czy ew. wchodzi w grę zaprogramowanie tego PIC'a u Ciebie i wysyłka ? Podoba mi się ten projekt, już sobie wyobrażam zadowolenie kobiet :-)


    Zaprogramowałem to przy pomocy programatora icd2. Przebywam w Anglii więc lepiej pewnie wyjdziesz jak poprosisz kogoś w Polsce o zaprogramowanie układu, albo zaopatrzysz sie w jakiś tani PIC programator.

    Kobieta była bardzo zadowolona bo juz nie musi z łóżka wstawać żeby lampkę wyłączyć :D.

    nerevarine wrote:
    Pytanie - czym można zastąpić TSOP2236? Może być TSOP4836?


    Jak najbardziej możesz użyć podanego odbiornika podczerwieni.
  • #20
    ukking
    Level 12  
    nerevarine wrote:
    ukking - taki mały offtop: w jakim programie przygotowałeś schemat? :)


    Schemat do postu na szybkiego zrobiłem w CadStar Express 12.
  • #21
    micc
    Level 13  
    Czy autor mógłby przerobić program na PIC16F628A, wydaje mi się że wystarczy tylko zmienić deklaracje procesora. Zrobił bym to sam ale nie mogę sobie poradzić ze skompilowaniem programu.
  • #22
    ukking
    Level 12  
    micc wrote:
    Czy autor mógłby przerobić program na PIC16F628A, wydaje mi się że wystarczy tylko zmienić deklaracje procesora. Zrobił bym to sam ale nie mogę sobie poradzić ze skompilowaniem programu.


    Program nie wymaga przerabiania. Poprostu załaduj plik *.hex i przy programowaniu wybierz PIC16F628A.

    Załączam też projekt płytki drukowanej (jeszcze jej sam nie wytrawiałem). Pełna plytka, albo uproszczona - bez przycisków i złącza ICSP.
  • #23
    tomek160191
    Level 11  
    Możesz napisać z czego ta obudowa(jakaś bibuła, plexi czy szkło?)
  • #24
    ukking
    Level 12  
    tomek160191 wrote:
    Możesz napisać z czego ta obudowa(jakaś bibuła, plexi czy szkło?)


    Szkielet drewniany oczywiście, od środka są białe plastikowe płyty na które przyklejonych jest kilka suszonych liści, wykończone czymś w stylu białej masy papierowej (ala bibułki).
  • #25
    kamil6_91
    Level 2  
    Witam. Mam pytanko czy dalo bys sie tak zaprogramowac lambke aby bylo tazke ustawione np. ze po jakims czasie sie wylacza samoczynnie?
  • #26
    ukking
    Level 12  
    kamil6_91 wrote:
    Witam. Mam pytanko czy dalo bys sie tak zaprogramowac lambke aby bylo tazke ustawione np. ze po jakims czasie sie wylacza samoczynnie?


    Dodałem taką opcję. Teraz po naciśnieciu "Program-" lampka będzie oczekiwać kodu z pilota przypisanego do jakiejś wartości timera.

    Przypisane czasy można edytować w poniższej tabeli:
    Code:
          ;state the sleep timer settings in minutes (10min steps)
    
    ;          |
    ;          |
    sleep_1   =   .10      ;10m
    sleep_2   =   .20      ;20m
    sleep_3   =   .30      ;30m
    sleep_4   =   .60      ;1h
    sleep_5   =   .120   ;2h
    sleep_6   =   .300   ;5h
    sleep_7   =   .720   ;12h


    Wartości są odpowiednio przypisane do przycisków 1 do 7. Zegar uśpienia można zdeaktywować naciskając "0". Można też wyjść z funkcji ustawiania timera bez zmiany żadnych ustawień przez ponowne naciśnięcie przycisku "P-".

    Usunąłem też kilka innych problemów jakie znalazłem i ustawiłem, że po zresetowaniu zasilania lampka przełączy się w stan uśpienia jeśli był on aktywowany przed wyłączeniem zasilania. W załączniku jest też rysunek obrazujący funkcje pilota.
  • #27
    micc
    Level 13  
    Cześć dałbyś rade dopisać do programu aby można było zapalać jeszcze białą diodę podłączoną do jakiegoś pinu?
  • #28
    ukking
    Level 12  
    micc wrote:
    Cześć dałbyś rade dopisać do programu aby można było zapalać jeszcze białą diodę podłączoną do jakiegoś pinu?


    Mniemam, że chodzi ci o kolejny kanał PWM, czy może chcesz osiągnąć jakiś inny efekt? Dodanie kolejnego kanału zmniejszyłoby częstotliwość podstawy PWM, przez co mogłoby być widoczne migotanie diod. Nie obeszłoby się więc bez podwyższenia częstotliwości taktowania. Ustawienia timerów do dekodowania sygnałów z pilota mysiałyby być zmienione w zależności od częstotliwości użytego kryształu. Trochę zachodu ale wykonalne.
  • #29
    micc
    Level 13  
    Nie chodzi mi o pwm, chodzi mi tylko aby można było ją gasić i zapalać. Chciałem aby to była też zwykła lampka taka do oświetlania. I najlepiej jak byś mógł to żeby ten led był pod pinem "RA2"
  • #30
    ukking
    Level 12  
    micc wrote:
    Nie chodzi mi o pwm, chodzi mi tylko aby można było ją gasić i zapalać. Chciałem aby to była też zwykła lampka taka do oświetlania. I najlepiej jak byś mógł to żeby ten led był pod pinem "RA2"


    Spróbuj tego. Pin RA2 jest przełączany przyciskiem na pilocie "1" kiedy lampka jest w trybie normalnym lub wyłączona. Nie testowałem kodu więc jak będą jakieś problemy to pisz.

    22.02.2011.
    Zmieniłem załącznik bo zauważyłem że nie skonfigurowałem pinu RA2 prawidłowo.
    Attachments: