Electronic Keyboard

Introducere

Proiectul presupune realizarea unui mini pian digital care poate schimba între mai multe tipuri de sunete: pian de concert, flaut, chitară, vioară. De asemenea, pianul trebuie să fie polifonic (permite redarea mai multor note în același timp).

Am vrut să creez un proiect pe o temă care mă interesează în mod deosebit, văzându-l ca o șansă de a aprofunda un subiect pe care nu l-aș fi abordat în mod normal. Îmi place să cânt la pian, dar nu am căutat până acum și nu m-am gândit la ce piese sunt în interior și cum duc la producerea sunetului.

Proiectul realizat în sine nu cred că este foarte util, fiind mult mai limitat în numărul de note și moduri în care poți să cânți decât un pian online care poate fi accesat cu foarte mare ușurință, dar poate fi o ocazie de descoperire a componentelor hardware și software care duc la redarea sunetelor unui pian.

Descriere generală

Schema bloc

Modulul Switch are un buton care controlează modul de sunet al pianului. Prin apăsarea lui, se ciclează între tipurile diferite de instrumente/sunete.

Modulul Keyboard cuprinde 8 butoane pentru cele 8 tonuri naturale, de bază ale pianului. Apăsarea lor va determina difuzorul să emită o notă muzicală.

Modulul SD Card presupune prezența unui SD Card Holder și al unui SD Card pe care sunt încărcate sample-uri de la diferite instrumente (note izolate) care vor fi cântate la apăsarea “clapei” corespunzătoare.

Modulul Speaker se referă la difuzorul prin intermediul căruia se vor emite sunetele la apăsarea butoanelor.

Hardware Design

Lista de piese

  • Placa de bază - ATmega328

  • 8 Butoane (switch + keyboard)

  • Difuzor

  • SD Card Holder + SD Card

Schema electrică

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare: Arduino IDE
  • bibliotecă 3-rd party: TMRpcm pentru redarea fișierelor WAV din cardul SD (folosește și biblioteca standard Arduino SD)

Implementarea constă în principal din codul pentru diferite întreruperi (butonul de switch, “clapele” și timer-ul pentru difuzor).

Întreruperea pentru butonul de switch presupune ca la apăsarea acestuia să se modifice starea lui, ciclând între 3 moduri: pian, flaut, vioară.

ISR(INT0_vect) {
    // Increment switchState and wrap around if necessary
  if (millis() - lastDebounceTime >= debounceDelay) {
    if ((PIND & (1 << Switch)) == 0) {
      lastDebounceTime = millis();
      switchState = (switchState + 1) % WAV_TYPE_COUNT;
      Serial.println(switchState);
    }
  }
}

Pentru clape, la apăsarea lor se dă play la audio-ul corespondent butonului și activează variabila soundEnabled care este folosită pentru redarea sunetului de către difuzor.

ISR(PCINT2_vect) {
  for (int i = 0; i < sizeof(buttonPins) / sizeof(buttonPins[0]); i++) {
    if ((PIND & (1 << buttonPins[i])) == 0) {
      // Button is pressed, play the corresponding WAV file
      if (switchState == 0) {
        playWavFile(pianoFiles[i]);
      } else if (switchState == 1) {
        playWavFile(fluteFiles[i]);
      } else if (switchState == 2) {
        playWavFile(violinFiles[i]);
      }
      soundEnabled = true;
      return;
    }
  }
  soundEnabled = false;
}

Timer-ul difuzorului este de tipul Fast PWM și generează sunet atunci când primește semnal de la clape că una dintre ele este apăsată.

ISR(TIMER1_COMPA_vect) {
  if (soundEnabled) {
    // Generate sound
    PORTB |= (1 << PB1);
  } else {
    // Stop sound
    PORTB &= ~(1 << PB1);
  }
}

Rezultate Obţinute

Cum TMRpcm nu are suport pentru redarea sunetului concurent și, în general, Arduino Uno este limitat în această privință din cauza memoriei necesare stocării mai multor fișiere audio în același timp și complexității mai mari a programului, se poate reda o singură notă în același timp.

Dacă nu aș fi folosit fișiere audio, problema ar fi fost rezolvată. În loc ca fiecare buton să genereze un sunet la o anumită frecvență, aș fi adunat frecvențele tuturor pentru a compune o frecvență finală pe care o reda difuzorul.

O altă problemă întâmpinată a fost faptul că anumite întreruperi interferau unele cu altele. Astfel, în loc să folosesc PCINT0 pentru întreruperea specifică butonului de Switch, din cauză că nu funționa corect împreună cu TIMER1, folosit la difuzor, am modificat la o întrerupere externă, INT0.

Rezultatele sunt cele așteptate: la apăsarea butoanelor se redă sunetul corespunzător și ciclează printre fișierele audio prin folosirea butonului de Switch. Totuși, având în vedere difuzorul folosit, sunetele sunt neclare. Acesta este un lucru pe care l-aș schimba cu siguranță pentru a îmbunătăți proiectul.

Concluzii

Proiectul demonstrează utilizarea modulului de card SD pentru a stoca si a prelua fișiere audio, biblioteca TMRpcm pentru redarea audio și utilizarea întreruperilor pentru a gestiona evenimentele de intrare.

Poate fi folosit în diverse aplicații în care este necesară redarea audio, cum ar fi playere muzicale, sisteme de efecte sonore, instalații interactive și proiecte educaționale.

Realizând acest proiect am învățat multe lucruri pe care nu le cunoșteam înainte și am întâmpinat probleme atât hardware, cât și software pe care nu le anticipasem. M-a făcut să am mai multă apreciere și respect pentru persoanele care lucrează cu astfel de module.

Download

Arhiva conține codul sursă și sample-urile de note.

piano.zip

Jurnal

  • 7.05.2023 - Introducere + Descriere generală
  • 21.05.2023 - Hardware
  • 28.05.2023 - Software

Bibliografie/Resurse

Resurse Hardware:

Resurse Software:

Export to PDF

pm/prj2023/apredescu/electronic_keyboard.txt · Last modified: 2023/05/30 08:08 by andreea.vodita
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