Table of Contents

Bianca-Mihaela CAUC (78494) - Pian electronic

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Proiectul care se doreşte a fi implementat constă în realizarea unui pian electronic capabil să redea notele muzicale din mai multe octave, permițând și opțiuni pentru înregistrarea și redarea melodiilor.

Astfel, se dorește ca proiectul să se aproprie cât mai mult de modul de funcționare al unui pian adevărat și poate reprezenta o jucărie pentru cei pasionați de muzică, indiferent de vârsta lor.

Descriere generală

Pianul va conține butoane pentru a reprezenta clapele dintr-o octavă:

MOD DE FUNCŢIONARE

Pianul are 3 moduri de funcţionare: Normal Mode, Recording Mode, Play Mode şi permite emiterea notelor muzicale din primele 6 octave. Pentru schimbarea octavei curente se folosesc 2 butoane: incrementare octavă şi decrementare octavă. Modul de funcţionare în care se deschide programul este Normal Mode, având setată octava 1. Octava curentă poate fi identificată prin culoarea LED-ului corespunzător modului normal de funcţionare (octava curentă poate fi văzută doar dacă pianul se află în Normal Mode sau Recording Mode). Astfel, codificările celor 6 octave sunt următoarele:


SCHEMA BLOC

Hardware Design

LISTĂ PIESE

Pe lângă componentele plăcii de bază, se vor folosi:

Detalii componente

Denumire Număr Preț Link către produs
Placă de bază x1 8 RON -
Componente placă de bază x1 24 RON -
Cablu USB AM → USB BM x1 3.49 RON https://goo.gl/KAVn2a
Placă test 12cm x 18 cm x1 10 RON -
Modul Buzzer activ x1 5.49 RON https://goo.gl/DFwUk8
Butoane x17 16.83 RON https://goo.gl/21rLGo
LED RGB cu catod comun x3 2.85 RON https://goo.gl/cfvpTb
Rezistențe 470R x9 3.24 RON https://goo.gl/TZjNWh
Cablu mamă-mamă 20cm x1 3.99 RON https://goo.gl/RPRNd1
Cablu mamă-mamă 30cm x3 22.35 RON https://goo.gl/QFUKud
Cablu mamă-tată 10cm x1 2.99 RON https://goo.gl/H5CFCR
Header de pini x1 0.99 RON https://goo.gl/qvzbGK
Ojă albă x1 - -
Total 104.22 RON

SCHEMĂ ELECTRICĂ

Iniţial, am dorit să implementez următoarea schemă electrică:

Totuşi, în momentul în care m-am apucat de implementarea hardware, am întâmpinat câteva probleme, deoarece programul nu funcţiona aşa cum ar fi trebuit când legam butoane la următorii pini:

Din aceste motive, a trebuit să renunţ la folosirea lor şi să mă folosesc de cei rămaşi liberi (PB1 şi PB0) şi din cauză că nu mai aveam încă un pin liber, am decis să elimin butonul corespunzător notei DO2, întrucât aceasta poate fi redată prin alegerea lui DO din octava superioară a celei curente. De asemenea, deşi iniţial am dorit să pun toate butoanele corespunzătoare clapelor albe la un port, iar cele corespunzătoare clapelor negre la un alt port , mi-am dat seama că acest lucru îmi va cauza probleme când lipesc, deoarece s-ar fi încurcat firele între ele foarte mult. Schema electrică finală este următoarea:

SOFTWARE DESIGN

MEDIUL DE DEZVOLTARE

Aplicația a fost dezvoltată în Programmer's Notepad, iar pentru încărcarea acesteia pe microcontroller s-a folosit HID Boot Flash.

DESCRIEREA CODULUI SURSĂ AL APLICAȚIEI

Am început prin a defini în my_utils.h o serie de variabile globare şi de macro-uri cu scopul de a avea un coding style cât mai frumos.

#define DISABLED 0
#define READY    1
#define ACTIVE   2
/* Pini pentru LED-ul corespunzator modului normal de functionare + octava curenta */
#define NORMAL_MODE_RED        PA2
#define	NORMAL_MODE_GREEN      PA1
#define NORMAL_MODE_BLUE       PA0

/* Pini pentru LED-ul corespunzator modului de inregistrare */
#define RECORDING_MODE_RED     PB5
#define RECORDING_MODE_GREEN   PB6
#define RECORDING_MODE_BLUE    PB7

/* Pini pentru LED-ul corespunzator modului de redare */
#define PLAY_MODE_RED          PB2
#define PLAY_MODE_GREEN        PB3
#define PLAY_MODE_BLUE         PB4
/* Pini pentru butoanele de control */
#define NORMAL_MODE_BUTTON     PA7
#define RECORDING_MODE_BUTTON  PA6
#define PLAY_MODE_BUTTON       PA5
#define OCTAVE_PLUS            PA4
#define OCTAVE_MINUS           PA3

/* Pin pentru modulul de buzzer activ */
#define BUZZER                 PD5
#define DO        PB1
#define DO_DIEZ   PC6
#define RE        PC5
#define RE_DIEZ   PC4
#define MI        PC3
#define FA        PC2
#define FA_DIEZ   PC1
#define SOL       PC0
#define SOL_DIEZ  PD4
#define LA        PD1
#define LA_DIEZ   PB0
#define SI        PD0

De asemenea, se folosesc următorele variabile globale:

double DO_FREQUENCY[NOF_OCTAVES]       = { 16.352, 32.703, 65.406, 130.813, 261.626, 523.251 };
double DO_DIEZ_FREQUENCY[NOF_OCTAVES]  = { 17.324, 34.648, 69.296, 138.591, 277.183, 554.365 };
double RE_FREQUENCY[NOF_OCTAVES]       = { 18.354, 36.708, 73.416, 146.832, 293.665, 587.333 };
double RE_DIEZ_FREQUENCY[NOF_OCTAVES]  = { 19.445, 38.891, 77.782, 155.563, 311.127, 622.254 };
double MI_FREQUENCY[NOF_OCTAVES]       = { 20.602, 41.203, 82.407, 164.814, 329.628, 659.255 };
double FA_FREQUENCY[NOF_OCTAVES]       = { 21.827, 43.654, 87.307, 174.614, 349.228, 698.456 };
double FA_DIEZ_FREQUENCY[NOF_OCTAVES]  = { 23.125, 46.249, 92.499, 184.997, 369.994, 739.989 };
double SOL_FREQUENCY[NOF_OCTAVES]      = { 24.500, 48.999, 97.999, 195.998, 391.995, 783.991 };
double SOL_DIEZ_FREQUENCY[NOF_OCTAVES] = { 25.957, 51.913, 103.826, 207.652, 415.305, 830.609 };
double LA_FREQUENCY[NOF_OCTAVES]       = { 27.500, 55.000, 110.000, 220.000, 440.000, 880.000 };
double LA_DIEZ_FREQUENCY[NOF_OCTAVES]  = { 29.135, 58.270, 116.541, 233.082, 466.164, 932.328 };
double SI_FREQUENCY[NOF_OCTAVES]       = { 30.868, 61.735, 123.471, 246.942, 493.883, 987.767 };
static unsigned int normal_mode = ACTIVE;
static unsigned int recording_mode = DISABLED;
static unsigned int play_mode = DISABLED;
static unsigned int current_octave = 1;

Algoritmul propriu-zis

Programul folosește tehnica de busy-waiting, verificând la fiecare 250ms ce butoane au fost apăsate (am încercat să implementez cu întreruperi, însă din a numite motive pe care nu am reușit să le descopăr, programul nu funcționa așa cum îmi doream :-()

int main(void) {
	
	set_environment();
	
	while (1) {
		check_buttons();
		_delay_ms(250);
	}
	
	return 0;
}

Rezultate Obţinute

Demo movies

Fotografii

Concluzii

Ideea proiectului este una interesantă și este foarte plăcut în momentul în care chiar vezi că merge ce ai implementat. Totuși, a fost destul de scurt timpul de care l-am avut la dispoziție și a fost destul de dificil la început până am înțeles exact cum trebuie să procedez și de ce piese am nevoie. M-am ales cu câteva arsuri de la lipituri și am cedat nervos de câteva ori în momentele în care brusc nu mai mergea nimic, însă până la urmă sunt mulțumită de rezultatul final :-D Problemele care mi-au cauzat cei mai mulți nervi:

Download

Jurnal

Bibliografie/Resurse