Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2022:dene:recording-3-octave-piano [2022/05/25 18:15]
mircea.timpuriu [Descriere generala]
pm:prj2022:dene:recording-3-octave-piano [2022/06/01 15:16] (current)
mircea.timpuriu [Download]
Line 45: Line 45:
   * Fire, legaturi   * Fire, legaturi
  
-===== Software ​Design ​=====+==== Schema electrica ==== 
 + 
 +Schema hardware a fost realizata conform cu schema bloc prezentata anterior. In urmatoarele scheme vor fi prezentate in detaliu conexiunile dintre placuta Arduino si elementele exterioare. 
 + 
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_schema_electrica_1.png?​800|}} 
 + 
 +In prima imagine sunt descrise conexiunile placii Arduino cu ecranul LCD (respective rezistorul si potentiometrul aferente), dar si cu buzzer-ul. Buzzer-ul este legat la pin-ul digital 5 si la GND, iar pinii conectati la LCD sunt dupa cum urmeaza: pin-ul de enable este pin-ul digital 4, pin-ul de register select este pin-ul digital 13, iar ca pini de date au fost folositi pinii analogici de la 0 la 3(pinii 14-17), folositi ca pini digitali. De asemenea se vede conexiunea cu sursa de putere. 
 + 
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_schema_electrica_2.png?​800|}} 
 + 
 +A doua imagine descrie conexiunile clapelor, butoanelor de control si potentiometrelor de control ale pianului cu placuta Arduino. Cele 7 clape sunt conectate la pinii digitali de la 6 la 12, cele doua butoane de control la pinii digitali 2-3, iar potentiometrele la pinii analogici A4-A5 (18-19). 
 +Imaginea intreaga de ansamblu a schemei electrice este disponibila in sectiunea Download. 
 +===== Software ​design ​===== 
 + 
 +Software-ul a fost scris in IDE-ul Tinkercad in faza incipienta, dupa care a fost continuat in Arduino IDE. Componenta software este reprezentata de fisierul recording_3_octave_piano.ino,​ care contine urmatoarele functii: 
 +  * setup(), care initializeaza clapele, butoanele de control, dar si intreruperile pentru timer si potentiometer 
 +  * loop(), prin care se citesc valorile potentiometrelor 
 +  * ISR(TIMER1_COMPA_vect),​ declansat la fiecare 10ms, care se ocupa de recunoasterea si stocarea notelor muzicale in timpul inregistrarii si a redarii, dar si de initializarea intreruperilor pentru butoanele de control 
 +  * ISR(INT1_vect),​ declansat la apasarea butonului REC, porneste inregistrarea 
 +  * ISR(INT0_vect),​ declansat la apasarea butonului PLAY, porneste redarea inregistrarii 
 +  * ISR(ADC_vect),​ care afla valorile potentiometrelor de control, si modifica gama de note disponibile,​ respectiv tempo-ul. 
 + 
 +Pianul a fost programat astfel incat sa emita sunete monofonice, iar logica programului este urmatoarea: la fiecare intrerupere generata de Timer1, adica la fiecare 10ms, se va verifica daca este apasata vreo clapa.  
 +  * Daca este apasata o clapa cand la ultima intrerupere nu era apasata nicio clapa, programul va incepe sa contorizeze durata de timp a apasarii acelui buton, cu cate 10ms la fiecare intrerupere.  
 +  * Daca o clapa este apasata, iar la urmatoarea intrerupere se sesizeaza alta clapa apasata, programul va renunta la contorizarea primei clape si va incepe sa o contorizeze pe a doua.  
 +  * Daca se sesizeaza ca nicio clapa nu este apasata, cand la intreruperea anterioara erau clape apasate, programul va incepe sa contorizeze o nota “silentioasa”,​ cu frecventa 0, care sa simbolizeze pauze intre note.  
 + 
 +In functia de intrerupere ISR(TIMER1_COMPA_vect),​ sunt initializate intreruperile pentru butoanele de control, asa ca, daca in timpul unei intreruperi,​ este sesizata apasarea butonului REC, va incepe inregistrarea,​ si se va opri redarea, stergandu-se inregistrarea anterioara, daca este cazul, iar daca se apasa butonul PLAY, se va opri si se va reda inregistrarea.  
 + 
 +In timpul inregistrarii,​ retinerea se va face in felul urmator: daca o clapa a fost apasata si contorizata,​ dar fie a fost apasata alta clapa, fie a fost luat degetul de pe clapa, ambele fiind actiuni care declanseaza oprirea contorizarii,​ se va lua frecventa clapei apasate, dar si durata de timp contorizata,​ si se vor salva in 2 array-uri. La fel si in cazul notei silentioase,​ daca se apasa o clapa, se va lua frecventa 0 si durata de timp a ei si se vor introduce in array. Inregistrarea se opreste fie la apasarea butonului PLAY, fie dupa 10 secunde de la inceperea inregistrarii. 
 + 
 +In timpul redarii, array-urile vor fi parcurse pentru a reda melodia inregistrata. Cand o nota urmeaza la rand, se ia durata acesteia si se imparte la valoarea tempo-ului. Dupa care, la fiecare 10ms, se va reda prin buzzer acea nota (sau nota silentioasa,​ dupa caz), si se va scadea din durata de redare a notei, pana cand scade sub 0, moment in care va fi redate urmatoarea nota din array. 
 + 
 +Citirea potentiometrelor de control este comandata in functia loop(), si realizata in functia ISR(ADC_vect). Valorile celor doua potentiometre sunt citite constant, pentru a observa eficient modificarea acestora, si implicit, a parametrilor pe care ii controleaza. In functia ISR(ADC_vect),​ dupa ce se identifica pin-ul in cauza, se calculeaza in functie de valoarea potentiometrului fie gama de note(de la C3 la B5), fie tempo-ul (de la 0.5x la 2x), schimbari care se pot observa in timp real, in cazul inregistrarii si a redarii. 
 + 
 +Ecranul LCD este programat sa arate in partea stanga valorile celor 7 note la momentul respectiv (modificabile prin potentiometru),​ in dreapta jos tempo-ul, iar in dreapta sus starea de functionare a pianului (nimic: interpretare libera, REC: inregistrare,​ STOP: inregistrare oprita, interpretare libera, PLAY: redarea inregistrarii).  
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
 +Schema fizica finala obtinuta a proiectului este prezentata in urmatoarele imagini:
  
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_schema_fizica_1.png?​800|}}
 +
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_schema_fizica_2.png?​800|}}
 ===== Concluzii ===== ===== Concluzii =====
  
 +A fost un proiect interesant de realizat. Am intampinat anumite obstacole pe parcurs, cum ar fi improvizarea pinilor pentru ecranul LCD, si principiul de functionare al acestuia, dar mai ales cu memoria de inregistrare a placutei Arduino si  impactul pe care l-a avut asupra functionarii buzzer-ului,​ dar, in ciuda acestor probleme intampinate,​ sunt multumit de rezultatul final.
 ===== Download ===== ===== Download =====
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_cod_sursa_final.zip| Codul sursa al proiectului}}
  
 +{{:​pm:​prj2022:​dene:​timpuriu_mircea_schema_electrica.zip| Schema electrica a proiectului}}
 ===== Jurnal ===== ===== Jurnal =====
  
   * 29.04.2022: Alegere tema si consultare cu laborantul   * 29.04.2022: Alegere tema si consultare cu laborantul
   * 11.05.2022: Creare pagina wiki   * 11.05.2022: Creare pagina wiki
 +  * 18.05.2022: Obtinerea pieselor si inceputul proiectului fizic
 +  * 27.05.2022: Finalizare documentatie
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
 +
 +[[https://​www.arduino.cc/​en/​Tutorial/​LibraryExamples/​HelloWorld| LCD 1602]]
 +
 +[[https://​github.com/​robsoncouto/​arduino-songs| Buzzer si note muzicale]]
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
  
pm/prj2022/dene/recording-3-octave-piano.1653491751.txt.gz · Last modified: 2022/05/25 18:15 by mircea.timpuriu
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