Table of Contents

Starlight Headliner - Mihnea Dinica 333CA

Introducere

Autor : Dinica Mihnea-Gabriel 333CA

Din dorinta de a-i oferi masinii mele un aspect mai modern, cel putin pe interior, m-am gandit ca reiterarea intr-o varianta DIY si de buget a luminilor ambientale montate chiar in plafon, ce creaza impresia unui cer instelat, ar fi o idee buna de abordat la proiectul de PM. Pe scurt, aceasta pagina documenteaza crearea unui sistem de lumini ambientale montate in plafon si programarea unui microprocesor pentru a asigura comanda luminilor ambientale.

Descriere generală

Am dorit sa-mi imbunatatesc aspectul interior al propriei masini prin adaugarea unor lumini ambientale de tipul celor create de inginerii Rolls Royce, preferand sa-mi creez propriul modul in acest sens pentru a avea control total asupra functiilor pe care le ofera si sa adaug chiar moduri noi de functionare. Astfel, ce-mi propun sa fac este sa am doua manunchiuri de 200 si 150 de fibre optice de grosimi diferite care sa fie luminate la un capat de modulele Neopixel (ale caror leduri sunt dispuse circular si pot fi comandate individual), al caror diametru este identic cu grosimea manunchiului de fibre optice. Pentru a asigura un transfer optim de lumina, am decis sa inchid aceasta bucata intr-o carcasa intunecata de cauciuc (este necesar un material moale pentru a nu crea zgomote in masina).

Interactiunea cu utilizatorul este asigurata printr-o telecomanda (este mai facil decat printr-o aplicatie Bluetooth pe telefon pentru ca poate vrei sa scimbi modul de iluminare in mers si ar fi o distragere prea mare sa folosesti telefonul pentru asta) din care poti schimba culorile, intensitatea si jocul de lumini (continuu aprins, twinkle, music). Pentru ultimul mod de utilizare, un microfon va fi folosit pentru a capta nivelul de zgomot extern si sa modifice intensitatea luminoasa a ledurilor in timp real.

Schema Bloc:

Hardware Design

Lista de componente:

Microprocesor:

Module:

Senzori:

Alimentare:

Alte componente:

Dupa etapa de prototipare cu Arduino si breadboard-uri, am decis sa folosesc doar microprocesorul si sa creez un PCB mai compact care sa indeplineasca strict functionalitatile neesare. Acesta, tinand cont de schema anterioara, arata asa: As fi optat pentru un PCB imprimat, dar nefiind sigur ca ar ajunge la timp, am decis sa-l fac manual. Nu am inclus in scheme senzorul IR, microfonul si modulele LED, dar toate se conecteaza in headerele aferente, pentru un montaj mai usor.

Software Design

Codul a fost modularizat in fisiere header si implementari pentru a organiza cele peste 1000 de linii de cod scrise. Avem astfel:

ConstantsAndTypes

Contine structurile, enumurile si toate constantele folosite in program (pini folositi, valori constante precum HUE-ul anumitor culori, timpi pentru timere etc)

ISRsTimersADC

Contine toate functiile de setare si utilizare a timerelor si a ADC ului, precum si rutinele lor de intreruperi.

LightMode

Contine functiile relevante diferitelor moduri de iluminare (Twinkle, Static).

MusicMode

Contine logica dupa care plafonul reactioneaza la intensitatea sonora din masina, practic se lumineaza in ritmul muzicii.

adaptedTinyIRReceiver

Este o adaptare a bibliotecii tinyIRReceiver (varianta low-specs a clasicii IRReceiver) care contine doar logica necesara protocolului meu de comunicare dintre telecomanda si microprocesor.

StarlightHeadliner

Contine setup si loop, controleaza intreaga activitate a microprocesorului.

Codul este disponibil atat pe linkul de github cat si in sectiunea de Downlaods. Mediul de dezvoltare: Arduino IDE 2.1.0 Biblioteci utilizate: “Adafruit_NeoPixel” pentru controlul ledurilor si o varianta adaptata de mine a “tinyIRReceiver”.

Principiul de utilizare: interactionez cu modulul creat prin folosirea unei telecomenzi (stiu, nu e la fel de cool ca o aplicatie Bluetooth, dar din ratiuni de utilizare in masina, sa nu zic in mers, este mult mai comoda interactiunea prin telecomanda); ca sa evit polling-ul in loop, am decis sa leg receiverul IR la pinul PD2 pentru a putea genera intreruperi cand se initiaza comunicarea si a trata separat aceste eveniment. Aici a aparut prima problema: biblioteca default IRReceiver foloseste deja intreruperi pentru a esantiona datele de la receiver, ceea ce se incurca cu rutina mea de intrerupere si, ocazional, se repeta de 10-15 ultima tasta tratata la fiecare noua apasare. Am reusit sa rezolv problema modificand o biblioteca publica TinyIRReceiver, facand-o sa lucreze strict pentru modul meu de utilizare, folosind protocolul NEC de comunicare: foloseste un automat de stari care se actualizeaza la fiecare tranzitie a pinului de comunicatie si, daca se identifica o secventa corecta de date, executa o functie callback care primeste comanda decodificata si poate trata corect intentia utilizatorului. Abordarea mea a fost sa salvez comanda decodificata si sa notific functia loop sa o trateze setand flagul “modeChange”, pentru a nu bloca executia procesorului prea mult timp. Fiecare buton de pe telecomanda are o codificare particulara, asa ca functia de tratare a schimabrii de mod de iluminare va face match pe una dintre taste si va schimba parametrii aferenti in program. Tastele 1-3: moduri statice de iluminare
Tastele 4-6: mod twinkle pe intregul plafon
Tastele 7-9: mod twinkle pe jumatate de plafon si static pe cealalta jumatate
Tastele *, 0 si #: selectia unei jumatati sau a intregului plafon (pentru a schimba culoarea sau intensitatea)
Sageata sus-jos: schimba intensitatea
Sageata stanga-dreapta: schimba culoarea
Tasta OK: modul Music Reactive

Modul Twinkle trece circular si ciclic prin discul de leduri si diminueaza intensitatea fiecaruia pe masura ce se indeparteaza de origine. Am folosit un timer ce poate fi setat sa cicleze prin disc la fiecare 0-1000 ms, in functie de cat de rapid imi doresc sa execut aceasta stare de fading. Va genera o intrerupere la finalul intervalului ce va fi tratata de executorul de Twinkle, acesta schimband originea cu o pozitie si actualizand starea ledurilor. Modul Music actualizeaza luminozitatea ledurilor in timp real in functie de nivelul sonor din masina. Am setat canalul B al timerului 1 sa genereze o intrerupere de 10 ori pe secunda care porneste ADC-ul, setat sa functioneze pe 8 biti (valori 0-255 pentru ca si luminozitatea ledurilor este in aceeasi plaja de valori). Am decis sa nu scad sub o intensitate minima de 4%, ca sa nu se stinga complet ledurile, iar fiecare schimbare de intensitate sa se realizeze la 75% din diferenta, ca sa nu fie prea bruste.

Rezultate Obţinute

Pozele urmatoare releva evolutia plafonului. Organizarea celor 475 de fibre optice a fost cea mai mare provocare. Am impartit plafonul in 14 zone egale, cate doua pentru fiecare LED in parte (2 module de cate 7 leduri), astfel ca fiecare astfel de bucata poate fi controlata individual si precis pentru diferitele jocuri de lumini. Toate fibrele au fost prinse in fasunguri imbracate in banda izoliera pentru a minimiza pierderile de lumina. Gaurile au fost realizate manual, ulterior fiecare fibra trasa prin locasul ei si lipita in capat. In final, toate fibrele au fost taiate la nivel cu plafonul.

In plus fata de cele deja prezentate, pentru ca urmeaza sa-l montez chiar pe masina mea, i-am mai adaugat microprocesorului o functionalitate: porneste automat senzorii de parcare si camera frontala atunci cand detecteaza ca masina a iesit din marsarier. Alimentarea acestora era deja trecuta de mine printr-un releu cu mentinere (bistabile - la fiecare apasare de buton schimba starea si o mentine), asa ca microprocesorul nu trebuie decat sa astepte o intrerupere generata de un front descrescator pe firul legat la semnalul de marsarier (acesta este HIGH cand marsarierul e cuplat si LOW in rest) si sa traga la masa semnalul de comanda al releului (printr-un tranzistor), mimand astfel o apasare de buton. Dupa 10 secunde va stinge releul. In aceasta poza, mascat foarte frumos, se regaseste releul cu pricina (in mijloc dreapta, stiu, nu se vede, dar exista):

Concluzii

Ma bucur ca proiectul de la PM m-a ambitionat sa-mi creez propria versiune a modelului de lumini in plafon dezvoltat initial de Rolls-Royce, in loc sa achizitionez un produs chinezesc, cu mai putine functii decat ce am reusit sa dezvolt eu, si, desigur, la un pret mai mare. Am reusit sa-mi demonstrez ca da, se poate si acasa, nu doar la atelier cu un pret estimat de la 3000 ron pentru operatiile facute!

Download

Link drive

Jurnal

Bibliografie/Resurse

Resursele folosite sunt urmatoarele: