This shows you the differences between two versions of the page.
pm:prj2023:danield:mini-tutorial-pentru-pian [2023/05/22 15:05] indra.catana |
pm:prj2023:danield:mini-tutorial-pentru-pian [2023/05/29 14:09] (current) indra.catana [Download] |
||
---|---|---|---|
Line 49: | Line 49: | ||
* Mediu de dezvoltare : Arduino IDE | * Mediu de dezvoltare : Arduino IDE | ||
- | * Librarii importate : LiquidCrystal_I2C.h pentru comunicarea cu ecranul LCD, Adafruit_NeoPixel.h pentru adresarea bandei led | + | * Librarii importate : LiquidCrystal_I2C.h pentru comunicarea cu ecranul LCD, Adafruit_NeoPixel.h pentru adresarea bandei led, Arduino Tone Library pentru redarea notelor muzicale |
+ | |||
+ | ==== Detalii de implementare ==== | ||
+ | |||
+ | In **setup()** am configurat pinii de input (butoanele corespunzatoare notelor muzicale si butonul corespunzator nivelului) si pinul de output (buzzer-ul), LCD-ul si banda led. | ||
+ | |||
+ | Am implementat functii separate pentru a //modulariza// codul, intrucat rationamentul folosit este identic in cele 5 nivele. | ||
+ | Functiile** playTone()** si **playNote()** sunt responsabile pentru redarea unui ton pe buzzer, respectiv a unei note muzicale. | ||
+ | Cu ajutorul functiei** playNivel()** se va reda secventa corespunzatoare nivelului selectat, aceasta primind ca input o serie de caractere care definesc notele muzicale si durata lor. | ||
+ | |||
+ | Functia **sing()** este responsabila cu functionalitatea "pianului", intrucat reda frecventa notei muzicale asociata butonului apasat cu ajutorul functiei **tone()** si afiseaza pe ecranul LCD denumirea acesteia. | ||
+ | |||
+ | Functiile **succesLed(), failedLed()** si **clearLed()** confera un feedback vizual utilizatorului referitor la redarea secventei auzite. | ||
+ | |||
+ | Functia **anotherBUtton()** primeste drept argument indicele butonului ce trebuie apasat si verifica daca un alt buton este apasat in schimb. | ||
+ | |||
+ | Intrucat folosim un timer pentru a masura timpul de reproducere a melodiei, functia **setupTimer()** se va ocupa de configurarea **Timer1**, iar **ISR(TIMER1_COMPA_vect)** va fi rutina de intrerupere este declansata atunci cand **timer-ul** atinge valoarea specificata în **registrul OCR1A**. | ||
+ | |||
+ | In functia **loop()** este implementat flow-ul programului: | ||
+ | - Mesaj de bun-venit afisat pe **ecranul LCD** | ||
+ | - Alegerea nivelului intr-un timp de 10 secunde ce va fi masurat folosind functia **millis()**. La fiecare apasare a butonului, nivelul va fi incrementat si utilizatorul va putea vedea cat timp mai are la dispozitie pentru alegere. | ||
+ | - Redarea melodiei corespunzatoare nivelului | ||
+ | - Indrumarea utilizatorului pentru a reproduce secventa auzita si feedback-ul in functie de corectitudinea rezultatului. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | {{ :pm:prj2023:danield:01430b05-23b6-47fa-ba11-678ef60a4054.jpeg?300 |}} |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | ||
- | ===== Download ===== | + | {{ :pm:prj2023:danield:7cdd7d27-03fc-45c2-95a0-b4583ddc5416.jpeg?300 |}} |
- | <note warning> | ||
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | {{ :pm:prj2023:danield:02d11e56-a886-4127-a22d-d26b7c85572d_1_.jpeg?300 |}} |
- | </note> | + | |
+ | |||
+ | {{ :pm:prj2023:danield:797aa278-3a86-4f12-bf4b-fe95ddbfb0a8.jpeg?300 |}} | ||
+ | |||
+ | |||
+ | {{ :pm:prj2023:danield:bb4b2d30-fcdd-471a-91a5-aa8d49440b2e.jpeg?300 |}} | ||
+ | |||
+ | |||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | Ma bucur de alegerea facuta in legatura cu tema proiectului, deoarece mi-a facut placere sa il realizez, atat pe partea de hardware, cat si pe partea de software. | ||
+ | |||
+ | Pentru realizarea hardware-ului am urmarit diverse tutoriale pe youtube, care mi-au fost de mare ajutor, iar pentru scrierea codului am incercat sa implementez initial pe module (functionalitatea pianului, functionalitatea ecranului LCD, redarea melodiilor, adresarea bandei led), iar apoi le-am imbinat pentru a avea functionalitatea dorita. Consider ca am creat un dispozitiv interactiv, distractiv si usor de utilizat datorita mesajelor sugestive afisate pe ecranul LCD si a feedback-urilor luminoase oferite de banda led. | ||
+ | |||
+ | ===== Download ===== | ||
+ | |||
+ | {{:pm:prj2023:danield:mini-tutorial_pentru_pian.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 75: | Line 108: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | === Resurse Software === |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://gist.github.com/baojie/4522173 |
- | </note> | + | * https://www.youtube.com/watch?v=CvZ-SGJ8fGo |
+ | * https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023 | ||
+ | * https://forum.arduino.cc/t/using-millis-for-timing-a-beginners-guide/483573 | ||
+ | * https://arduinogetstarted.com/tutorials/arduino-neopixel-led-strip | ||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | === Resurse Hardware === |
+ | * https://www.youtube.com/watch?v=CvZ-SGJ8fGoo | ||
+ | * https://www.youtube.com/watch?v=EAeuxjtkumM |