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.

Lampki choinkowe sterowane mikrokontrolerem

mrrudzin 15 Dec 2007 17:24 24888 30
  • Lampki choinkowe sterowane mikrokontrolerem Święta coraz bliżej. Często na zewnątrz wieszamy lampki choinkowe. Te albo świecą ciągle, albo mrygają niemiłosiernie. Najgorsze są te które niedość że mrygają, grają jeszcze oklepane melodyjki za pomocą blaszki pizeo.
    Coś efektowniejszego przeważnie kosztuje troche więcej, a sterownik przeważnie nie jest przystosowany do pracy na "świeżym powietrzu".

    Mam dosyć dużą choinkę przed domem, postanowiłem ją udekorować. Skoro chińczycy mogą robić mrygające lampki - czemu my nie możemy?
    Z powodu braku czasu i małej liczby elementów urządzenie zostało zmontowane na płytce uniwersalnej, no i niestety nie powstała jeszcze obudowa.

    Pomysł:
    W jak najprostszy sposób płynnie zapalać i gasić trzy łańcuchy lampek.

    Realizacja:
    Mikrokontroler ATMEGA8, trzy optotriaki MOC3021, trzy triaki BT-600.

    Aby płynnie sterować jasnością świecenia żarówek niezbędne jest sterowanie fazowe.
    W skrócie:
    sterujemy triakiem, zasilamy go prądem przemiennym. Jeśli włączymy triak, będzie on załączony (niezależnie od stanu na elektrodzie sterującej) do momentu przejścia prądu przez zero. Także jedyną możliwością jest sterowanie momentem (kątem) włączenia triaka. Inaczej mówiąc czekamy aż prąd przejdzie przez zero (bo wcześniej tyrystor - jeśli był włączony to dalej jest) i od tego momentu odliczamy czas zależny od tego na jaką część półokresu chcemy włączyć triak.

    Lampki choinkowe sterowane mikrokontrolerem

    Zatem aby posterować takim triakiem niezbędna jest informacja kiedy prąd przeszedł przez zero. Ponieważ żarówka jest obciążeniem o charakterze rezystancyjnym, prąd jest w fazie z napięciem. Zatem badając przebieg napiecia możemy jednoznacznie powiedzieć od kiedy należy liczyć wspomniany wcześniej czas.

    Układ zasilam z ładowarki od Nokii (tej transformatorowej). Ponieważ w środku nie ma żandego kondziołka, można bezpośrednio za pomocą napięcia z niej posterować tranzystorem od synchronizacji. Sygnał z kolektora podaje na wejście INT0 Atmegi (która ma ustawione przerwanie przy opadającym zboczu sygnału). Reszta układu jest zasilana z tego samego mostka. Ponieważ np 7805 wymaga jakiegoś kondensatora na wejściu (wygładzenia napięcia) odseparowałem reszte układu od napięcia wyprostowanego dwupołówkowo (niezbędnego do synchronizacji) za pomocą diody prostowniczej.

    Lampki choinkowe sterowane mikrokontrolerem


    Na wyjściu aby uzyskać separację galwaniczną zastosowałem takie rozwiązanie:
    Lampki choinkowe sterowane mikrokontrolerem
    Aby uzyskać odpowiedni prąd wyzwalania optotriaka R8 = 330ohm.
    Całość zabezpieczona bezpiecznikiem 2A. Triaki dostały wspólny radiator. Jest dużo za duży, ale taki miałem pod ręką. Układ zabezpieczyłem wyłącznikiem różnicowo prądowym 30mA (na wszelki wypadek).

    Dodatkowo na wyjściach podłączyłem diody LED przydatne podczas uruchamiania układu.

    Program:
    Program sterujący urządzeniem jest stosunkowo prosty. W momencie wykrycia opadającego zbocza wyzwalane jest przerwanie. Kod w przerwaniu odlicza odpowiedni czas i załącza wyjście uP (a więc i optotriak...)
    W opisywanym przypadku steruje trzema wyjściami. Nie widze jednak przeciwwskazań, żeby zrobić układ sterujący n wyjściami. Wystarczy pokopiować blok odpowiedzialny za sterowanie danym wyjściem (// Obsluga X lancucha w programie). Listning programu pod spodem

    Zdjęcia układu:

    Lampki choinkowe sterowane mikrokontrolerem

    Lampki choinkowe sterowane mikrokontrolerem

    Lampki choinkowe sterowane mikrokontrolerem



    Film pokazujący jak działają lampki :)






    Code:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>

    long int LANCUCH1=500; // okresla jasnosc swiecenia 1 lancucha
    long int LANCUCH2=4432; // okresla jasnosc swiecenia 2 lancucha
    long int LANCUCH3=4432; // okresla jasnosc swiecenia 3 lancucha

    int licznik=0;

    int wyjdz=0; // zmienna pomocnicza do petli w przerwaniu
    int wyjdz1=0;
    int wyjdz2=0;
    int wyjdz3=0;
    int kierunek1=1; // okresla zmiane jasnosci (jasniej / ciemniej) 1 lancucha
    int kierunek2=1; // okresla zmiane jasnosci (jasniej / ciemniej) 1 lancucha
    int kierunek3=-1; // okresla zmiane jasnosci (jasniej / ciemniej) 1 lancucha

    int predkoscA=150; //okresla predkosc zmian jasnosci w pierwszym zakresie
    int predkoscB=15;   //okresla predkosc zmian jasnosci w drugim zakresie
    int predkoscC=5;   //okresla predkosc zmian jasnosci w trzecim zakresie


    #define LAN1ON sbi(DDRB,PB1); sbi(PORTB,PB1); //makro wlacz lancuch pierwszy
    #define LAN1OFF sbi(DDRB,PB1); cbi(PORTB,PB1); //makro wylacz lancuch pierwszy

    #define LAN2ON sbi(DDRB,PB2); sbi(PORTB,PB2);
    #define LAN2OFF sbi(DDRB,PB2); cbi(PORTB,PB2);

    #define LAN3ON sbi(DDRB,PB3); sbi(PORTB,PB3);
    #define LAN3OFF sbi(DDRB,PB3); cbi(PORTB,PB3);

    SIGNAL (SIG_INTERRUPT0)
    {
    TCNT1=0; //wyzeruj licznik

    do
    {
    //   Obsluga 1 lancucha
       if(TCNT1>=LANCUCH1&&wyjdz1==0) //jesli timer naliczy tyle zeby wlaczyc lancuch
       {
       LAN1ON; //wlacz diode
       wyjdz1=1;//wyjdz (dioda wlaczona, wiec mozna stad uciec)
       
       
       //kod oblicza po jakim czasie ma zostac wlaczona dioda
       //poniewaz jasnosc swiecenia zalezy od kwadratu napiecia
       //a my chcemy zmieniac jasnosc, zalozono pewna aproksymacje krzywej nieliniowej
       //za pomoca trzech prostych o roznych nachyleniach (predkoscX)
       //zmienna kierunek okresla w ktora strone bedziemy sie poruszac po krzywej
       if(LANCUCH1<=500) kierunek1 = 1;
       if(LANCUCH1>=7150) kierunek1 = -1;
       if(LANCUCH1>=0 && LANCUCH1<1000) {LANCUCH1=LANCUCH1+predkoscA*kierunek1;}
       if(LANCUCH1>=1000 && LANCUCH1<5000) {LANCUCH1=LANCUCH1+predkoscB*kierunek1;}
       if(LANCUCH1>=5000 && LANCUCH1<10000) {LANCUCH1=LANCUCH1+predkoscC*kierunek1;}
       }
       
    //   Obsluga 2 lancucha
       if(TCNT1>=LANCUCH2&&wyjdz2==0) //jesli timer naliczy tyle zeby wlaczyc lancuch
       {
       LAN2ON; //wlacz diode
       wyjdz2=1;//wyjdz (dioda wlaczona, wiec mozna stad uciec)
       
       
       //kod oblicza po jakim czasie ma zostac wlaczona dioda
       //poniewaz jasnosc swiecenia zalezy od kwadratu napiecia
       //a my chcemy zmieniac jasnosc, zalozono pewna aproksymacje krzywej nieliniowej
       //za pomoca trzech prostych o roznych nachyleniach (predkoscX)
       //zmienna kierunek okresla w ktora strone bedziemy sie poruszac po krzywej
       if(LANCUCH2<=500) kierunek2 = 1;
       if(LANCUCH2>=7150) kierunek2 = -1;
       if(LANCUCH2>=0 && LANCUCH2<1000) {LANCUCH2=LANCUCH2+predkoscA*kierunek2;}
       if(LANCUCH2>=1000 && LANCUCH2<5000) {LANCUCH2=LANCUCH2+predkoscB*kierunek2;}
       if(LANCUCH2>=5000 && LANCUCH2<10000) {LANCUCH2=LANCUCH2+predkoscC*kierunek2;}
       }
       
    //   Obsluga 3 lancucha
       if(TCNT1>=LANCUCH3&&wyjdz3==0) //jesli timer naliczy tyle zeby wlaczyc lancuch
       {
       LAN3ON; //wlacz diode
       wyjdz3=1;//wyjdz (dioda wlaczona, wiec mozna stad uciec)
       
       
       //kod oblicza po jakim czasie ma zostac wlaczona dioda
       //poniewaz jasnosc swiecenia zalezy od kwadratu napiecia
       //a my chcemy zmieniac jasnosc, zalozono pewna aproksymacje krzywej nieliniowej
       //za pomoca trzech prostych o roznych nachyleniach (predkoscX)
       //zmienna kierunek okresla w ktora strone bedziemy sie poruszac po krzywej
       if(LANCUCH3<=500) kierunek3 = 1;
       if(LANCUCH3>=7150) kierunek3 = -1;
       if(LANCUCH3>=0 && LANCUCH3<1000) {LANCUCH3=LANCUCH3+predkoscA*kierunek3;}
       if(LANCUCH3>=1000 && LANCUCH3<5000) {LANCUCH3=LANCUCH3+predkoscB*kierunek3;}
       if(LANCUCH3>=5000 && LANCUCH3<10000) {LANCUCH3=LANCUCH3+predkoscC*kierunek3;}
       }
             
       //zabezpieczenie na wypadek przekroczenia zakresu
       if(TCNT1>=7200) {wyjdz=1;}
       
       
    if(wyjdz1==1 && wyjdz2==1 && wyjdz3==1) wyjdz=1;   //jesli wszystkie lancuchy zostana obsluzone, uciekamy
    }
    while(wyjdz==0);

    //Przygotowanie zmiennych do obslugi nastepnego przerwania
    wyjdz=0;
    wyjdz1=0;
    wyjdz2=0;
    wyjdz3=0;

    //Sterujemy triakami, wiec wyjscia mozna wylaczyc, bo i tak triak wylaczy sie przy przejsciu pradu przez 0
    LAN1OFF;
    LAN2OFF;
    LAN3OFF;
    }


    int main()
    {

    // Definicje do timera
    TCNT1 = 0xFF00;        // wartość początkowa T/C1
    TCCR1A = 0x00;        // włącz tryb czasomierza T/C1
    TCCR1B = _BV(CS10);// preskaler clk


    //Deklaracja zmiennych i stalych

       
      GIMSK = _BV(INT0); //włącz obsługę przerwań Int0
      MCUCR = _BV(ISC01);   // włącz generowanie przerwań przez
                            // opadające zbocze na Int0
      sei();                // włącz obsługę przerwań   
       
       while(1)
       {   

       }



    return 0;
    }
    [/youtube]

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    mrrudzin
    Level 39  
    Offline 
    Has specialization in: automatyka
    mrrudzin wrote 5864 posts with rating 515, helped 515 times. Live in city Pruszcz Gdański. Been with us since 2003 year.
  • #2
    Uszol 1990
    Level 29  
    Witam :)
    Bardzo fajny projekcik :D
    Może zapodasz filmik z działania ?
    Ciekawy jestem jak to działa :D
    Pozdrawiam
  • #3
    sk700
    Level 31  
    Konstrukcja prosta, lecz przydatna.
    Całość można zrobić na mniejszej płytce i wpakować do gniazda zespolonego czy jak to sie nazywa (popularne przedłużacze z kilkoma gniazdami).
    A co ten czarny kabel koło 7805 taki przytrzaśnięty tym rezystorem? Zabezpieczenie przed wyrwaniem?
  • #4
    mrrudzin
    Level 39  
    Quote:

    A co ten czarny kabel koło 7805 taki przytrzaśnięty tym rezystorem? Zabezpieczenie przed wyrwaniem?

    Dokładnie :)
    Często przewód można wyrwać, albo po prostu może się ułamać.

    Oczywiście całość można upakować. Płytkę taką miałem pod ręką, podstawki, rezystory i radiator jak widać też.

    Film postaram się jutro nakręcić i wrzucić.

    Zapomniałem dodać że do sterowania czasem włączenia (po co ma świecić w nocy czy w dzień gdy nikogo nie ma) używam programatora czasowego.
    W przyszłości warto byłoby dokleić do układu kość RTC i korzystać z niej.
  • #5
    Karol_17
    Level 10  
    no fajny projekt i przydatny :)
    aa można prosic o linka jak to działa ??:D
    pozdor :)
  • #7
    żarówka rtęciowa
    Level 37  
    Witam.

    Czy cały ten układ posiada filtr przeciwzakłóceniowy?
  • #9
    żarówka rtęciowa
    Level 37  
    Filtr taki składa się z dławika nawiniętego na rdzeniu blaszanym EI36/12,8 (można go odzyskać z transformatora TS2/xx) oraz kondensatora 0,22uF 275V AC. Filtry takie są stosowane w ściemniaczach produkcji Polamp.
  • #10
    max14
    Level 12  
    fajny pomysł, ciekawy ale najciekawszy to ten pomysł żeby kabel przytrzymać rezystorem
  • #12
    d.d
    Level 20  
    witam
    jako że czasu mało a ja niedawno postanowiłem zrobić taki sterownik więc zdecydowałem że na razie wykorzystam kod podany wyżej.
    no i mam pewien problem wszystko ładnie działa tylko że lampki nie osiągają nawet 70% jasności.
    zmieniałem w programie wartości odpowiedzialne za jasność ale to nic nie daje .
    co ciekawe jak podłączam programator to lampki migają szybciej ale i z maksymalną jasnością .
    nie bardzo znam się na triakach i nie wiem co jest nie tak.
    czy autor projektu sprawdził jak układ działa w praktyce ??.
  • #13
    mrrudzin
    Level 39  
    Tak, układ działa, a lampki świecą od pełnej jasności do lekkiego żarzenia.
    Problem z programatorem zauważyłem i u siebie. Szukałem błędu w programie, a głupienie "znikło" gdy odłączyłem programator.

    Zrobiłeś dokłądnie tak jak w opisie? Może masz jedną diodę z trafa (prostownik jednopołówkowy) i wykrywasz co drugie przejście prądu przez zero?

    Dzisiaj postaram się w końcu zebrać i wrzucić film jak to działa.
  • #14
    d.d
    Level 20  
    Chyba już rozumiem o co chodzi .
    W ładowarce od Noki jest prostownik plus ma iść do sterowania tranzystora i dalej przez diodę do stabilizatora .
    Zbytnio sugerowałem się obrazkiem i do sterowania podałem prąd zmienny z przed mostka .

    podłączyłem tak jak ma być i wszystko działa
    zrobiłem kilka sekwencji świecenia i co chwile mi się zmienia wygląda naprawde super
  • #15
    mrrudzin
    Level 39  
    :)
    Wrzuć listningi programów - może się komuś przyda :)

    Planuje rozbudować układ - dać jakiś LCD i dołożyć możliwość programowania czasu włączenia (obecnie urządzenie jest włączane za pomocą "gniazdka programowalnego"...
    Ale to już w przyszłym roku chyba :)
  • #16
    Uszol 1990
    Level 29  
    hehe :) nowy rok za niedługo :D
    Będzie filmik ? Jestem ciekawy jak to wygląda :)
    Pozdrawiam i wesołych świąt :P
  • #17
    mrrudzin
    Level 39  
    Przepraszam, wypadło mi z głowy :)
    Film jest, niestety kręcony aparatem. Aparat przeszedł w tryb "nocny" bo było dosyć ciemno, więc film jest czarnobiały, ale to co najważniejsze widać :)

    Ja również życze wszystkim wesołych świąt.

  • #18
    Uszol 1990
    Level 29  
    Dość ładnie to wygląda :D
    A dało by się sterować z tego układu 8 kanałów przez RS232 z regulacją jasności ?
    Ewentualnie czy kolega mógłby pomóc coś takiego zrealizować :D ?
    pozdrawiam :P
  • #19
    mrrudzin
    Level 39  
    Myśle że napewno dałoby się. Ilość kanałów jest ograniczona jedynie ilością wyjść procesora. Nie dłubałem jeszcze przy komunikacji szeregowej, ale teoretycznie jest to do zrealizowania (w wolnej chwili pewnie się pokusze) - moim zdaniem wystarczy przesyłać do procesora ciąg liczb, z których każda będzie jasnością kolejnego kanału - i tak w kółko. Ewentualnie jakiś sygnał zwrotny z procesora, że dostał pakiet danych.
    Może któryś z kolegów ma większe doświadczenie z komunikacją szeregową i napisze gdzie mogą czychać ewentualne pułapki?
  • #22
    wedzik
    Level 9  
    Mam problem ze zrozumieniem kilku kwestii, a mianowicie:


    LAN1ON; //wlacz diode
    wyjdz1=1;//wyjdz (dioda wlaczona, wiec mozna stad uciec)


    //kod oblicza po jakim czasie ma zostac wlaczona dioda
    ja - jak to oblicza po jakim czasie ma zostac wlaczona jak wlasnie ja zapalilismy (LAN1ON) ?
    //poniewaz jasnosc swiecenia zalezy od kwadratu napiecia
    //a my chcemy zmieniac jasnosc, zalozono pewna aproksymacje krzywej nieliniowej
    //za pomoca trzech prostych o roznych nachyleniach (predkoscX)
    //zmienna kierunek okresla w ktora strone bedziemy sie poruszac po krzywej
    ja - ciezko mi to sobie wyobrazic. Moze moglby ktos sprobowac to bardziej wyjasnic.

    Rozumiem jak dziala program, ale mam problem ze zrozumieniem dzialania układu, a raczej mechanizmu sterowania jasnoscia. Rozumiem układ tak jakby lampki mialy sie tylko zapalac i gasnac Mikrokontroler zapala diode, ta przez optotriaka załacza triak i lampki sie zapalają (bez stopniowego rozjasniania i gaszenia). Prosze o wyjasnienie.
  • #23
    mrrudzin
    Level 39  
    Lampki choinkowe sterowane mikrokontrolerem

    Cały fenomen układu polega na tym że triak jest elementem który możemy włączyć, ale nie możemy wyłączyć. Wyłącza się on samoistnie przy przejściu prądu przez zero (więc 100 razy na sekundę).
    Dlatego wywołujemy przerwanie gdy mamy zero prądu i od tego czasu liczymy czas. Im później włączymy tyrystor - tym mniej sinusoidy zostanie "załączone" na żarówkę. Całość obrazuje powyższy rysunek.
  • #24
    wedzik
    Level 9  
    Czy moglbys zalaczyc schemat układu ?
  • #25
    wedzik
    Level 9  
    Proszę o głębsze wyjaśnienie działania tego układu :

    Lampki choinkowe sterowane mikrokontrolerem

    Dlaczego nie mozna podac napiecia zmiennego bezposrednio przez duzy rezystor na noge INT0? Prosze o wyjasnienie.
  • #27
    ciko
    Level 12  
    Czy ta dioda na schemacie to zwykłą dioda prostownicza?
    i drugie pytanie czy po wyjściu z ładowarki ma być napięcie zmienne czy stałe?

    Pozdrawiam, OKIC
  • #28
    matys188
    Level 10  
    Ta dioda to zwykła dioda prostownicza. Na wyjściu z ładowarki powinna być wyprostowana sinusoida:
    Lampki choinkowe sterowane mikrokontrolerem
    czyli wyrzucasz kondensatory a zostawiasz tylko mostek prostowniczy. W ten sposób na wyjściu tranzystora będziesz miał impulsy prostokątne generujące przerwanie co 10ms
  • #29
    bartchez
    Level 9  
    Witam
    Wiem że trochę czasu minęło ale może ktoś jeszcze odpowie.
    Zrobiłem schemat sterowania triaka z postu jednak coś nie działa. Triak dziwnie się zachowuje, chyba najlepiej wyjaśni to odczyt z oscyloskopu. To nagłe załamanie sinusoidy to własnie moment podania impulsu na bramkę, czy ktoś wię dlaczego się tak dzieje ???
    Lampki choinkowe sterowane mikrokontrolerem
  • #30
    eneuro
    Level 11  
    Pytanie tylko czy aby na tym schemacie z tego postu triak jest dobrze podłaczony?
    Lampki choinkowe sterowane mikrokontrolerem

    Ale skoro wszystkim działa, to może to poniżej będzie pomocne do sprawdzenia podłączenia triaka.

    Dla mnie "guru" w temacie układów wykonawczych na triakach to np.: Uklad wykonawczy Firley'a

    Schemat ukladu wykonawczego Firley'a na MOC3041 (na pewno z wykrywaniem 0 i prąd sterowania 15mA ale powinny chyba działać przy 5mA):
    Lampki choinkowe sterowane mikrokontrolerem

    Po zmontowaniu wygląda to jak poniżej i widać, że po zmontowaniu noga A2 triaka jest podłączona przez opornik 220 do pinu 6 MOCa, a G do pinu 4 MOC3041 i to jest OK,
    bo na schemacie triaka i datascheet (np. BTA16 widoczny z przodu z nogami (od lewej) A1A2G ) jest jako:
    A2
    |
    V/\
    | \
    A1 G
    Natomiast tutaj nieco inaczej to narysowano w tym poście....

    Wygląd układów wykonawczych Firley'a:
    Lampki choinkowe sterowane mikrokontrolerem

    Nie chciałbym uwalić "triaka", więc chyba układ wykonawczy Firley'a z wersji 3 fazowej jest ładny z radiatorami i zabezpieczony warystorem dodatkowo na triaku BTA (z izolowaną obudową) z możliwością uziemnienia radiatora:
    Lampki choinkowe sterowane mikrokontrolerem

    ps:
    Zabieram się do sterowania (spowolnienia) wentylatora pieca CO na 230VAC w momencie kiedy sterownik załacza wentylator
    (oczywiście nieco inny układ wykonawczy z gasikiem i dodatkowym rezystorem zastosuję jak z dokumentacji MOC3041 - dodatkowo warystor oraz triaka BTA16 z izolowaną obudową, którego radiator będzie można podłączyć do uziemnienia - BT136 mają nogę A2 z prądem na "top" na blaszce do przymocowania radiatora !!!! )

    Ktoś wie gdzie takie "gotowce" płytki PCB do lutowania elementów jak w tym poście od ręki mozna dostać? Nie chce mi się do prostych układów bawić z termotransferem i wytrawianiem....
    Lampki choinkowe sterowane mikrokontrolerem