LED‎ > ‎LED osvetlenie do kuchyne‎ > ‎

Stmievač LED pásika pomocou ATtiny85

K vytvoreniu tohoto stmievača ma inšpirovala vlastná lenivosť. Keďže človek si uvedomuje, že LED osvetlenie spotrebováva málo prúdu, začne byť pohodlný a prestane vypínať LED osvetlenie. Ale k tomu ono nebolo určené. Bolo určené na osvetlenie pracovnej dosky v kuchyni. Pohodlný človek ale veľmi skoro zistil, že je to také úžasné, prísť do kuchyne nabrať si vodu a je tam už pripravené svetlo.
Preto som navrhol tento stmievač, ktorý detekuje človeka v miestnosti, jemne rozsvieti svetlo, aby človeka náhla zmena neoslepila a keď človek odíde z miestnosti, približne po minúte sám svetlo zase zhasne.

Princíp činnosti

Stmievač sa skladá z niekoľkých častí:
  • 5V z 12 V - LED pásiky sú napájané z 12 V a preto je potrebné zabezpečiť 5 V pre mikrokontrolér a IR senzor.
  • IR senzor pohybu - Senzor sníma priestor a ak zistí prítomnosť človeka, signalizuje na svojom výstupe.
  • Mikrokontrolér - Mikrokontrolér vyhodnocuje údaje z IR senzora. Ak zistí prítomnosť signálu z IR senzora:
    • Počas dvoch sekúnd postupne rozsvieti LED pásik. Využíva pritom PWM signál.
    • Sleduje, či je človek stále v miestnosti. Ak áno, drží LED pásik stále rozsvietený. Toto je nastavené tak, že svetlo svieti približne minútu po poslednom signáli z IR senzora. Je to tak nastavené preto, aby zbytočne osvetlenie neblikalo a človek mal v miestnosti čas aj pri menej divokom pohybe aktivovať IR senzor.
    • Ak je vyhodnotené, že už človek nie je v miestnosti, v priebehu štyroch sekúnd (neskôr sa ukázalo, že 8 sekund je lepší čas) postupne zhasne LED pásik.
  • Mosfet driver - Mosfet driver sa stará o to, aby bol signál z mikrokontroléra správne privedený na gate mosfetu, ktorý spína LED pásik. Súčasne zabezpečuje, aby TTL logika na 5 V dokázala zopnúť mosfet, ktorý na väčšie spínané prúdy potrebuje obvykle väčšie napätie a väčší prúd na gate mosfetu, než je schopný zabezpečiť mikrokontrolér.

Schéma

Toto je schéma stmievača. Väčšia verzia schémy je v súbore attiny85leddimmer.pdf.
  • Konektor P1 slúži na pripojenie 12 V. Sem sa pripojí kábel, ktorý je pripojený na zdroj 12 V.
  • Konektor P2 slúži na pripojenie LED pásika.
  • Konektor P3 slúži na pripojenie IR senzora pohybu. Signál prichádza do PB1 mikrokontroléra.
  • Obvod 78L05 slúži na vytvorenie napätia 5 V, ktorým sa napája mikrokontroler ATtiny85.
  • Tranzistor Q1 neguje signál, ktorý vychádza z PB0 mikrokontroléra.
  • Tranzistory Q2, Q3 a Q4 tvoria totem-pole driver.
  • Mosfet IRF540 spína samotný LED pásik. V mojom prípade spína asi 3 A a nie je potrebný chladič. Tento mosfet môže spínať až 33 A.
https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/attiny85leddimmer.png?attredirects=0

Programovanie

Programovanie je vysvetlené na stránke Arduino ako ISP programátor. Druhá možnosť je použiť USBasp. Po naprogramovaní som mikrokontrolér zastrčil do hotovej dosky.

Ako umiestniť senzor

Toto sa zdalo byť ako jednoduchá vec, ale nakoniec to bolo zložitejšie. Pôvodne som umiestnil senzor pohybu hore na linku. Odtiaľ krásne zachytával osoby, ktoré vchádzali do miestnosti. Problém ale bol, keď sa človek postavil ku drezu a začal tam niečo umývať. Uhol, pod ktorým sa nachádzal, nebol už pre senzor dostatočne viditeľný a príliš často sa celé svetlo vyplo.
Preto sa prehodnotilo miesto jeho umiestnenia a celá krabička sa nachádza na poličke práve pri dreze, kde je človek zachytávaný priamo pred senzorom. To zabezpečilo, že celý systém začal fungovať ku skoro dokonalej spokojnosti celej rodiny.

Stmievač v. 1.0


Prvá verzia stmievača používa elementárnu logiku. Striehne na signál, ktorý vygeneruje IR senzor na pine PB1. Následne spustí nasledovný cyklus funkcií:
  • Pomalé rozsvietenie - Poznačí si čas, kedy sa rozžínanie začalo. Následne v cykle sleduje, aký je rozdiel medzi aktuálnym časom a poznačeným časom a podľa toho nastavuje hodnotu PWM od 0 do 255.
  • Udržiavanie rozsvietenia - Poznačí si čas, kedy sa funkcia začala. Následne sleduje čas a ak uplynie nastavená dĺžka, posunie riadenie na nasledovnú funkciu. Ak ale počas tohoto sledovania dostane zase signál na pine PB1, resetne si počiatočný čas. Toto zabezpečuje, že pokiaľ sa v tomto čase hýbete po miestnosti, senzor vás občas zachytí a stále udržuje svetlo pásika na maxime.
  • Pomalé zhasnutie - Poznačí si čas, kedy sa zhasínanie zažalo. Následne v cykle sleduje, aký je rozdiel medzi aktuálnym časom a poznačeným časom a podľa toho nastavuje hodnotu PWM od 255 do 0.
Celé je to naprogramované vo vývojovom prostredí Arduina 1.0.5 a do mikrokontroléra som to nahrával pomocou Arduina.
Program sa nachádza v súbore kitchen_dimmer_10.ino.

Stmievač v. 1.1

Po približne dvoch mesiacoch používania sa objavilo niekoľko nedokonalostí, ktoré trošku vadili, preto som sa pustil do inovovanej verzie. Zoznam zmien je:
  • Predĺženie času stmievania zo štyroch na osem sekúnd.
  • Počas stmievania už mohol človek poskakovať pred senzorom koľko chcel, svetlo sa zhaslo úplne a potom sa hneď rozžalo. Úprava spočíva v tom, že senzor reaguje aj počas fázy stmievania a tak je možné znovu získať plné svetlo.
Program sa nachádza v súbore kitchen_dimmer_11.ino.

Vývojová doska

Počas vývoja programu som si pomáhal špeciálne navrhnutou vývojovou doskou, na ktorej som si mohol simulovať reálne zapojenie. Potom som zistil, že je to možné používať na ľubovolný vývoj programov pre ATtiny85. Na doske sa nachádza 5 LED diód, ktorými sa dajú sledovať výstupy a dve tlačidla, ktorými sa dajú simulovať vstupy. Tlačidlá je možné prepnúť podľa potreby ako pull-up alebo pull-down. Dosku je možné programovať pomocou USBasp.
Celé som to programoval vo vývojovom prostredí Arduina 1.0.6 a do mikrokontroléra som to nahrával pomocou USBasp.
https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/attiny85_dimmer_buttontest.jpg https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/attiny85_dimmer_hcsr501test.jpg

Problematika ladenia kódu

Ladenie v reálnom čase neprichádza do úvahy, pretože čakať desiatky sekund na zhasnutie a dostávať signál priamo z IR senzora je zbytočne zdĺhavé. Preto je možné urobiť niekoľko zjednodušení:
  • Výstup z PB0 pripneme na jednu LED a na nej vidíme, čo sa bude diať aj s LED pásikom vo finálnom zapojení.
  • IR senzor nahradíme tlačidlom pull-down. To nám zabezpečí, že keď budeme potrebovať logickú jednotku na vstupe PB1, tak len stlačíme tlačidlo a signál príde. Nemusíme sa trápiť so zákmitmi tlačidla, pretože identifikujeme len prítomnosť signálu na pine.
  • Na zobrazenie logickej jednotky na vstupe si len pripneme pomocnú LED, na ktorú prepošleme to, čo sme načítali v programe na pine PB1. Čiže každé digitalRead je doplnené v kóde zodpovedajúcim digitalWrite.
  • Interval čakania skrátime z finálnej podoby na 5 sekúnd, aby bolo reakcie rýchlejšie.
  • Aby sme videli, kedy sa menia v programe stavy, doplníme ešte jednu LED, na ktorej si krátko blikneme v okamihu, keď je nejaká činnosť hotová. V mojom prípade je to v okamihu, keď je svetlo plne rozsvietené a v okamihu, ako sa začne stmievať.
Keďže toto potrebujeme v čase vývoja a v ostrej prevádzke potrebujeme pôvodné správanie, použijeme podmienený preklad:
  • Ak je definované makro RDEBUG, tak blikajú pomocné diódy.
  • Ak nie je nastavené, správa sa program ako v ostrej prevádzke.

Stmievač v. 1.2

Zoznam zmien v tejto verzii:
  • Stmievanie je lineárne. Oko tak má pocit, že sa stmieva naozaj plynule. Pôvodne som plánoval, že aj rozžínanie aj zhasnutie bude lineárne. Ale nakoniec sa ukázalo, že na rozžatie je oku príjemnejšie to, čo tam bolo pôvodne. Tmavá fáza je minimálna, rýchlo nabehne väčšina svetla, ktoré sa potom už len rozožne na plnú svietivosť. Zhasnutie je lineárne a tak som to aj chcel.
  • Stmievanie je v dvoch fázach. Prvá zhasne len do úrovne okolo 30%. Potom nasleduje ešte asi minútové čakanie na tejto úrovni a až potom sa svetlo zotmie definitívne na nulu. To by malo ešte viac spríjemniť používanie, keď človek pobehuje hore dole, aby počas pobehovania neprichádzal do úplnej tmy.
  • Otestoval som ladenie pomocou sériového portu, kde využívam Arduino Mega 2560 ako proxy medzi ATtiny85 a PC a knižnicu SoftwareSerial, ktorou odosielam ladiace údaje. Preto aj došlo k prerobeniu ladiaceho kódu. Pôvodné kontrolné blikanie LED diódami išlo preč a všetky potrebné informácie sa odosielajú na virtuálny sériový port. Opäť je to celé postavené okolo makra RDEBUG. Podrobnosti sú jasné zo zdrojového kódu.
    • Ak ladíme cez SoftwareSerial, je potrebné mať prepnutý mikrokontrolér na 8 MHz.
    • Ak kompilujeme finálnu verziu, je potrebné nielen vypnúť RDEBUG, ale potrebné aj zapoznámkovať riadok #include "SoftwareSerial.h". To je potrebné kvôli tomu, že IDE Arduina v skutočnosti neberie do úvahy podmienený preklad a pokúša sa identifikovať všetky knižnice podľa zdrojového kódu. A tam ignoruje makrá #if, #else a #endif.
  • Program je prerobený na stavový automat.
Po niekoľkých dňoch používania možno povedať, že tieto zmeny to pekne vylepšili. Lineárne zhasnutie svetla naozaj vidno a rovnako je dobrá aj fáza šera, ktorá je pridaná na záver zhasnutia. Tá fáza je rovnako dlhá, ako fáza plného svitu a spríjemňuje viacnásobné vchádzanie a vychádzanie z a do miestnosti.
Program sa nachádza v súbore kitchen_dimmer_12.ino.

Stmievač v. 1.3

Zoznam zmien v tejto verzii:
  • Zníženie spotreby - Tu sa len zúročili výsledky experimentov s uspávaním ATtiny85. Aby bol mikrokontrolér stále v pohotovosti, uspáva sa len na 64 ms. To zaručuje, že na signály z PIR senzora reaguje hneď. Ak budete študovať kód, všetko uspávanie sa nachádza vo funkcii LightDark. To je stav, ktorý nastáva počas vypnutej LED. Ak je detekovaný signál, mikrokontrolér sa neuspáva a vykonáva všetky operácie rozsvietenia a zhasínania. Spotreba počas uspatia je hlboko pod jedným miliampérom. Vypnuté je aj ADC.
  • Prechod na 8 MHz - Hlavná motivácia tohto kroku bola snaha o natočenie sprievodného videa. Keďže pôvodná verzia sa vyvíjala na 1 MHz a pri tejto frekvencii PWM pracuje len okolo 60 Hz, na videu to pri stmievaní blikalo. Ľudské oko to nevidelo. Preto som mikrokontrolér prepol na 8 MHz a tým sa zvýšila frekvencia na približne 490 Hz, čo je v podstate rovnaké, ako v bežnom Arduine. Ale na zlepšenie videa to nepomohlo. Stále to poblikáva.
Program sa nachádza v súbore kitchen_dimmer_13.ino. Keďže tu už narástla veľkosť programu nad určitú hranicu, nie je možné program skompilovať so zapnutým makrom RDEBUG. Kto chce experimentovať s ladením cez UART, môže experimentovať s verziou 1.2. Momentálne asi ani neplánujem upravenie knižnice SoftwareSerial tak, aby sa zmenšili jej pamäťové nároky.

Stmievač v. 1.4

Kolegovia na mňa po nasadení stmievačov začali tlačiť, aby sa dali nastaviť časy stmievania. Rozhodol som sa pre úpravu existujúcich stmievačov, kde mám k dispozícii zatiaľ nevyužité piny PD3 a PD4. Pomocou nich sa stmievače budú dať naprogramovať.
Úprava je v tejto chvíli už naprogramovaná a testuje sa to. Programovanie ako sekundárny produkt vyprodukovalo článok o ukladaní údajov v internej EEPROM a ďalší článok o používaní pull-up rezistorov.
Mikrokontrolér v tejto verzii sa programuje pomocou jumpera na konektore K2 a diódy D2 (na nasledovnom obrázku). Stredný pin na konektore je cez interný pull-up pripojený na 5 V.
  • Prepojením jumpera do spodnej polohy sa prepojí pin na GND.
  • Potom sa zapne napájanie. Mikrokontrolér pri spustení kontroluje LOW na pine PD3. Ak je nastavené, prepne sa do programovacieho režimu.
    • Reset nastavenie
      • Ak necháte 10 sekund LOW na PD3, nastaví sa 45 s pre dĺžku plného osvetlenia a 45 s pre dĺžku stlmeného osvetlenia.
    • Nastavenie vlastných intervalov
      • Počas rýchleho poblikávania je treba vytiahnuť jumper. Tým dostane mikrokontrolér signál, že sa meria čas plného osvetlenia. To je indikované dvojblikmi v sekundových intervaloch. Koniec intervalu nastavíte zastrčením jumpera do polohy LOW. Minimum je 10 s, maximum je 120 s.
      • Nastane druhá fáza. Počas rýchleho poblikávania je treba vytiahnuť jumper. Tým dostane mikrokontrolér signál, že sa meria čas tlmeného osvetlenia. To je indikované dvojblikmi v sekundových intervaloch. Koniec intervalu nastavíte zastrčením jumpera do polohy LOW. Minimum sú 2 s, maximum je 120 s.
      • Nastane tretia fáza. Počas rýchleho poblikávania je treba vytiahnuť jumper. Tým dostane mikrokontrolér signál, že má uložiť nastavenie do EEPROM.
  • Po ukončení programovacieho režimu uloží nastavenie do internej EEPROM.

[doplniť zdrojový kód]

Plošný spoj z továrne

Momentálne sa vyrába v továrni v Číne dvanásť kusov, tak som zvedavý, čo za dva týždne dorazí. Na päť kusov už čakajú kolegovia.
https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/stmievac_front.JPG https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/stmievac_back.JPG https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/stmievac_all.JPG
Nakoniec to trvalo tri týždne. Z odosielaných e-mailov sa dalo vyrozumieť, že z toho času približne týždeň trvala výroba v továrni a dva týždne cestovala zásielka. Objednal som 10 plošných spojov 5x5 cm a prišlo mi ich jedenásť a dva nejaké cudzie. Tie cudzie sú mi síce nanič, ale je to celkom pekná myšlienka, že za definovaných podmienok pošlú aj mačku vo vreci. Nestojí to nič navyše. Keď som tú mačku skúmal podrobnejšie, tak som sa nakoniec dopátral ku ich vlastnému výrobku Raspberry PI 2.8 TFT Add-on.
Plošné spoje som objednal u ITEAD studio ako najlacnejšiu možnosť, čo tam bola. 5x5 cm zelený obojstranný za 9,90 USD. Platí sa aj poštovné, takže celkovo som platil 13,80 USD. Zásielka sa dala pekne sledovať na nete, ako sem putovala.
https://sites.google.com/site/arduinoslovakia/led/led-osvetlenie-do-kuchyne/stmievac-led-pasika-pomocou-attiny85/leddimmer_final.JPG

Na plošnom spoji som síce porobil pár drobných chýb, ale sú to len drobnosti typu malé písmo na potlači, alebo ozrutné rezistory. Môžem sa pustiť do výroby prvého kusu. Kto by chcel nasledovať moje kroky, v súbore attinyleddimmer.zip sú podklady pre ITEAD studio.

Videá

Prvé video ukazuje vývoj stmievača na experimentálnej doske. Na experimentálnej doske je ľahšie simulovať signály zo senzora pomocou pull-down tlačidla.

Toto je druhá časť o stmievaní svetla v našej kuchyni. Konečne sa mi podarilo natočiť video tak, aby to na zázname neblikalo. Musel som počkať na denné svetlo, kedy nebola optika fotoaparátu taká citlivá. Ľudské oko nevidí blikanie ani v noci, pretože frekvencia je nastavená na približne 500 Hz.
Vo videu je vidno príchod do kuchyne, kde LED pásik svieti na plnej intenzite. O niekoľko sekúnd sa začne stmievanie, pretože sa mi podarilo ostať v zóne tesne pri dverách, kde je IR senzor HC-SR501 ešte zakrytý. Intenzita svetla sa zníži na 30% a na tejto intenzite logika mikrokontroléra ešte niekoľko desiatok sekúnd čaká, pokiaľ svetlo nevypne úplne. Ak počas toho času vojdeme do miestnosti, svetlo sa zase plynulo zapne na plnú intenzitu, čo je aj vidno na konci videa.

Nasledovné video predvádza nastavovanie intervalov plného osvetlenia a intervalov šera pre v. 1.4 programu.

Do budúcnosti

Čo sa týka samotného programu, tam už nemám čo vyvíjať. Na plošnom spoji je priestor na pripojenie dvoch ďalších PIR senzorov, alebo sa dajú tieto piny využiť na inú formu digitálneho vstupu, prípadne na ADC vstup, ak by bolo potrebné snímať napríklad úroveň okolitého osvetlenia a reagovať naň.
Ostalo mi ešte 6 poskladaných stmievačov. Postupne ich testujem a pokiaľ sa predajú, urobím ešte miernu úpravu aj na plošnom spoji. To už ale budú iba kozmetické úpravy, samotná funkčnosť sa nebude meniť.
Ċ
Robo Ulbricht,
16. 7. 2014, 11:35
ċ
attinyleddimmer.zip
(24k)
Robo Ulbricht,
21. 12. 2014, 7:43
ċ
kitchen_dimmer_10.ino
(2k)
Robo Ulbricht,
30. 9. 2014, 10:59
ċ
kitchen_dimmer_11.ino
(3k)
Robo Ulbricht,
11. 10. 2014, 1:51
ċ
kitchen_dimmer_12.ino
(6k)
Robo Ulbricht,
14. 12. 2014, 22:39
ċ
kitchen_dimmer_13.ino
(7k)
Robo Ulbricht,
14. 12. 2014, 22:39
Comments