La Arduino se conecteaza prin serial UART un Raspberry Pi care ruleaza un server web simplu (scris in Python). De pe pagina web se pot trimite request-uri care vor fi pasate mai apoi pe serial catre Arduino. De asemenea, la placuta se mai leaga cateva butoane pentru a putea controla si fizic luminile.
Felul in care functioneaza majoritatea benzilor LED (cel putin cele fara LED-uri adresabile individual) functioneaza pe baza a 4 pini:
Se poate observa lipsa unui pin GND. Practic, cand un canal de culoare este la valoarea 12V, canalul este stins, iar cu cat este mai aproape de GND se lumineaza mai tare. Faptul ca plaja de tensiune este 0-12V ma impiedica din a folosi PWM-ul integrat in Arduino, iar aici un MOSFET se comporta ca o rezistenta variabila. Cu cat tensiunea intre gate si drain creste, cu atat “rezistenta” este mai mica. In traducere libera, aplicand un semnal intre 0-5V intre gate si drain, tensiunea intre source si drain scade de la 12 la 0V, oferindu-mi comportamentul pe care il caut.
Releul, cand este oprit intrerupe alimentarea directa a benzii LED (taie GND-ul), iar cand este pornit inchide circuitul.
Am folosit serverul HTTP gasit standard in modulul de Python (3.7) http.server, alaturi de modulul serial. Server-ul HTTP stie sa handle-uiasca request-uri de tip GET cu 3 parametri (r, g si b). Indiferent de request-ul GET primit va fi afisata:
Apasarea unui buton face o cerere pentru aceeasi pagina cu parametrii corespunzatori culorii apasate. Pagina e foarte usor de personalizat si se pot adauga repede mai multe culori predefinite, dar ramane libera posibilitatea unei culori cu 3 valori unice, in cazul in care culoarea dorita nu se regaseste in vreun buton.
Server-ul parseaza cererea si trimite prin serial mai departe un mesaj in formatul xxx#yyy#zzz, unde x, y si z sunt valorile RGB.
Arduino-ul citeste mesajul primi pe Serial de la Raspberry Pi si il parseaza. Folosind PWM transmit semnalul pe pini digitali mai departe catre tranzistoarele MOS. Ma folosesc de asemenea si de intreruperi pentru a activa/dezactiva releul
Banda LED este alimentata de o sursa de tensiune de 72W (12V 6A), Raspberry Pi poate fi alimentat doar prin USB-C de catre orice port USB de 5V (curentul tras este foarte mic, majoritatea incarcatoarelor de telefon ar functiona). Arduino-ul isi trage curent prin UART-USB de la Raspberry Pi.
Video prezentare: https://youtu.be/V2oe8E64fo8
Sunt cateva idei care puteai fi implementate cu costul a mai multe ore de munca, cum ar fi o aplicatie Android (luminile pot fi controlate din telefon intrand pe pagina asociata serverului web - am reusit sa o fac vizibila din exterior folosind DNS-ul oferit de Digi si port forwarding). De asemenea, cred ca un mic touchscreen mic ar fi putut fi folosit pentru a controla mai direct luminile. Daca ar fi sa fac inca o data proiectul la PM, as alege tot aceasta tema deoarece m-am ales cu niste lumini care chiar au ajuns sa imi decoreze camera :).