This shows you the differences between two versions of the page.
pm:prj2021:apredescu:pov-display [2021/06/01 18:21] andrei.carapcea [Software design] |
pm:prj2021:apredescu:pov-display [2021/06/02 22:50] (current) andrei.carapcea [Timer1 si modul de functionare] |
||
---|---|---|---|
Line 88: | Line 88: | ||
[[http://www.techydiy.org/arduino-pov-display/ | techydiy.org POV Display]] | [[http://www.techydiy.org/arduino-pov-display/ | techydiy.org POV Display]] | ||
- | Ideea de baza a proiectului este urmatoarea: | + | ==== Configurare display ==== |
Atunci cand linia de pixeli se roteste, aceasta urmareste traiectoria unui cerc. Acest cerc poate fi discretizat, eu am ales sa il impart in 64 de unghiuri egale. Astfel, fiecare unghi poate fi considerata o "coordonata" pentru LED-uri, avand o valoare asociata in fiecare din cele 64 din unghiuri. | Atunci cand linia de pixeli se roteste, aceasta urmareste traiectoria unui cerc. Acest cerc poate fi discretizat, eu am ales sa il impart in 64 de unghiuri egale. Astfel, fiecare unghi poate fi considerata o "coordonata" pentru LED-uri, avand o valoare asociata in fiecare din cele 64 din unghiuri. | ||
Line 115: | Line 115: | ||
Astfel, se poate scrie orice caracter pe display-ul POV. | Astfel, se poate scrie orice caracter pe display-ul POV. | ||
+ | |||
+ | ==== Modul de conectare ==== | ||
Pinout Arduino Nano: | Pinout Arduino Nano: | ||
- | {{:pm:prj2021:apredescu:nano-pinout.jpg?700|}} | + | {{:pm:prj2021:apredescu:800px-arduino-nano-pinout.png?700|}} |
+ | |||
+ | [[https://commons.wikimedia.org/wiki/File:Arduino-nano-pinout.png | Sursa Arduino Nano pinout]] | ||
Am ales sa conectez LED-urile astfel incat sa ocupe fix portul PD (PD0-PD7 sau D2-D7 + D1, D0, adica RX0 si TX1). Astfel, pentru a modifica starea LED-urilor, se scrie direct valoarea retinuta in memorie in PORTD. | Am ales sa conectez LED-urile astfel incat sa ocupe fix portul PD (PD0-PD7 sau D2-D7 + D1, D0, adica RX0 si TX1). Astfel, pentru a modifica starea LED-urilor, se scrie direct valoarea retinuta in memorie in PORTD. | ||
Senzorul magnetic Hall este conectat la D8, care are ICP1 (Input Capture Unit). ICP1 este folosit in cadrul timer-ului 1 pentru a calcula perioada de rotatie. | Senzorul magnetic Hall este conectat la D8, care are ICP1 (Input Capture Unit). ICP1 este folosit in cadrul timer-ului 1 pentru a calcula perioada de rotatie. | ||
+ | |||
+ | ==== Timer1 si modul de functionare ==== | ||
Timer 1 este configurat astfel: | Timer 1 este configurat astfel: | ||
Line 137: | Line 143: | ||
// input capture interrupt enable | // input capture interrupt enable | ||
- | TIMSK1 = (1 << ICIE1) | + | TIMSK1 = (1 << ICIE1); |
// enable output compare A match interrupt | // enable output compare A match interrupt | ||
- | TIMSK1 |= (1 << OCIE1A) | + | TIMSK1 |= (1 << OCIE1A); |
// timer overflow interrupt enable | // timer overflow interrupt enable | ||
TIMSK1 |= (1 << TOIE1); | TIMSK1 |= (1 << TOIE1); | ||
Line 149: | Line 155: | ||
se retine contorul curent al timer-ului in ICR1, si se intra in ISR-ul TIMER1_CAPT_vect. In acest ISR, se reseteaza counter-ul la 0 si indexul din vectorul de afisat. Se calculeaza perioada de rotatie impartind ICR1 la 64 (si tinand cont de cate overflow-uri s-au produs pana atunci), si pune aceasta valoare in registrul OCR1A. | se retine contorul curent al timer-ului in ICR1, si se intra in ISR-ul TIMER1_CAPT_vect. In acest ISR, se reseteaza counter-ul la 0 si indexul din vectorul de afisat. Se calculeaza perioada de rotatie impartind ICR1 la 64 (si tinand cont de cate overflow-uri s-au produs pana atunci), si pune aceasta valoare in registrul OCR1A. | ||
- | Acum, pentru fiecare unghi din cele 64, se va intra pe ISR-ul TIMER1_COMPA_vect, unde se poate afisa starea curenta a LED-urilor si se poate incrementa indicele in vectorul de afisare. | + | Acum, pentru fiecare unghi din cele 64, se va intra pe ISR-ul TIMER1_COMPA_vect, unde se poate afisa starea curenta a LED-urilor si se poate incrementa indicele in vectorul de afisare. La final, se actualizeaza OCR1A pentru a genera o intrerupere la urmatorul unghi. |
+ | De asemenea, am folosit un "frame buffer" pentru a afisa textul. Astfel, nu apar artefacte atunci cand se actualizeaza configuratia display-ului si se afiseaza o configuratie incompleta. | ||
Line 156: | Line 163: | ||
===== Rezultate obținute ===== | ===== Rezultate obținute ===== | ||
+ | |||
+ | Proiectul a fost finalizat cu succes. Efectul se vede bine cu ochiul liber. | ||
+ | |||
+ | Am realizat niste poze cu o expunere mai lunga pentru a evidentia fenomenul de persistence of vision: | ||
+ | |||
+ | Ceas analogic: | ||
+ | |||
+ | {{:pm:prj2021:apredescu:img_20210601_113701.jpg?300|}} | ||
+ | |||
+ | PM 2021: | ||
+ | |||
+ | {{:pm:prj2021:apredescu:pm-2021.jpg?300|}} | ||
+ | |||
+ | Afisare RPM curent: | ||
+ | |||
+ | {{:pm:prj2021:apredescu:rpm.jpg?300|}} | ||
+ | |||
+ | Pe filmari, efectul nu se vede la fel de bine, intrucat depinde mult de FPS. | ||
+ | |||
+ | |||
+ | Am facut si o filmare slow-motion pentru a evidentia mai bine modul in care isi schimba starea LED-urie. | ||
+ | |||
+ | [[https://www.youtube.com/watch?v=lnbqhCc3trI | Filmare POV display slow motion]] | ||
+ | |||
+ | [[https://www.youtube.com/watch?v=2-uD5XKbjIg | Filmare POV display ceas analogic]] | ||
+ | |||
+ | [[https://www.youtube.com/watch?v=q6oAxlLsWLQ | Filmare POV display afisare "Proiect PM", apoi "POV 2021"]] | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul a fost interesant si are un rezultat satisfacator vizual. | ||
+ | |||
+ | A fost o experienta placuta pe partea de hardware si de software. | ||
+ | |||
+ | Cea mai dificila parte a proiectului este echilibrarea partii rotative, mai ales daca nu se foloseste un motor suficient de puternic. | ||
+ | |||
+ | Posibilitati de extindere a proiectului: | ||
+ | * modul Bluetooth + aplicatie de mobil pentru configurarea modurilor de iluminare | ||
+ | * modul RTC pentru afisarea timpului in timp real | ||
+ | * folosirea unui sistem de transmisie a puterii wireless pentru a alimenta componentele de pe rotor | ||
===== Download ===== | ===== Download ===== | ||
+ | PDF: | ||
- | ===== Jurnal ===== | + | https://ocw.cs.pub.ro/courses/pm/prj2021/apredescu/pov-display?do=export_pdf |
- | 25-04-2021: Draft pagina wiki | + | |
+ | Cod: | ||
+ | |||
+ | {{:pm:prj2021:apredescu:pm-pov-display.zip|}} | ||
===== Bibliografie ===== | ===== Bibliografie ===== | ||
- | PDF: https://ocw.cs.pub.ro/courses/pm/prj2021/apredescu/pov-display?do=export_pdf | + | |
[[http://www.techydiy.org/arduino-pov-display/| techydiy POV display]] | [[http://www.techydiy.org/arduino-pov-display/| techydiy POV display]] | ||
+ | |||
+ | [[https://ocw.cs.pub.ro/courses/_media/pm/atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf | Datasheet atmega328p]] |