MP3 Player

Student: Buhnici Andrei - George

Grupa: 333CC

Introducere

Proiectul ales de mine este un MP3 Player controlat cu ajutorul unui Arduino. Ca orice alt mp3 player, scopul lui este sa redea muzica favorita si sa ofere o interfata simpla utilizatorului prin care acesta sa poata sa controleze diferite aspecte ce tin de redarea melodiilor. Ideea de la care am pornit a fost de la faptul ca imi place sa ascult muzica destul des, ceea ce nu e o calitate extravaganta, si ca am vazut de curand un mp3 player. Am realizat ca nu am avut un mp3 player pana acum, datorita smart phone-urilor, si mi s-a parut o idee interesanta de abordat: sa imi fac propriul mp3 player. Este util pentru redat muzica atat pentru mine, cat si pentru ceilalti, tuturor le place muzica si fiecare are melodii preferate.

Descriere generală

Hardware Design

Lista piese:

  • Arduino Uno
  • SD card
  • DF Player Mini
  • Fire
  • Breadboard
  • Butoane
  • I2C Module + LCD
  • HC-05 bluetooth module
  • Speaker

Software Design

Mediul de dezvoltare folosit a fost Arduino IDE.

Biblioteci folosite:

- #include “SoftwareSerial.h” → pentru comunicarea seriala cu laptopul(mai mult pentru debugging si comunicarea cu modulul DFPlayer Mini;

- #include “AltSoftSerial.h” → pentru comunicarea seriala cu modulul de bluetooth;

- #include “DFRobotDFPlayerMini.h” → pentru functii special destinate controlului modulului DFPlayer Mini;

- #include <LiquidCrystal_I2C.h> → pentru modulul I2C

Implementare:

- am definit un array de string-uri pentru numele artistului si al melodiei, deoarece nu pot sa citesc numele fisierelor .mp3 cu modulul DFPlayer Mini, asa ca tin un index, pe care il incrementez si decrementez prin acest vector construit in ordinea fisierelor de pe cardul SD;

- la fel este definit si un vector de durate(long) ce tine durata melodiei in milisecunde;

- urmatoarele declarari sunt niste vectori de octeti destinati sa populeze complet o celula de pe LCD, folositi pentru afisarea unui progress bar al melodiei;

- in setup() activez intreruperile pentru pinii in care am cele 5 butoane, incep comunicarile seriale, testez ca DFPlayer-ul raspunde si initializez si lcd-ul;

- initial, am un flag de playerInitial pe true, cu ajutorul caruia voi afisa initial un mesaj de start pe LCD de genul : “DFPlayer Online. Press any button to continue”;

- la apasarea oricarui buton, cat si apasarea de pe telefon, va da play la prima melodie din lista, practic, va da start cu adevarat la mp3 player;

- odata dat startul, pe prima linie a LCD-ului va fi afisat numele artistului alaturi de cel al melodiei, si daca nu incape se va face scroll la stanga la 500 de ms;

- pe a doua linie de LCD va fi afisat un progress bar ce va spune cat mai este ramas din melodie;

- urmatoarele instructiuni sunt niste verificari pe flag-uri setate de intreruperile de pe butoane care spun practic daca s-a facut comanda respectiva;

- aceste flag-uri sunt folosite strict pentru a afisa pe lcd ce comanda a fost folosita si sunt prezente din cauza faptului ca orice cod legat de lcd as fi pus in intreruperi, indiferent daca le activez sau nu in interiorul unei intreruperi (no nested interrupts), bloca tot programul si cu un mic search pe arduino forums, dupa ce deja facusem metoda cu flags, recomanda folosirea flag-urilor;

- dupa flag-uri este update-ul la progress bar care se va face daca player-ul nu este pus pe pauza, si exista acel track time - 2000, pentru a completa bara pana la final inainte de skip, deoarece altfel fix cand se face ultima completare se va trece si la urmatoarea melodie, si am vrut sa se vada totusi ca se completeaza;

- iar la final se afla tratarea mesajelor primite de la modulul de bluetooth, ce citeste litere pana la newline, iar daca se trece peste 9 litere va printa Illegal word si va face flush la tot cuvantul retinut;

- verific cu strcmp fiecare functionalitate prezenta si la butoane si apelez handlers pentru fiecare;

- si intreruperile fac exact acelasi lucru, fiecare intrerupere, apeleaza handlers;

- am cele 2 intreruperi de tip int(int0 si int1) atasate la comenzile de previous si pause, iar celelalte 3 functionalitati folosesc pcint;

- toate intreruperile folosesc debouncere inainte sa apeleze handlers;

- functiile de handle afiseaza diferite lucruri la serial monitor si la interfata de pe bluetooth(pe telefon), apeleaza o functie specifica bibliotecii de DFPlayer (next(), pause(), resume(), previous(), si cele de volum) seteaza anumite variabile(timp, indecsi) si flag-uri pentru modulul I2C si flag-uri folosite intre intreruperi;

- functia ce elibereaza o linie de LCD scrie ' ' pe toate cele 16 caractere;

- functia de scroll scrie doar pe linia 0 si afiseaza string-ul de la o litera(curr + 1) diferita la fiecare 500 de ms, iar dupa ce ajunge la final, afiseaza iar tot string-ul de la capat si porneste din nou cu parcurgerea;

- functia de progress bar calculeaza procentajul de umplere pe care trebuie sa il afiseze din durata totala a melodiei, iar daca acest procentaj este intreg va umple un block intreg la pozitia cursorului, altfel va afisa restul de la impartirea cu 5, adica intre 1 si 4 linii dintr-un block(pentru asta erau array-urile de bytes, five fiind un block complet);

Rezultate Obţinute

Concluzii

A fost un proiect interesant si fun de lucrat. Au fost extrem de multe batai de cap, mai ales cu interuperile si cum interactioneaza acestea cu anumite bilbioteci si componente, si DFPlayer-ul care este un modul ieftin si prost LOL care nu poate sa citeasca fisierele si e extrem de special cand vine vorba de ordinea in care sunt puse pe cardul SD, dar macar acum o sa stiu sa ma feresc de chestii de genul. Overall mi-a placut sa lucrez la proiect, a fost foarte fun sa pun mana sa fac ceva si chiar sa iasa.

Download

Jurnal

01.05.2023 - Creare pagina ocw.

18.05.2023 - Etapa hardware.

25.05.2023 - Etapa software + completare finala ocw.

Bibliografie/Resurse

pm/prj2023/dene/mp3player.txt · Last modified: 2023/05/29 21:28 by andrei.buhnici
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