Autorul poate fi contactat la adresa: Login pentru adresa
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.
Pianul va conține butoane pentru a reprezenta clapele dintr-o octavă:
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:
Pe lângă componentele plăcii de bază, se vor folosi:
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 |
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:
Aplicația a fost dezvoltată în Programmer's Notepad, iar pentru încărcarea acesteia pe microcontroller s-a folosit HID Boot Flash.
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; }
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
Problemele care mi-au cauzat cei mai mulți nervi: