This shows you the differences between two versions of the page.
pm:prj2021:apredescu:pov-display [2021/06/01 18:22] andrei.carapcea [Software design] |
pm:prj2021:apredescu:pov-display [2021/06/02 22:50] (current) andrei.carapcea [Timer1 si modul de functionare] |
||
---|---|---|---|
Line 116: | Line 116: | ||
Astfel, se poate scrie orice caracter pe display-ul POV. | Astfel, se poate scrie orice caracter pe display-ul POV. | ||
- | ==== Timer1 si modul de functionare ==== | + | ==== 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 140: | 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 152: | 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 159: | 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]] |