XAN77 Postat Ianuarie 19, 2014 Partajează Postat Ianuarie 19, 2014 Vă propun un ir switch & dimmer deși există destule pe net mereu e loc de încă unul. Și nu că ar fi prea util dar măcar pentru elementele de noutate, ca idei tehnice la alte proiecte, nu neaparat pe post de light control. Circuitul controlează 2 becuri, pe unul e control On/Off deci se pretează la becuri economice iar pe celalalt e control funcție de faza rețelei, pentru bec incandescent, cu reglaj în 10 trepte. Pentru că beneficiez de o fază permanentă la tavan (casă construită de la zero) am putut monta circuitul direct în plafonieră. Se poate vedea în poze cum este montat. Precizez că montajul prezentat este unul de testare/dezvoltare, l-am construit pentru a putea scrie/testa softul, care e făcut în codevisionavr. De aceea prezintă pe placă conector LCD, pentru că a fost util în etapa de dezvoltare pentru decodarea ir etc, în final nemaifiind necesar. Foarte probabil va trebui să fac alt montaj, eventual cu un mic alimentator smps, fără conector LCD, doar strictul necesar, mai multe componente smd cred că e indicat. nu știu dacă transformatorul va rezista în plafonieră, cu toate că nu este una închisă. Unul din punctele de interes la acest montaj este decodarea ir la care sătul fiind de RC5, m-am chinuit să fac o decodare universală, care să poată decoda orice telecomandă, să nu necesite intervenții soft cînd o să-mi schimb televizorul și implicit telecomanda din dormitor unde folosesc acum montajul. Aceasta a fost adevărata provocare. Eu am gîndit așa: activez întrerupere la INT0 cu activare pe orice front, și la intrarea în întrerupere măsor timpul scurs pînă la următoarea întrerupere, deci durata pulsului curent, fie el de 0 sau 1, nu contează. Astfel măsor durata tuturor stărilor. Dezavantajul este că dublez numărul biților, la RC5 de exemplu orice bit cuprinde 2 stări, un 0 și un 1, frontul din mijlocul duratei alocat bitului contează, dacă e crescător e 1 dacă e căzător e 0. Am observat că deși există multe protocoale, există un numitor comun. La RC5 duratele posibile a stărilor pot fi de 0.889ms și 1,778ms. La JVC duratele posibile a stărilor pot fi de 0.526ms și 1,574ms. La NEC duratele posibile a stărilor pot fi de 0.560ms și 1,690ms. La Sony duratele posibile a stărilor pot fi de 0.600ms și 1,200ms. La RCA duratele posibile a stărilor pot fi de 0.500ms și 2,000ms. La X-sat duratele posibile a stărilor pot fi de 0.526ms și 1,474ms. Se poate observa că dacă am compara rezultatul unei măsurători cu valoarea fixă de 1ms am face distingere între cele două stări posibile indiferent de ce standard de codare este folosit, în toate exemplele de mai sus duratele posibile fiind ori mai mici ori mai mari decît 1ms în mod foarte clar. Acesta este algoritmul care l-am folosit pentru a citi codul tastelor, pentru un timp măsurat de <1ms am considerat "0" iar pentru >1ms am considerat "1". Am folosit un buffer format din 4 variabile char (8 biți) în total 32 biți, cu rotire stînga la fiecare recepție de bit valid, adică ceva pînă în 2ms. Dacă se recepționează prea mulți biți, și se poate întîmpla pe la NEC, chiar dacă în urma rotirii se pierd din primii recepționați, nu e problemă, că la toate standardele biții de comandă sunt ultimii și pe aceștia mereu îi vom avea. Am observat că sunt protocoale la care dacă țin apăsat pe butonul telecomenzii codul trimis este întreg doar la început după care se trimit numai niște secvențe scurte care probabil reprezintă faptul că butonul a rămas apăsat. Pentru a nu recepționa ca fiind cod diferit, secvențele de sub 10 biți le ignoră softul. La RC5 este trimisă permanent secvența întreagă cu repetabilitate la aprox. 100ms. Deși lucrez cu 4 bytes, am observat că cei 2 mai puțin semnificativi sunt deajuns pentru a avea informație diferită la orice buton. Am scăpat astfel de un mic inconvenient. Pentru cine știe, RC5 are un bit de toggle, din cauza căruia la apăsări repetate ale aceluiași buton obțin 2 coduri diferite ce se succed, cu schimbare la byteul 3 și/sau 4. MCU merge pe 12MHz cristal, că am prea multe cristale de 12, nu din alt motiv. Timer1 are clock de 1,5Mhz (prescaler 8), deci o unitate în timer1 înseamnă 0,(6)uS. Verific doar TCNT1H pentru a vedea dacă a trecut 1ms sau nu. Dacă trece 10ms, puls care nu există în nici un standard validez starea de standby, respectiv terminare secvență curentă de cod ir. Cam atîta despre IR, am intrat în detalii pentru cine e interesat de ir pentru alte proiecte, eu unul de mult timp doream să fac o rutină universală da greu m-am urnit. Ca noutate pentru mine ce vreau s-o menționez este modul în care am păstrat comanda manuală de la întrerupătorul de pe perete nemodificat. De la acel întrerupător se trimite faza rețelei spre bec. Am folosit optocuplor de prin surse smps/atx alimentat cu 220Vca printr-o diodă 4007 serie cu o rezistență de 100k de la faza de la întrerupător. La ieșire o rezistență de pull-up la +5vcc, pe colector avînd un frumos semnal dreptunghiular, testat pe osciloscop. În soft verific de la acele optocuploare durata pulsurilor de 1, care dacă e întrerupător ON sunt de 10ms (semnal dreptunghiular de 50Hz) iar dacă e întrerupător OFF e 1 permanent din cauza pull-up-ului. Pe schemă sunt 3 astfel de module cu optocuplor, 2 pentru întrerupătorul dublu și 1 conectat permanent la rețea pentru detecția trecerilor în 0 a rețelei, necesar pentru becul cu dimming. Timer0 este folosit pentru măsurarea timpului scurs de la detecția de 0 a rețelei pînă la momentul cînd activez triacul. Acel timp e mai scurt sau mai lung funcție de treapta de lumină curentă. Comanda triacului se oprește la aproximativ 100uS, acesta rămînînd deschis pînă la urmptoarea trecere prin 0. Din telecomandă se pot memora 3 butoane, unul de toggle On/Off pentru becul fără dimmare și 2 pentru cel cu dimmare. La cel din urmă un buton este toggle (on/off) celălalt scade nivelul de lumină în 10 trepte, după care o ia iar de la maxim. Pentru memorare, se pune întrerupătorul de pe perete corespunzător pe ON, se pune pentru puțin timp la masă (puș buton simplu, fără revenire) pinul PORTB.6, moment în care se aprinde ledul onboard și se apasă o tastă pe telecomandă ce se dorește ca On/Off pentru becul selectat din întrerupătorul de pe perete. Ledul se va stinge, tasta se salvează în eeprom. Pentru toggle pe celalalt bec, se inversează întrerupătoarele, să fie ON celalalt și se repetă secvența. Pentru a se memora tasta pentru ”light down” la becul cu dimming, se pun ambele întrerupătoare pe ON, se pune la masă PORTB.6 pentru puțin timp, se aprinde ledul, se apasă tasta la telecomandă, ledul se va stinge, moment în care e salvat în eeprom. Sper că nu am plictisit pe cineva, știu că postarea e cam lungă. http://i41.tinypic.com/2e56vpj.jpg http://i40.tinypic.com/24vtd2t.jpg http://i42.tinypic.com/117xrhk.jpg http://i43.tinypic.com/14vgscm.jpg Link spre comentariu
UDAR Postat Ianuarie 19, 2014 Partajează Postat Ianuarie 19, 2014 Excelent! Remarcabilă în mod deosebit munca de cercetare asupra protocoalelor RC și simplitatea genială a generalității soluției. Sincere felicitări ! Link spre comentariu
XAN77 Postat Ianuarie 19, 2014 Autor Partajează Postat Ianuarie 19, 2014 Mulțumesc. mică modificare, spuneam ”se pune pentru puțin timp la masă (puș buton simplu, fără revenire) pinul PORTB.6” vroiam să zic fără reținere. Și încă ceva ce nu mai era nevoie să spun, la căderile de rețea, ambele becuri pleacă pe off. Becul dimmabil se aprinde mereu cu softstart. Link spre comentariu
Dr.L Postat Ianuarie 19, 2014 Partajează Postat Ianuarie 19, 2014 Rezista traful fara probleme, consumul e mult mai mic decat puterea lui Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum