Table of Contents

Electric Harp

Autor: Negru Mihai
Grupa: 333CD
Îndrumător: Ionuț Oțelea

Introducere

Descriere

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 și ideea principală

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ă.

Utilitatea

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.

Descriere generală

Reprezentarea fizică

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. }

Reprezentarea logică

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.

left|diodelaser

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.

Reprezentarea grafică

left|general_schema

Leduri pentru debugging

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.

left|leds

In gif-ul de mai sus sunt prezente două led-uri, în loc de unu, dat fiind faptul că simulatorul tinkercad nu dispune de led-uri rgb cu anod comun. In schema generală , cei doi catozi(verde și roșu) vor fi conectați la tranzistoarele npn și respectiv pnp, iar butonul in sine reprezintă fototranzistor-ul care generează un output digital (apasat/non-flux → non-apasat/flux)

Hardware Design

Lista de piese hardware

Pentru efectuarea acestui proiect inclusiv testarea acestuia, se vor folosi următoarele componente:

SIZEx (cu rezervă) reprezintă fapt-ul că s-au procurat SIZE componente de aceiași categorie, din care fac parte și componente de rezervă în caz că se rup, ard sau alte cazuri care pot duce la stricarea componentei.

Reprezentarea hardware reală

Vom începe inițial cu prezentarea proiectului deja asamblat final, mai apoi, vom discuta parte în parte procesul acestui, cât și schemele electrice.

left|hardware

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.

Cele două părți au fost lipite ambele cu ajutorul unui ciocan electric, din cauza numărului mare de fire → pentru 9 leduri câte 2 fire, mai apoi pentru 9 fototranzistoare cîte 3 fire(Vcc, Gnd și Out), în total 45 de fire, procesul de lipire a fost unul foarte anevoios. Initial am vrut să lipesc totul doar pe PCB-uri, după am avut idea “geniala”, care a îngreunat tot procesul de a plasa led-urile separat, pentru a avea un efect vizual mai frumos. Într-un final totul a fost pus cap la cap, și ca bonus fiindcă nu mi-a plăcut cum “zboară” firele am decis să fac un pic de restructurare, și să ascund partea de circuit.

Reprezentare hardware logică

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.

left|logical schema

Reprezentare hardware electrică

Pentru o înțelegere mai detaliată a circuitul vă prezint și schema electrocă a proiectului hardware

left|electrical schema

Software Design

Pentru dezvoltarea proiectului din punct de vedere soft, s-a folosit, ArduinoIDE.

Structuri

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 Design

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;
}

Biblioteci folosite

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.

Concluzii

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.