IX. TavIR programozói verseny: Szakács László: LED világítás (SzLacus) fényerő szabályzás

RGB LED vezérlőA pályázatban megvalósításra került egy LED-szalag világítás/fényerő szabályzása. Ez persze van készen, érintős kivitelben, de nincs - vagy legalábbis én nem találtam olyan változatot, amit több helyről lehet szabályozni, be-ki kapcsolni. Az érintős kapcsoló nem illeszkedett az alkalmazott kapcsolók, dugaljak, stb. stílusához, egymás mellé sorolni sem lehetett velük, és az árcéduláját is a fűszeres polcon tartják: közvetlenül a bors mellett.

 

Az elméleti háttér

Az arduinoban adott a pwm lehetősége, ha visszaálló kapcsolót használok, sima megnyomásra be-ki kapcsolhatom, nyomva tartva pedig szabályozni tudom a fényerőt. Ez volt az alap ötlet, ebből keletkezett ez a kis project.

A megvalósítás során a redőnykapcsolóra esett a választás: két visszaálló nyomógomb (az egyiken fel, a másikon le nyíl: pont ez kell nekem). Az arduino 5V-ját nem szívesen küldtem volna ki a kapcsolókhoz, a 12V-os tápegység adott a LED táplálására, azt kell használni mindenre. Optocsatolós jelszint-illesztéssel könnyen megoldható a feladvány. A GND közös, tehát igazából nem beszélhetünk leválasztásról, de az opto „primer” oldalát 12V-ból tápláljuk, a tranyó pedig az arduino bemenetén található. Így azt a megoldást választottam, hogy a kapcsolók a +12V-ot kapcsolják az optóra és bármennyi kapcsoló lehet párhuzamosan kötve, mert ugye több helyről akarjuk működtetni. Egy-egy mindjárt a kapcsolásnak helyet adó TavIR proto panelon, két nyákba ültetett nyomógomb formájában. Ez kézre esik a fejlesztés során és jól jöhet, ha esetleg valamikor javítani kell.

Optokapuk

Lássuk a kimenetet: a LED-ek meghajtását egy kereskedelmi forgalomban kapható, pongyolán csak erősítőnek nevezett egység végzi. Ebben 3 darab optocsatoló és 3 darab teljesítmény FET van. A feladat csak annyi, hogy az optók bemeneti oldalát kell PWM vezérelni. A kapcsolásban ezért az arduinónak egy PWM-képes lábára egy tranzisztor bázisa került alkalmas nagyságú bázis ellenállással, az emitter GND-n, a kollektor a kimenet. Ezt hívjnánk „open collector”-os (OC) kimenetnek: de én egy LED-et még sorba kötöttem, hogy látható legyen a panelon a kimenő fény változása. Tehát a mi kapcsolásunkban az erősítőben található optók ledjei áramkorlátozó ellenálláson és egy további sorba kapcsolt LED-en keresztül vannak a kollektoron.

LED driver

Kialakításra került egy további OC kimenet, amivel relét lehet meghúzatni. Ennek célja, hogy a LED-világítás tápegységét, ha zajos vagy nagyon „zöldek vagyunk”, akkor le lehessen választani a hálózatról. Az Arduinónak és a kapcsolóknak persze ekkor is kell táplálás, tehát azt máshonnan kell táplálni. A 13-as lábon található LED-et szívverésre használom és egy további arduino lábon egy másik LED-et a kapcsolók nyomva tartásának visszajelzésére használok. A projektnek nem voltak időbeli korlátai, ezért kialakítottam egy soros kommunikációs részt, ahol vezérlőkarakterekkel tudjuk működtetni a világítást (ki tudja mennyire lesz automatizált otthonom) és kifele is üzengeti a külvilágnak a történéseket.

Az utoljára használt fényerőt elmentjük az EEPROM-ba. Hogy ne ugyanazt a cellát koptassuk záros időn belül elhasználva az adatlap adta lehetőséget és az élettartamot: a fényerő mentési helye vándorol az EEPROM-ban. Áramszünetre is számítani kell, vagyis a mentett értéket néha meg kell találni az EEPROM-ban.

A megvalósítandó gombnyomások, vagyis a használati működés a következő...

Rövid gombnyomásra, (akármelyik gomb) bekapcsol a világítás az utoljára elmentett fényerőre. Bekapcsolt állapotban a FEL gomb nyomva tartása fényerő növelést, a LE gomb fényerő csökkentést eredményez. Kikapcsolt állapotban a FEL gomb nyomva tartása minimum fényre be, a LE gomb nyomva tartása maximum fényre bekapcsolást eredményez. Ha ekkor elengedjük a kapcsolót, marad a minimum, vagy a maximum fény. Ha tovább nyomjuk a gombot, akkor az eredmény azonos a bekapcsolt állapotnál leírtakkal. A komplett .ino fájl kommentezett, de ha valami mégsem eléggé egyértelmű vagy a program fejlődését nem követtem a kommentekben - így a komment valahol félrevezető, akkor szívesen válaszolok a feltett kérdésekre. A pdf/versenymunka csatolmányaként megtalálható az INO forrásfájl, itt csak olyan részeket említek meg, amik a működés valamilyen sajátságát magyarázzák.

Kezdjük mindjárt a kapcsoló nyomva tartásának megítélésével. A definíciós részben megtalálható, hogy mennyi idejű nyomva tartást tekintünk gombnyomásnak, ami ennél rövidebb, az prellnek minősül, akkor is, ha tudunk olyan rövidet nyomni a gombon ami már nem prell de még nem fog kapcsolást eredményezni. A leírt érték az én kezemhez illeszkedik. Ha már nem prell a gombnyomás, akkor kapcsolási ablakban vagyunk: ha itt elengedik a kapcsolót, akkor bekapcsolunk az utoljára elmentett fényerőre. Ha még mindig nyomjuk a gombot, akkor a kapcsolási ablak elteltével végrehajtjuk a kapcsolást minimum vagy maximum fényre és indítunk egy újabb kicsit trükkös várakozást. Ha itt elengedik a gombot, akkor marad a max. vagy min. fény. Ha itt fix várakozási időt alkalmazunk, akkor az elengedés után nem tudjuk változtatni a fény amíg az elindított várakozás fut. Ezért csak rövide ket várunk és ismételjük a várakozást vagy amíg a gombot elengedettnek nem találjuk, vagy a ciklus végéig. Ha ez a várakozás is letelt, akkor bekapcsolt állapotban vagyunk, és szabályzást kell végezni.



A szabályzás azért nem egyesével növeli a PWM-et minimumtóltől a maximumig, mert a fényhatás így nem tetszett. Ezért került bele a 16-ig egyesével, aztán fokozatosan növekvő lépésekben. A szabályzás során a minimum és a maximum érték elérésekor „pislanthat” egyet a világítás, jelezvén, hogy felesleges tovább nyomni, nem lesz már változás. A valóságban ez a funkció inkább zavarónak tűnik, így a függvényt villanás nélkül hívom, de akinek teszik, az hívja villantással.

A fényerőt az EEPROM-ba csak akkor mentjük, ha eltér az előzőtől és nem minimum, vagy maximum érték.

Ezek mentésének nem lenne értelme, így kímélhető az EEPROM. Az EEPROM-ban egy előre kiválasztott mintával jelölöm az aktuálisan érvényes fényerőt és ez segít eldönteni azt is, hogy áramszünetből édedünk fel, vagy szabályos kikapcsolás volt az utolsó és kikapcsolt állapot az aktuális. Áramszünet után viszont nem kapcsolunk mentett fényerőre, mert lehet, hogy már alszom amikor visszajött az áram. Minimumra kapcsol be, ami nem zavaró ha nincs szükség világításra, de észrevehető, ha még ébren vagyunk. Ekkor a kapcsolók funkciója is kissé módosul. FEL gombra visszaáll az utoljára mentett fényerő, míg LE gombra egyszerűen kikapcsolunk.

Az EEPROM élettartam számlálója a tetején van és minden körbefordulásnál egyet növelek az értéken. Ezt a helyet kihagyom a mentésekből és a legalsó cellát sem használom fényerő mentésre. Az a cella is használatban van, de csak olyan infót írok bele, amiért nem kár, ha elveszik. Erről később.

A soros porton beküldött karakterekkel is vezérelhető a program. Ha elfelejtjük, hogy mely karakterek érvényesek, akkor egy ? küldésével visszaválaszolja.

Egy karakter sima gombnyomás, két karakter hosszú gombnyomás, sorozat karakter nyomva tartott gombot jelent, és azzal azonos működést eredményez. Ennek megvalósításában vizsgálni kell a következő karaktert is, és néha el kell dobni a kiolvasott karaktert. A program képes üzengetni a kapcsolási állapotokat működés közben, de csak ha szükség van rá. Ezt lehet be vagy ki kapcsolni akát a két gomb együttes megnyomásával, akár a beküldött „D” karakterrel. A küldés szükségességének utolsó állapota kerül a legalsó EEPROM cellába, ha elvész nem kár érte.



A szívverés leden három villogási sűrűség mutatja, hogy normál üzemben vagyunk, vagy sorosra küldözgetjük az állapotokat, vagy lejárt az EEPROM élettartama. Első projektnek ez került ki a kezem alól, azóta látom, hogy az arduinóban megtalálhattam volna néhány olyan beépített parancsot, ami egyszerűsítette volna a projektet, de nélküle is meg lehetett írni. Ha valaki utánépíteni szeretné, csak bíztatni tudom: biztosan lesz olyan ötlete, amit még meg lehet valósítani egy egyszerű fényerő szabályozott világításnál. Sok sikert minden verseny résztvevőnek, és érdeklődőnek.

Szakács László (SzLacus)

 

Fájlmelléklet: 

TavIR-Facebook