Persistance of Vision Display

Realizat de Lazar Ionut-Radu, 333CA

Introducere

Principiul

Display-ul de tip Persistance of Vision (POV) se bazeaza pe iluzia optica care ne permite sa percepem lumina o perioada scurta de timp dupa disparitia ei. Astfel, daca un LED este stins/aprins destul de rapid ochiul percepe lumina continua.

Descriere Sumara a Ansamblului

Cu acest lucru in minte, display-ul este alcatuit dintr-o banda cu 12 LED-uri dispusa pe raza unui suport circular, care va fi montat pe un motor.

[See the masterful diagram below]

Micro-controller-ul ce comanda banda este, de asemenea, plasat pe suportul ce va fi rotit, alaturi de un hall sensor care informeaza micro-controller-ul cand a fost completata o rotatie (cu un magnet fixat in apropiere, inafara ansamblului rotit).

Pentru a rezolva problema alimentarii componentelor in miscare folosesc o pereche receptor-transmitator de incarcare wireless prin inductie. Bobina receptorului este montata pe spatele suportului, centrat in jurul axului motorului, iar transmitatorul este atasat similar, pe suportul motorului.

Atat motorul cat si transmitatorul sunt alimentate cu baterii AA 1.5V, motorul folosind 8 iar transmitatorul 4. Pe aceste doua fire am pus cate un intrerupator.

Motorul este furat dintr-un aspirator de masina, si carcasa in care sta motorul si bateriile este facuta dintr-o teava de pvc si carcasa motorului.

Componentele Necesare

Pentru proiectul meu am folosit urmatoarele:

  • Arduino Nano
  • banda LED adresabila WS2812b
  • senzor Hall KY-003
  • modul incarcare wireless transmitator T3168 si receptor XKT-510
  • motor 12V de tip necunoscut
  • baterii AA 1.5V
  • fire
  • magnet

Componente care nu au legatura cu cablajul:

  • O rigla (din care este facut suportul pe care se invart LED-urile)
  • teava de PVC (in care stau bateriile si care este stativ, «nu recomand utilizarea lui ca stativ» )
  • un aspirator de masina (avea deja suportul de motor & intrerupator)

Hardware Design

La un capat al carcasei se afla senzorul Hall care detecteaza un magnet plasat pe carcasa. Acesta este conectat la pinul D2 al placutei arduino. Cand detecteaza magnetul este trimisa o intrerupere; in acest mod se calculeaza viteza de rotatie (necesara pentru timing-ul led-urilor) & se afla momentul in care se termina o rotatie.

Restul cablajului de pe suportul care se roteste este straight-forward: Se conecteaza GND-ul si VCC-ul receptorului la placuta Arduino, la linia de LED-uri si la senzor. Poate chiar mai simplu este cablajul din carcasa, in care doar am conectat firele unor carcase de baterii la transmitator respectiv motor. In cazul motorului am conectat doua carcase de baterii (voiam 8 baterii, now I am afraid for my life).

Software Design

Senzorul Hall, in momentul in care ajunge in dreptul magnetului, produce o intrerupere software care are scopul de a calcula perioada in care se produce o rotatie completa, respectiv momentul in care se produce:

attachInterrupt(digitalPinToInterrupt(2), hall_func, FALLING);

Primul parametru este pinul folosit, al doilea functia apelata pentru tratarea intreruperii iar al treilea parametru momentul in care se produce intreruperea; cand valoarea citita de senzor trece din high in low, adica in primul moment in care este detectat magnetul (senzorul are 1 la iesire cand nu se detecteaza nimic)

int step = 0;
unsigned long time; 
unsigned long freq; 

void hall_func() {
  step = 0;

  unsigned long now = millis();
  freq = now - time;
  time = now;
}

Variabila step contorizeaza numarul de aprinderi ale benzii de LED-uri in rotatia respectiva. Folosindu-ma de functia millis() alfu perioada in care se face o rotatie completa (pe care o folosesc la calculul delay-ului dintre doua aprinderi de LED-uri)

Mai jos o poza (pt ca nu pot video) cu rezultatul simplut al codului:

Modificari Posibile

Pentru o demonstratie mai serioasa si complexa decat cea a mea ar putea fi de folost adaugarea unui debouncer pentru output-ul senzorului (or at least pozitionarea mai apropiata a magnetului), evitarea functiei delay(), pentru posibilitatea unui delay mai scurt si folosirea timerilor pentru calculul rpm.

Concluzie

Chiar daca nu este nici cel mai bun proiect, nici cel mai bun proiect folosind persistance of vision este cel putin un prototip reusit, a carui implementare poate fi imbunatatita substantial chiar si in forma lui curenta. Este extrem de rewarding munca la un proiect hands-on, let alone unul care are la baza timing precis, ca in acest caz.

Mai jos lista de probleme ca sa terminam cum trebuie:

  • am topit un suport de baterii pentru ca le-am legat la receptor nu la transmitator
  • am rupt rigla (suportul care se roteste) cat timp se invartea (tot raul spre bine, era mult prea grea inainte)
  • not really a problem, cea mai buna modalitate de a taia plastic este cu o dalta incinsa
  • am facut cablajul de vreo 3 ori, nu inteleg unde era scurt, se aprindeau ledurile fara firul de date conectat
  • second time s-a rupt rigla, l-am lipit cu hyper-glue, ar fi fost fatal sa nu, era iteratia finala.
  • am vrut putere, am primit putere: 8 baterii par cam multe, mom come pick me up I'm scared.
pm/prj2024/amocanu/123588.txt · Last modified: 2024/05/27 18:37 by ionut_radu.lazar
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