This is an old revision of the document!


Programmable LED matrix

Autor

Introducere

Scopul proiectului este realizarea unui sistem ce permite scrierea unor scripturi pe un card SD si rularea acelor scripturi pe o matrice LED. Scripturile pot definii exact led-urile care se aprind pe matrice dar pot contine si functionalitati predefinite precum: ora curenta data printr-un modul RTC, sau intensitatea frecventelor audio receptate printr-un microfon. Scripturile pot fi selectate folosind un button, iar scriptul curent va fi afisat pe un display LCD.

Descriere generala

Schema bloc

`

Hardware design

  • Arduino UNO
  • Matrice LED
  • Modul card SD
  • Microfon
  • Modul RTC
  • Buton x 2
  • Display LCD

Software design

Scripts

Un script acceptat este un fisier text cu urmatorea structura:

  • pe prima linie N, un numar intre 0 - 255 care reprezinta numarul de “faze” (o faza descrie starea fiecarui led din matrice la un moment)
  • pe a doua linie D, un numar > 20 care reprezinta numarul de ms asteptate intre 2 faze consecutive (sau durata pentru care o faza sta pe matrice)
  • pe urmatoarele N linii, caracterul “|” urmat de descrierea fazei

O faza poate fi descrisa in urmatoarele moduri:

  • 32 de numere intre 0 - 255, unde fiecare reprezinta starea unei coloane a matricei
  • sirul “clock” care va afisa ora curenta pe matrice
Optimizare Memorie

Cea mai frecventa problema intalnita in dezvoltarea software a fost epuizarea SRAM-ului. In acest sens am luat urmatoarele decizii de implementare:

  1. La setup, cardul SD este scanat si sunt salvate numele primelor 8 scripturi gasite in directorul script/
  2. Pentru scriptul curent, sunt retinute in memorie doar numarul de faze, timpul asteptat intre faze si o structura File
  3. Atunci cand scriptul curent este schimbat, este inchisa structura File a scriptului vechi si deschisa pentru scriptul nou
  4. Array-urile constante de tip look-up table sunt puse in PROGMEM
  5. Pentru analiza spectrului audio, folosesc un algoritm optimizat de FFT care ruleaza pe 64 de samples de la microfon
Optimizare Matrice

O alta problema a fost modul in care afisez pe matrice. Biblioteca LedControl pe care am folosit-o pune la dispozitie mai multe fucntii de afisare, printre care setColumn si setRow.

Functia setColumn ar fi optima pentru cazul meu de utilizare (atat pentru scripturi cat si pentru afisarea frecventelor generate de FFT), insa din testele mele, aceasta functie este mult prea lenta. Pentru a seta toate cele 32 de coloane, are nevoie de peste 200 ms, pe cand functia setRow poate seta 32 de randuri de cate 8 led-uri in aproximativ 4 ms.

Pentru a rezolva aceasta problema, folosesc un buffer in care traduc manual cele 32 de coloane in 32 de randuri compatibile cu functia setRow.

Folosirea unui buffer permite si optimizarea incarcarii unei faze din fisier. Dupa ce faza curenta este afisata pe matrice, se poate incepe incarcarea urmatoarei faze in buffer, iar timpul pierdut pentru citirea din fisier poate fi substras din timpul asteptat intre faze. Astfel se asigura ca scriptul va rula la o viteaza constanta si alease de utilizator, fara a fi influentat de durata operatiilor IO.

Rezultate obtinute

Am reusit sa implementez toate functionalitatile dorite, iar rezultatul final este unul calitativ din punctul meu de vedere.

Exemplu musica

lexmatrix_example1.jpeg

Exemplu faza script

lexmatrix_example2.jpeg

Concluzii

Proiectul a fost usor de implementat din punct de vedere hardware, dar mai complicat din punct de vedere software, in special datorita problemelor cu memoria.

Folosind o placa de dezvoltare cu mai multa memorie (cum ar fi un arduino mega), calitatea frecventelor audio calculate de FFT ar fi putut fi imbunatatite substantial prin cresterea numarului de samples de microfon.

Scripturile ar fi putut sa fie mai prietenoase, insa forma lor actuala reprezinta un compromis intre performanta (citire/afisare) si user experience. Un mod de a maximiza user experience ulterior ar fi implementarea unei aplicatii desktop/web care sa contina un gui care sa poate genera mai usor scripturile.

Totusi, sunt multumit de calitatea finala proiectului si am invatat foarte multe in implementarea sa.

Bibliografie/Resurse

Download

pm/prj2022/sgherman/ledmatrix.1653471369.txt.gz · Last modified: 2022/05/25 12:36 by mihnea.buzatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0