joi, 2 decembrie 2010

Lampă ambientală cu LED-uri RGB


Încă din facultate mă gândeam să fac un montaj cu led-uri RGB, dar întotdeauna s-a găsit altceva mai bun de făcut. Acum în schimb, aveam nevoie de o lampă de pus pe noptieră şi cum vroiam ceva făcut de mine m-am hotărât să încerc să mă joc puţin cu led-urile RGB. Pentru început mi-am făcut un plan sumar. Vroiam o modalitate cât mai simplă de a schimba culoarea şi intensitatea luminii. Nu am vrut ca lampa să-şi schimbe culoarea singură, după o secvenţă prestabilită sau aleatoare, aşa că am decis să folosesc două potenţiometre pentru controlul culorii şi al intensităţii. După ce îmi era cât de cât clar ce anume vroiam să fac, am început să mă gândesc la schema electronică. Pentru a fi uşor de depanat în caz de probleme, am ales o schemă simplă, cu cât mai puţine piese.
Am avut nevoie de următoarele componente:

  • un microcontroller ATtiny13A
  • 3 LED-uri RGB de putere (HPB8F-4K3RGB/W)
  • 3 tranzistoare BC337
  • 2 potenţiometre de 4.7 K Ω
  • o sursă stabilizatoare 7805
  • o sursă stabilizatoare 7812
  • un condensator 1000 uF/25V
  • 3 rezistenţe de 470 Ω
  • 1 rezistenţă de 1K Ω
  • 4 rezistenţe de 10 Ω
  • un alimentator de 12V/1A
  • un radiator de CPU
  • o lampă (nefolosită)

  • În cele din urmă, a ieşit schema următoare:

    Partea de alimentare, ce nu e prezentă în schemă, e un alimentator de 12V / 1A, cumpărat din piaţă. După ce am făcut nişte măsurători, am văzut că la un curent de aproximativ 200 mA, alimentatorul scoate 14V, iar la un curent de 1A, scoate cam 11V.
    Rolul stabilizatorului 7812 este de a asigura o tensiune de alimentare pentru leduri cât de cât constantă. Dacă tensiunea care cade pe rezistenţa ce limitează curentul prin LED-uri, nu variază în sus, nici curentul nu va varia în sus. Ştiind că tensiunea de alimetare pentru LED-uri nu o să depăşească 12V, am putut face şi calculele mai uşor. Am folosit un mic radiator pentru 7812, deoarece prin acesta trece la un moment dat un curent de aproximativ 1A. Folosirea unui 7812 nu e cea mai bună abordare pentru cazul în care tensiunea dată de alimentator e sub 13V. În acest caz stabilizatorul nu-şi mai poate face treaba şi ajunge să scoată o tensiune mai mică de 12V. Soluţia asta asigură, cel puţin, că ledul roşu va fi protejat de un curent prea mare.

    Limitarea curentului a fost făcută folosind rezistenţe de valori diferite în funcţie de culoarea LED-urilor. Motivul este că tensiunile de deschidere / funcţionare ale LED-urilor diferă în funcţie de culorile acestora. Astfel pentru un LED-urile verzi şi albastre, tensiunea de funcţionare e de 3.6V pe când pentru roşu e de 2.3V la un curent continuu de 350 mA. Valorile rezistenţelor au fost pe jumătate calculate, pe jumătate încercate (atunci când calculele mele au dat greş). Astfel, pentru rezistenţa de pe linia de roşu cu R7 = 20 Ω, curentul ce va trece prin LED-uri va fi de aproximativ 200 mA, iar pentru verde R6 şi albastru R5 am ales rezistenţe de 10 Ω. Din cauză că pe rezistenţa R7 se disipă aproximativ 1W, am ales să pun două rezistenţe de câte 10 Ω / 0.5W în serie.

    Montajul e alimentat la 12V cu ajutorul sursei. Tensiunea de 5V necesară funcţionării microcontroller-ului este dată de 7805. Rolul condensatorului electrolitic este de a filtra tensiunea de alimentare. Din tensiunea de 5V se alimentează şi potenţiometrele care au pinul cursor legat la câte o intrare a ATtiny13-ului. ATtiny13 va comanda cele trei tranzistoare, care la rândul lor vor comanda LED-urile. Fiecare tranzistor va controla câte o culoare din cele trei de bază (Roşu, Verde, Albastru). LED-urile sunt legate în serie pentru a avea un consum de curent mai mic şi pentru că tensiunea de 12V permite o astfel de configuraţie.
    Piesele au fost lipite pe o plăcuţă de test, folosind fie cabluri, fie cositor în exces, aşa că nu am un cablaj (făcut în Eagle) la montajul ăsta, pe care să-l pot prezenta.
    Partea "mecanică"
    Am început prin a fixa led-urile de un radiator de CPU. Între fiecare placuţă de aluminiu a led-urilor şi radiator am pus o picătură de pastă termoconductoare, pentru a îmbunătăţi transferul termic. Curentul total ce trece prin led-uri e destul de mare, aşa că prezenţa radiatorului e binevenită. Funcţionarea la temperatură ridicată scurtează foarte mult durata de viaţă led-urilor, aşa că e indicată folosirea unui radiator (de orice fel) pentru disiparea căldurii.


    Cu un mic burghiu am făcut puţin loc pentru un şurub care fixează "piciorul" radiatorului. De aceelaşi şurub am prins şi placuţa cu toată electronica montajului. Între placă şi radiator am pus o piuliţă ca să mă asigur că spatele cablajului nu o să atingă radiatorul.

    "Piciorul" radiatorului e folosit pentru a prinde ledurile de corpul lămpii, printr-un şurub.

    De pe placuţă ies opt cabluri: câte trei cabluri (+5V, cursor şi GND) pentru fiecare potenţiometru şi două cabluri ce merg la alimentator (+14V şi GND). Potenţiometrele sunt prinse de corpul lămpii cu ajutorul a două bucăţi de carton alb decupat, înfăşurate la ambele capete ale barei de jos a lămpii.

    Fiecare potenţiometru e conectat la placă prin 3 cabluri: firul roşu (+5V), firul negru (GND) şi cel maro (cursorul potenţiometrului). În această configuraţie, potenţiometru va juca rolul unui divizor de tensiune reglabil. Astfel voi putea controla tensiunea ce va ajunge la microcontroller, în limitele 0 - 5 V.

    Între cablul de alimentare ce iese de pe plăcuţă şi cablul ce vine de la alimentator am pus un întrerupător. Întrerupătorul e confecţionat din vechiul cablu al lămpii, pe care l-am scurtat puţin, şi i-am adăugat nişte mufe mamă-tată care să se potrivească cu mufele lămpii şi a alimentatorului.
    Şi cu asta lampa e terminată, numai bună de pus pe noptieră...

    Modul de funcţionare
    Microcontroller-ul citeşte valorile celor două potenţiometre şi obţine nivelul intensităţii luminii şi culoarea aleasă. În funcţie de culoarea aleasă, microcontroller-ul va genera trei semnale modulate în lăţime de impuls (PWM) pentru cele trei culori ale LED-urilor, astfel încât din combinaţia de Roşu, Verde şi Albastru să se obţină culoarea dorită şi intensitatea dorită. Frecvenţa PWM-ului este de aproximativ 300 Hz.


    În cele două filme se poate vedea cum se reglează culoarea şi intensitatea luminii. Din cauză că rezistenţa de limitare pentru ledul roşu e puţin mai mică decât echivalentul pentru verde şi albastru, culoarea roşie e dominantă. De aceea lumina albă are o tentă rozalie. Din aceelaşi motiv, la intensitate minimă culoarea tinde spre roz. Programul va ţine toate cele trei culori de bază la un minim diferit de zero, dar, cum roşu e dominant, lumina va fi tinde spre un roşu (sau roz) şters.

    Algoritmul este prezentat mai în detaliu aici.
    Fişierele *.c şi *.hex se găsesc aici...
    Programatorul de microcontrolere
    Pentru a putea programa microcontroller-ul m-am folosit de interfaţa pentru portul paralel de la PonyProg, împreună cu un mic montaj pentru testare, iar pentru a scrie codul am folosit AVRStudio. Foarte util pentru a găsi greşeli în algoritm mi s-a părut simulatorul oferit de AVRStudio.

    Am ales să nu montez pinii de programare direct pe placa ce vine montată în lampă, pentru a nu încărca prea mult placa cu cabluri (am folosit cabluri în loc de trasee). Se poate observa din pozele de mai jos că nu prea mi-am dat silinţa să fac ceva elegant. Am ales să fac ceva rapid şi care să meargă. Din moment ce pe plăcuţa asta sunt montate un led şi un potenţiometru, se poate spune că e vorba de o placă rudimentară de dezvoltare (glumesc, desigur) :P...

    Interfaţa PonyProg, pentru portul paralel, am împrumutat-o de la cineva care se pricepe să facă cablaje frumoase :P. Schema interfeţei se poate găsi pe net pentru cine vrea să-şi facă aşa ceva, în cazul în care are port paralel la PC. Oricum se găsesc multe scheme şi pentru interfaţa serială, trebuie doar căutat.

    Ce probleme am avut?
    1. Microcontroller-ul nu făcea mai nimic din ce trebuia să facă... LED-urile pâlpâiau în continuu, iar potenţiometrele nu aveau nici un efect.
    Problema a fost că nu am declarat "static volatile" nişte variabile globale.
    2. Puteam regla culoarea din potenţiometre, dar lumina pâlpâia puternic.
    Problema a fost că oscilatorul intern era setat pe 1.2 MHz, adică oscilatorul de 9.6 MHz avea selectat prescalerul CLK8 (divizorul de frecvenţă setat pe 8).
    3. Când m-am apucat de montaj am ales să nu lipesc şi condensatorul de filtraj, deoarece am considerat (greşit) că stabilizatorul 7805 o să-şi facă treaba să ţină tensiunea fix la 5V. Rezultatul a fost că aveam un tremur uşor al culorii care se accentua pe măsură ce scădeam luminozitatea, cauzat probabil de semnalul PWM care are aproximativ 300 Hz.
    Problema a fost rezolvată adaugând condensatorul de filtraj la ieşirea din 7805. Pentru siguranţă, am adaugat şi în cod o măsură de protecţie la bruiaj. Înainte de a schimba valoarea PWM-ului, fac 50 de măsurători la fiecare potenţiometru, iar media măsurătorilor va fi valoarea nouă pentru PWM. În felul ăsta se vor filtra şi eventualele erori de conversie.
    4. Tot la început nu aveam montat stabilizatorul 7812 între alimentare şi leduri, aşa că tensiunea pe rezistenţele de limitare şi implicit curentul prin leduri varia destul de mult. În cazul în care o culoare era predominantă, prin ledul corespondent trecea un curent mai mare decât cel normal, iar rezistenţa de limitare se înfierbânta. Tensiunea dată de alimentator era puţin mai mare de 14 V în gol şi scădea pe măsură ce creştea curentul în circuit. Astfel, cu toate ledurile aprinse, tensiunea scădea până pe la 11V, când curentul se apropia de 1A.
    Soluţia mea a fost să adaug stabilizatorul 7812 pentru a nu mai fi în situaţia de a avea 14V la alimentare cu un singur led aprins, ce are o rezistenţă de limitare calculată pentru 12V. Asta face ca tensiunea de alimentare să fie mai mică de 12V mai tot timpul, dar mai bine aşa decît să se strice ledurile.
    5. Dacă potenţiometrul de culoare era dat la maxim, lumina (albă) începea să pâlâie pentru scurt timp, după care scădea în intensitate. Asta se întâmpla doar dacă potenţiometrul de culoare era rotit spre punctul de maxim.
    Problema era cauzată de felul în care se făcea media conversiilor precedente. Când se calcula noua medie, în loc să se pornească de la zero, se pornea de la valoarea mediei precedent calculate. Din cauza asta suma celor 50 de conversii depăşea valoarea maximă ce se poate stoca pe 16 biţi, iar asta cauza pâlpâitul. Soluţia a fost să consider prima conversie din seria celor 50 de conversii ca fiind media calculată precedent.
    Au mai fost şi probabil că încă mai sunt probleme, fie la partea electronică, fie la programare, dar deocamdată se pare că totul merge bine.

    17 comentarii:

    1. Salut!

      Daca tot ai legat acolo un uC cu niste LEDuri, ai putea pune o secventa random care sa aprinda LEDurile, tot random :). Ce poti face cu niste LEDuri care se aprind aleatoriu? Gandeste-te cum s-ar vedea din strada asa ceva: ar fi ca si cum cineva se uita la TV si se vad luminile respective, adica in caz ca pleci de acasa, poate da impresia ca e cineva acolo si se uita la TV, eventualii hoti fiind pacaliti ca e cineva in casa.

      RăspundețiȘtergere
    2. Salut Cătălin!
      Merci de sugestie. Aş putea să declanşez secvenţa aleatorie în momentul în care unul din potenţiometre e la minim, iar celălalt e la maxim...
      Numai bine!

      RăspundețiȘtergere
    3. salut,
      ma numesc edy.
      foarte util blogul tau. l-am citit pe tot.
      ar fi interesant daca ai face si un generator eolian.
      multumiri ca imartasesti experintele tale.

      RăspundețiȘtergere
    4. Salut Edy,
      Întradevăr ar fi interesant un generator eolian, doar că pentru a face aşa ceva bănuiesc că e nevoie de ceva mai mult spaţiu. Deocamdată nu ştiu cum aş putea face asta într-un apartament, ce-i drept nici nu m-am gândit pînă acum la aşa ceva. Dar, oricum e o idee foarte bună, ce merită ţinută minte.
      Numai bine!

      RăspundețiȘtergere
    5. Am facut si eu montajul, este de mare efect.
      M-am mai jucat si cu niste fotorezistente de valori diferite, puse in locul potentiometrului care regleaza culorile.Foarte interesant.
      Asta a iesit cu leduri de 5mm(nu sunt asa de efect ca RGB-urile din schema)
      http://www.youtube.com/watch?v=jZ_8XLjq1-A
      PS:Putem discuta si de generatoare eoliene, evident cu acceptul lui Mihai.Eu mi-am facut deja unul de 1.5kW.

      RăspundețiȘtergere
    6. Am făcut şi eu un astfel de lampă de masă, numai că am ales un PIC12F675, care nu are ieșiri PWM, şi am creat eu din interrupt-ul unui timer, mi-a ieşit bine! Dar îmi pare prea complicată chestia cu mediile a 50 de valori, am avut şi eu problema asta, aşa că am pus un condensator de 100uF între plus şi intrarea analogică (se putea şi la minus de pus, dar mie constructiv îmi era aşa mai simplu). La fel am făcut alt principiu de reglare a culorii, nu prea m-am stăruit s-o înţeleg pe a ta, fiindcă am găsit blogul tău după ce am făcut tot :). Deasemenea consider mai reuşită reglearea mea a luminozităţii, eu calculez aparte fiecare durată a impulsului culorii dintr-o perioadă, astfel înmulţesc fiecare timp cu un coeficient de proporţionalitate, care se reglează în funcţie de luminozitate, și apoi valoarea se rotungește. dacă vă interesează mai multe detalii în privința asta, scrieți aici!

      RăspundețiȘtergere
    7. Salut! Poti sa re-uploadezi fisierele .c si .hex deoarece linkul numai functioneaza. Multumesc!

      RăspundețiȘtergere
      Răspunsuri
      1. Salut,
        Merci că mi-ai atras atenţia. Am reparat problema cu link-ul!
        Spor!

        Ștergere
      2. Multumesc mult! Abia astept sa ma apuc de proiect :D si felicitari pentru redactare si pentru informatiile in detaliu. Un tutorial foarte bun.

        Ștergere
    8. "Folosirea unui 7812 nu e cea mai bună abordare pentru cazul în care tensiunea dată de alimentator e sub 13V. În acest caz stabilizatorul nu-şi mai poate face treaba şi ajunge să scoată o tensiune mai mică de 12V".
      Adica si 7812 mananca un volt?
      Tks

      RăspundețiȘtergere
      Răspunsuri
      1. Salut Sorin,
        Un regulator 7812 are nevoie de o tensiune de intrare cu 1-2V mai mare decât cea de ieşire pentru a putea menţine stabilă ieşirea de 12V.
        O alternativă, în cazul meu, ar fi fost folosirea unui regulator cu cădere mică de tensiune (Low Drop Voltage Regulator), care poate stabiliza şi la o diferenţă de 0.5V între tensiunile de intrare şi ieşire.
        Numai bine!

        Ștergere
    9. Multumesc de raspuns. Sa vad acum: ori modific alimentarea unor lampi (banale) la 5v, fie... experimentez un ridicator de tensiune dupa modelul lampilor care aprind un led de 3 v cu alimentare la 1,2 v sperand sa ajung la peste 13 v ca sa pot restabiliza la 12.

      De actualitate:
      Te-am re-regasit cautand "functionare led rgb" . Am gasit o minune mai simpla la http://www.ebay.co.uk/itm/New-7-Colour-LED-Shower-Head-Automatic-Lights-Water-Home-Bath-3-Outlet-Modes-UK-/271053595487?pt=UK_Home_Garden_Bathroom_Shower_Units_PP&hash=item3f1c0da35f

      Practic culoarea variaza in functie de temperatura daca inteleg bine, desi dupa cat m-am documentat ar trebui sa fie vorba de tensiune. Ai idee ce tip de led (de preferat disponibil si in magazinele romanesti) face asa ceva?

      Multumesc

      RăspundețiȘtergere
      Răspunsuri
      1. Salut Sorin,
        Nu ştiu ce led-uri sunt folosite pentru acel sifon de duş. Din poză par a fi led-uri color simple, care dau o singură culoare fiecare, dar nu pot fi sigur.
        Numai bine!

        Ștergere
    10. Sal!! pentru acea lampa se putea folosi o schema mai simpla? fara integrat de memorie? Ceva de genul? Am tot cautat o schema care sa imi varieze luminozitatea si nu stiu inca daca am gasit.
      http://www.scheme.ro/index.php?n=modules/articles&a=7&d=2&28aed=off
      DaCA aveti vreo idee astept.

      RăspundețiȘtergere
      Răspunsuri
      1. Salut Marius,
        În locul integratului se pot folosi trei potenţiometre prin care să reglezi intensitatea curentului (şi implicit a luminii) prin fiecare led de culoare. Astfel o să ai un potenţiometru pentru culoarea roşie, unul pentru verde şi unul pentru albastru.
        Numai bine!

        Ștergere
    11. salut
      Ma gandesc sa fac o licenta pt facultate aseamanatoare proiectului tau imi poti da pt inceput cateva detali ca de exemplu cum sti ce microcontroler alegi.........eu ma gandeam sa folosesc leduirle rgb si sa le schimb culoare cu un toch scren capacitiv.......sunt la faza de documentare ...
      ms!

      RăspundețiȘtergere
      Răspunsuri
      1. Salut,
        Sfatul meu e sa nu pierzi foarte mult timp cu alegerea microcontroller-ului. Alege-l pe cel care ti-e mai familiar si apucate sa lucrezi. O data cu acumularea de experianta o sa-ti dai seama daca microcontroller-ul folosit e potrivit sau nu pentru aplicatia pe care vrei sa o realizezi.
        Spor!

        Ștergere