This is an old revision of the document!


Nostalgia Music Player - Raduta Lavinia-Maria 333CA

Introducere

Absolut nicio petrecere nu scapa de melodiile anilor 2000. De ce? Pentru ca au un ritm anume, au acel vibe de discoteca, iti aduc aminte de anii in care erai copil, nu ai aveai griji, facultate si teme. In plus, mai greu gasesti melodii pe care sa le stie toata lumea sa se ridice de la masa, sa cante (cu tot sufletul) si sa danseze.
M-am gandit astfel ca daca tot vreau sa fac un player de muzica, sa fie totusi unul cat de cat autentic. Azi doar deschizi Spotify si te conectezi la boxa, inainte aveai nevoie de Cd, Cd player etc. Asa ca proiectul meu incearca sa aduca nostalgia anilor 2000 combinand tehnologia cu amintirea de a veni dupa tine cu casetofonul.
Astfel, player-ul realizat poate reda melodi in format mono, de pe un card SD

Descriere generală

Functionalitate

Nostalgia player-ul realizat are urmatoarele functii:

  • butoane pentru controlul melodiilor:
    • play/pause
    • next track
    • previous track
    • volume up
    • volume down
  • buton de shuffle, care permite amestecarea ordinii melodiilor din playlist

Pentru ca atmosfera sa fie si mai bine intretinuta, am adaugat si 2 LED-uri care pulseaza in ritmul melodiei.

Pe un ecran LCD vor fi afisate informatii despre:

  • melodia curenta - titlu, timpul scurs de la inceputul melodie
  • informatii despre actiuni:
    • daca optiunea de shuffle este activata, pe LCD va aparea un simbol
    • la schimbarea melodiei curente, apare timp de putin timp un simbol de next/prev
    • cand se apasa pe butoanele de volume up/down se afiseaza prin intermediul unei bare de stare, cat si printr-un numar nivelul volumului
  • statusul player-ului - la inceput, inainte ca playerul sa fie pornit se va afisa un mesaj care anunta utilizatorul ca poate da play melodiei

Formatul melodiilor

Melodiile vor fi stocate pe un card SD si pentru a avea o calitate cat de cat decenta, vor avea urmatoarele specificatii:

  • formatul va fi .wav
  • Sampling Rate de 16000Hz
  • canalul audio de tip Mono
  • Bit Resolution de 8 biti

Schema Bloc

Hardware Design

Lista de componente

  • Arduino Uno R3
  • Ecran LCD 1602 + modul I2C
  • Difuzor 1W
  • Modul amplificator audio LM386
  • Modul Card microSD + card microSD
  • 2 x LED RGB
  • 2 x rezistente 220 $\Omega$
  • 6 x Buton
  • Modul microfon MAX4466, cu amplificare si castig reglabil

Schema electrica

Proiectul inainte de a realiza cutia exterioara

Software Design

Setup intreruperi

Apasarea celor 6 butoane declanseaza intreruperi, pentru ca microprocesorul sa nu citeasca la fiecare loop starea butoanelor, care de cele mai multe ori nu se schimba.
Butoanele folosesc intreruperile:

  • External Interrupt Request 0 (INT0) - Next (pe pinul PD2)
  • Pin Change Interrupt Request 0 (PCINT0) - Pause (pe pinul PB0 - PCINT0)
  • Pin Change Interrupt Request 2 (PCINT2)
    • Shuffle - pe pinul PD4 - PCINT20
    • Prev - pe pinul PD5 - PCINT21
    • Volume Up - pe pinul PD6 - PCINT22
    • Volume Down - pe pinul PD7 - PCINT23

Astfel folosesc functia interrupts_setup() pentru setarea directiei pinilor si pentru setarea tuturor intreruperilor.

void interrupts_setup() {
  cli();
 
  // input pins
  DDRD &= ~(1 << PD5) & ~(1 << PD4) & ~(1 << PD6) & ~(1 << PD7) & ~(1 << PD2);
  DDRB &= ~(1 << PB0);
 
  // input pullup
  PORTD |= (1 << PD4) | (1 << PD5) | (1 << PD6) | (1 << PD7) | (1 << PD2);
  PORTB |= (1 << PB0);
 
  // external INTERRUPT
  EIMSK |=  (1 << INT0);
 
  // Interrupt constrol register
  PCICR |= (1 << PCIE2) | (1 << PCIE0);
 
  // interrupt PIN CHANGE
  PCMSK2 |= (1 << PCINT20) | (1 << PCINT21) | (1 << PCINT22) | (1 << PCINT23);
  PCMSK0 |= (1 << PCINT0);
 
  // falling edge of INT0
  EICRA |= (1 << ISC01);
 
  sei();
}

Iar rutinele de tratare a intreruperilor seteaza flag-uri de tip bool pentru fiecare actiune.

// button controls bools 
volatile bool next_press = false;
volatile bool prev_press = false;
volatile bool up_vol_press = false;
volatile bool down_vol_press = false;
volatile bool pause_press = false;
volatile bool shuffle_press = false;
 
// next button - PD2 - INT0
ISR(INT0_vect) {
  next_press = true;
}
 
// PCINT2: shuffle - PD4, prev - PD5, down - PD6, up - PD7
ISR(PCINT2_vect) {
  if ((PIND & (1 << PD4)) == 0) {
    shuffle_press = true;
  } else if ((PIND & (1 << PD5)) == 0) {
    prev_press = true;
  } else if ((PIND & (1 << PD6)) == 0) {
    up_vol_press = true;
  } else if ((PIND & (1 << PD7)) == 0) {
    down_vol_press = true;
  }
}
 
// PCINT0: pause/play - PB0
ISR(PCINT0_vect) {
  if ((PINB & (1 << PB0)) == 0) {
    pause_press = true;
  }
}

Debounce butoane

Pentru a detecta corect apasarile butoanelor, pentru fiecare dintre butoane am aplicat o logica de debounce, care consta in numararea milisecundelor care au trecut de la ultima apasare. Daca numarul acestora este mai mic decat thresholdul ales (de 500ms) atunci detectarea apasarii a fost gresita si este ignorata (flagul corespunzator este setat pe false).

volatile unsigned long last_debounce = 0; 
volatile unsigned long current_millis = millis();
const unsigned long debounce_delay = 500;
 
if (press_flag) {
    unsigned long current_millis = millis();
    if (current_millis - last_debounce_next < debounce_delay) {
      press_flag = false;
    } else {
      // button was really pressed => do work
    }
  }

Redarea Melodiilor

Pentru a reda melodiile de pe cardul SD, am folosit biblioteca TMRpcm.
Feature-uri ale bibliotecii:

  • foloseste biblioteca standard SD.h pentru a accesa fisierele de pe cardul SD
  • reda melodiile in mod asincron, astfel permite executia altui cod in loop in timpul redarii, fara ca melodia sa se opreasca
  • accepta fisiere de tip .wav cu urmatoarele caracteristici:
    • rezolutie audio de 8 biti (fiecare esantion audio are 8 biti - ceea ce inseamna ca exista 256 de niveluri de amplitudine posibile)
    • frecventa de esantionare (sample rate) a sunetului intre 8 si 32kHz (frecventa de esantionare = cate esantioane audio sunt redate pe secunda)
    • Mono = un singur canal audio care va fi redat pe toti pinii de iesire

Rezultate Obţinute

Concluzii

Download

Jurnal

Bibliografie/Resurse

pm/prj2023/adarmaz/gesture-music-player.1685315002.txt.gz · Last modified: 2023/05/29 02:03 by lavinia.raduta
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