This shows you the differences between two versions of the page.
pm:prj2024:vstoica:mihai.pandelica [2024/05/27 08:24] mihai.pandelica [Hardware Design] |
pm:prj2024:vstoica:mihai.pandelica [2024/05/27 22:05] (current) mihai.pandelica [Software Design] |
||
---|---|---|---|
Line 12: | Line 12: | ||
=== Schemă bloc === | === Schemă bloc === | ||
- | {{:pm:prj2024:vstoica:mihai_pandelica_diagrama_bloc.png?600|}} | + | {{:pm:prj2024:vstoica:mihai_pandelica_diagrama_bloc_final.png?600|}} |
=== Descriere === | === Descriere === | ||
Line 52: | Line 52: | ||
* Display OLED 1.3 inch | * Display OLED 1.3 inch | ||
* Modul Audio Tone Tunning | * Modul Audio Tone Tunning | ||
+ | * Modul Amplificator Audio | ||
* Potențiometru liniar | * Potențiometru liniar | ||
* Butoane | * Butoane | ||
Line 57: | Line 58: | ||
=== Schemă electrică === | === Schemă electrică === | ||
- | {{:pm:prj2024:vstoica:mihai_pandelica_schema_electr.png?500|}} | + | {{:pm:prj2024:vstoica:mihai_pandelica_hardware.png?700|}} |
Conectarea componentelor: | Conectarea componentelor: | ||
Line 99: | Line 100: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | GitHub: [[https://github.com/lucianpandelica/Sound-mixer]] |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
</note> | </note> | ||
+ | |||
+ | Mediu de dezvoltare: PlatformIO, Visual Studio Code | ||
+ | |||
+ | Biblioteci utilizate: | ||
+ | * Petit FatFs - FAT file system library: pentru citirea melodiilor de pe cardul microSD | ||
+ | * C Library for SSD1306 0.96" OLED display: pentru afișarea informațiilor pe display | ||
+ | |||
+ | Detalii implementare: | ||
+ | * Citirea butoanelor se face folosind întreruperi de tip pin-change interrupt și rezistențele de pull-up interne. | ||
+ | * Pentru citirea potențiometrului liniar am folosit funcția implementată în laboratorul de ADC (myAnalogRead). | ||
+ | * Pentru citirea de pe cardul microSD am folosit scheletul și implementarea din laboratorul de SPI, pe care l-am modificat pentru a adăuga funcționalități noi / a oferi suport pentru cazuri netratate. | ||
+ | * Pentru afișarea pe display prin I2C am folosit funcțiile din biblioteca menționată mai sus. | ||
+ | * Redarea melodiei, afișarea timpului parcurs în redarea acesteia și debounce-ul butoanelor se realizează folosind timere. | ||
+ | * Redarea melodiei se realizează prin output PWM al Timer1. | ||
+ | |||
+ | Programul configurează pentru început toate elementele folosite în implementare (butoane, întreruperi, timere, display, ADC). Apoi, se montează sistemul de fișiere de pe card folosind funcțiile din biblioteca Petit FatFs. Într-o buclă for se verifică în mod constant dacă valoarea citită de ADC (shiftată pentru a intra în intervalul 0-7) și-a modificat valoarea. Tot aici se verifică dacă unul dintre cele trei butoane a fost apăsat (s-a setat un flag de apăsare pentru butonul respectiv în întrerupere), iar în caz afirmativ se deviază execuția spre funcțiile aferente. | ||
+ | |||
+ | Pentru schimbarea melodiei se apelează funcția next_file(), iar pentru redarea ei funcția play(). Butonul de stop este verificat (și are efect) în cadrul funcției continue_play() utilizată în funcția play() - toate aceste funcții fiind implementate în laboratorul de SPI. | ||
+ | |||
+ | Timer-ul 2, configurat să numere milisecunde, este utilizat pentru efectuarea debounce-ului pentru butoane (reținem timpul global la care a fost apăsat un buton și verificăm dacă diferența dintre timpul global actual și cel reținut la apăsare este mai mare decât un prag setat prin experimentare). Timer-ul 1 este folosit pentru FastPWM pe 8 biți, pentru redarea melodiei. Timer-ul 0 este folosit pentru citirea melodiei de pe card, mai exact pentru avansarea bufferului în care citim octeții. | ||
+ | |||
+ | Viteza de redare a melodiei este modificată prin schimbarea sample rate-ului, înainte de începerea citirii unui fișier. Astfel, este luată în calcul valoarea citită de ADC și introdusă într-o formulă care să crească viteza proporțional cu valoarea indicată de potențiometru. | ||
+ | |||
+ | Durata de redare a melodiei curente este și ea manipulată în funcție de tempo, pentru a ilustra realitatea (doar o aproximare, rezultatul nu este exact). | ||
+ | |||
+ | De menționat că am încercat folosirea output-ului pe 16 biți pus la dispoziție de Timer 1 pentru a obține o redare la calitate mai bună, dar am întâmpinat dificultăți în adaptarea codului existent și am abandonat ideea pentru a mă concentra pe alte aspecte din implementare. | ||
+ | |||
+ | Am folosit exclusiv lucru cu registrii în implementarea proiectului, cu excepția folosirii bibliotecii pentru display. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Ansamblul obținut nu este tocmai ușor portabil, așa cum îl imaginam inițial (din cauza necesității sursei de alimentare), dar cu excepția acesteia are dimensiuni reduse. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | {{:pm:prj2024:vstoica:mihai_pandelica_poze_proiect.png?600|}} |
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Prin acest proiect am învățat extrem de multe lucruri noi, mai ales când vine vorba de hardware (de la lipit pinii pentru o componentă la studiat dacă o componentă se poate adapta de la curent alternativ la continuu), iar, mai ales, am învățat să găsesc soluții folosind ceea ce am deja la dispoziție (de exemplu, alternativa la folosirea sursei de alimentare de la un PC vechi era achiziționarea unui transformator cu tole care, pe lângă faptul că avea timpi de livrare de ordinul săptămânilor, costa și destul de mult:) | ||
===== Download ===== | ===== Download ===== | ||
- | {{:pm:prj2024:vstoica:mihai_pandelica_proiect.zip|}} | + | {{:pm:prj2024:vstoica:mihai_pandelica_proiect_pm.zip|}} |
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 124: | Line 150: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf]] | ||
+ | * [[https://www.circuito.io/blog/arduino-uno-pinout/]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab0-2023]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab5-2023-2024]] | ||
+ | * [[https://github.com/Matiasus/SSD1306]] | ||
+ | * [[https://github.com/greiman/PetitFS]] | ||
+ | * [[https://en.wikipedia.org/wiki/Power_supply_unit_(computer)]] | ||
<note> | <note> |