Electric Harp, reprezintă o reinterpretare a instrumentului muzical “Harpă”. In sine, o harpă conține 47 de coarde pentru note muzicale de tonalitate diferită și 7 pedale pentru turarea notelor muzicale, pedalele simulează clapele de culoarea neagră de pe un pian.
Scopul proiectului este de a simula o harpă, folosind diode laser în loc de corzi.
În sine este foarte complicat și costisitor să cumperi o harpă și să te înveți să cânți la ea. În acest scop reducem spațiul stărilor, de la 47 de corzi, la 7 corzi și de la 7 pedale de turare, la două pedale. În momentul când stăpânești aceast mini instrument muzical electric, poți considera și ideea de a avansa la o harpă adevărată.
Totodată, o harpă are nevoie de îngrijire constantă plus un loc de podium în casa ta, pentru a nu fi distrusă, astfel acest mini dispozitiv electric ce simulează o harpă este foarte ușor de întreținut și nu necesită un spațiu atât de mare pentru depozitare (iar ca bonus poți cânta chiar și din pat). Într-o altă ordine de idei, harpa electrică poți să o pui în geantă și să pleci la petreceri pentru a le arăta prietenilor tăi, cât de bine poți cânta la un instrument muzical.
Așa cum am menționat și mai sus, harpa electrică va conține, 7 corzi pentru note melodice și două coarde pentru tonalitatea notelor. Corzile vor fi reprezentate de diode laser. Diodele vor fi conectate separat la o sursă de curent (detașate de placa de dezvoltare) și vor genera încontinuu lumina punctiformă. Lumina diodei va fi prinsă de către un fototranzistor care va fi conectat la placa de dezvoltare.
Dacă fototranzistorul interceptează lumina diodei laser, se consideră că coarda nu este apăsată, dacă fototranzisotrul nu interceptează nimic atunci se consideră coarda respectivă ca fiind apăsată, astfel buzzer-ul pasiv atribuit fototranzistorului va emite nota corespunzătoare. }
Sistemul de gestiune a diodelor laser, este detașat de placa de dezvoltare, fiindcă nu necesită flux dinamic, diodele vor emite lumină încontinuu atât timp cât sunt conectate la o sursă de alimentare.
Fiecarei diode laser se atribuie un fototranzistor, astfel încât vectorul luminii emise de laser să fie îndreptat către fototranzistor.
La rândul lor, fiecare fototranzistor este cuplat la un port gpio (digital) al plăcii de dezvoltare. Placa Arduino Nano, va face corespondența între fototranzistor și buzzer. Buzzerele la rîndul lor vor fi și ele conectate la câte un port digital al plăcii, vom folosi câte un buzzer per coardă, pentru a simula un mediu cât mai asincron, astfel în momentul când se apasă 2 corzi simultan, se vor auzi 2 note muzicale la fel simultan.
Cele 2 corzi de tonalitate, vor fi pentru a schimba octava de lucru. In sine o harpă conține 6 octave plus câteva note de tonalitate ridicată (depinde de standard), astfel o coardă de turare va mări tonalitatea octavei în momentul apăsării, iar altă coardă de turare va micșora tonalitatea octavei.
Prin corzile de tonalitate, putem simula aproximativ tot spațiul stărilor a unei harpe, unicul neajuns este că devine un pic mai complicat dacă acordul cântat se află în octave diferite.
Pentru a fi siguri, că în momentul întreruperii fluxului unei raze către fototranzistor, interceptarea modificarii a fost înregistrată, pentru fiecare fototranzistor vom avea câte un led rgb. Pentru flux între laser și transistor, led-ul va lumina roșu, iar pentru întrerupearea fluxului (apăsarea corzii), led-ul va lumina verde. Fiindca majoritatea pinilor gpio, vor fi ocupaâi de către buzzere și fototranzistori, nu mai dispunem de încă 9 (leduri) * 2 (canale de gestiune) = 18 (pinuri), cu acest scop vom simula gestiunea led-ului rgb, folosind output-ul de la fototranzistor și pentru fiecare led, câte un tranzistor pnp și npn, astfel încât să putem face switch-ul dintre culoarea roșie și cea verde.
Pentru efectuarea acestui proiect inclusiv testarea acestuia, se vor folosi următoarele componente:
Vom începe inițial cu prezentarea proiectului deja asamblat final, mai apoi, vom discuta parte în parte procesul acestui, cât și schemele electrice.
Cum se poate observa și în schema logică și electrică de mai jos, controlul led-urilor este definit pur electronic, adică în dependență de output-ul fototranzistoarelor, culoarea led-ului va fi sau roșu sau verde (1-roșu, 0-verde). Pe de altă parte diodele laser sunt doar conectate de un Vcc(+5V), și sunt mereu conectate atât timp cât plăcuța de dezvoltare este conectată la o sursă de alimentare, astfel tot ce se poate viziona din gif-ul de mai sus, este reprezentat pur hardware, fără nici o intervenție software.
Proiect-ul hardware, este definit în 2 părți(2 pcb-uri). În primul PCB se află plăcuța arduino, totodată se lipesc și buzzere-le pasive, pe cel de-al doilea PCB se află cele 9 circuite cu tranzistoare, care vor face switch-ul de la culoarea roșie a led-ului la culoarea verde (și invers), de același PCB, se conectează în sine și cele 9 leduri(a câte 2 fire fiecare), și output-ul care vine din fototranzistoare, fiindcă circuitul alcătuit din tranzistoare este controlat de output-ul fototranzistoarelor.
Pentru dezvoltarea schemei electrice și logice s-a folosit aplicația Fritzing, unde pe breadboard, sunt reprezentate cele 18, tranzistoare care produc switch-ul dintre, culorile led-ului rgb cu anod comun, totodată din fototranzistoare se trag 2 fire de output, unul în baza tranzistoarelor de switch și altul în plăcuța de dezvoltare, care va intercepta semnalul fototranzistoarelor și în dependență de acesta va suna sau nu o notă muzicală prin buzzerele la fel conectate la pin-urile gpio ale plăcuței arduino.
Pentru dezvoltarea proiectului din punct de vedere soft, s-a folosit, ArduinoIDE.
In sine notele vor fi tinute drept niste pini logici, si vom avea un macro care va face maparea dintre un port logic si unul hardware:
/* Trasform a logic pin into real pin */ #define REAL_ID(pin) (pin + 11) /* * @brief possible playing notes, mapped to logical pins */ typedef enum note_s { DO = 0, RE = 1, MI = 3, FA = 5, SO = 4, LA = 9, SI = 2, NO_NOTE = -1 } note_t;
Totodata fiecare nota va avea un status, in sensul daca coarda corespunzatoare notei este apasata sau nu:
/* * @brief - status for a single note, either Active or Idle. * Active when the chord is pressed, and Idle when it is not */ typedef enum note_status_s { ACTIVE = 0, IDLE = 1 } ns_t; /* Status for every note either Active or Idle */ ns_t notes_status[MAX_NOTES];
Flow-ul general al programului tine de 3 pasi:
* Actualizeaza statusul notelor * Canta notele active, atat timp cat exista buzzere libere * Actualizeaza vectorul de memoizare
Astfel, bucla principala a programului este alcatuita de:
/* Firstly update the status or each note */ update_notes_status(); /* Iterate through all notes and check their status */ for (int i = 0; i < MAX_NOTES; ++i) { if (notes_status[i] == ACTIVE) { /* If note is active check if there is a tone available */ int tone_idx = available_tone(notes[i]); /* If a tone agrees to play the note, then play it. */ if (tone_idx != -1) tones[tone_idx].play(notes_freq[i], 100); } } /* Update the memoization vector */ update_tones_memoization();
Vectorul de memoizare, este un simplu vector, care tine cont ce note sunt cantate la o actualizare de status, si in sine mimeaza functia de isPlaying(), pentru o structura Tone, am implementat aceasta structura de mana, fiindca aveam in sine nevoie de un delay, care foloseste si el un timer, insa cele 3 buzzere, folosesc si ele cate un timer aparte, deci pe ArduinoNano, exista doar 3 timere, si atunci pentru a nu sacrifica un buzzer, am sacrificat functia de delay.
Se folosesc in sine 3 buzzere, fiindca se doreste un flux cat mai asincron, adica daca in momentul cand sunt apasate 3 coarde, se doreste a fi cantate 3 note, insa pentru mai mult de 3, se vor canta primele 3 intrate pe buss.
/* * @brief Returns the tone that is available for playing * * @param note the note that wants to be played on the tone * @return tone index if a tone agrees to play the note or * -1 if all the tones are busy. */ int available_tone(note_t note) { for (int i = 0; i < MAX_TONES; ++i) if (buss[i] == note || buss[i] == NO_NOTE) { buss[i] = note; return i; } return -1; }
S-a folosit o singura biblioteca ToneLibrary, inclusa in core, care poate simula square waves, pentru frecvente diferite si pentru durate de timp diferit, folosind PWM, in sine cum am specificat si mai sus, se pot canta note asincron folosing functia Tone::play(), insa numarul de note cantate asincron este limitat de numarul de timere, din acest motiv vom putea canta simultan doar 3 note.
A fost un proiect destul de interesant, si puternic vizual, cel mai complicat lucru a fost lipit-l, dat fiind faptul ca am dorit sa includ un grad mai inalt de estetica, astfel a fost nevoie de foarte fire, cum am mentionat si mai sus. In procesul de lipire am fost nevoit sa lipsesc niste piese de doua ori, fiindca in procesul de testare nu se comporta as expected. Dar la final a fost un proces destul de interesant.