Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:avaduva:andrei.diaconu1410 [2025/05/17 14:41]
andrei.diaconu1410 [Descriere generală]
pm:prj2025:avaduva:andrei.diaconu1410 [2025/05/28 14:22] (current)
andrei.diaconu1410 [Software Design]
Line 5: Line 5:
 ===== Descriere generală ===== ===== Descriere generală =====
  
-  * Clapa va trimite semnale MIDI catre un pin GPIO configurat ca input+  * Clapa va trimite semnale MIDI catre USART
   * Microcontrollerul va procesa aceste semnale, activand un semnal PWM corespunzator notei primite, iar ieșirea va fi transmisa catre un difuzor sau o mufa audio. ​   * Microcontrollerul va procesa aceste semnale, activand un semnal PWM corespunzator notei primite, iar ieșirea va fi transmisa catre un difuzor sau o mufa audio. ​
   * Un buton va fi utilizat pentru a comuta intre doua moduri de input: claviatura live sau citirea unui fisier MIDI de pe cardul SD.    * Un buton va fi utilizat pentru a comuta intre doua moduri de input: claviatura live sau citirea unui fisier MIDI de pe cardul SD. 
Line 14: Line 14:
 {{:​pm:​prj2025:​avaduva:​synth2.png?​400|}} {{:​pm:​prj2025:​avaduva:​synth2.png?​400|}}
 ===== Hardware Design ===== ===== Hardware Design =====
-Lista componente+=== Lista componente ​=== 
 + 
 +| Nr. | Componentă ​                           | Cantitate | Info                          | 
 +| 1   | Arduino Nano                          | 1         | Microcontroler ​  | 
 +| 2   | Conector DIN 5 pini mama              | 1         | Input pentru clapa | 
 +| 3   | octocuplor 4n25                       | 1         | Pentru a proteja arduino-ul folosit in circuitul de input| 
 +| 4   | dioda de protectie ​                   | 1         | Pentru a proteja led-ul octocuplorului | 
 +| 5   | rezistente de pull up                 | 2         | Pentru buton si inputul midi | 
 +| 6   | Modul micro sd                        | 1         | interfata cu sd cardul SPI| 
 +| 7   | Ecran oled                            | 1         ​| ​ I2C                     | 
 +| 8   | Rezistente 10K ohmi                   | 3         | Protejeaza pinii de output PWM in caz de numai unul genereaza semnal| 
 +| 9   | Potentiometru 100k ohmi                    | 1         | Pentru filtru trece jos | 
 +| 10  | Condensator 10nF                      | 1 | Pentru filtru trece jos| 
 +| 11  | Modul amplificator lm386              | 1 | Amplifica semnalul pentru a proteja pinii de output | 
 +| 12  | Speaker 1W                            | 1 | - | 
 + 
 +{{:​pm:​prj2025:​avaduva:​whatsapp_image_2025-05-17_at_21.11.13.jpeg?​600|}} 
 + 
 +=== Schema Electrica === 
 + 
 +{{:​pm:​prj2025:​avaduva:​synth_schem.png?​900|}} 
 + 
 +  * Circuit midi input 
 + 
 +Am folosit un octocuplor pentru a proteja pinii de intrare ai Arduino-ului. Atunci cand clapa trimite semnal LOW, pinul 5 (data line) al  mufei este conectat la masa iar pinul 4 ( power line) la 5V, ledul octocuplorului se aprinde. Acest lucru face ca fototransistorul din interiorul octocuplorului sa conduca, astfel pinul RX al Arduino-ului va primi un semnal de LOW. In mod similar se intampla si in cazul semnalului HIGH. 
 + 
 +   * Circuit PWM out: 
 + 
 +Deoarece Arduino-ul are 3 timere, pot folosi 3 pini pentru a genera semnale PWM diferite. Acestia sunt conectati la un filtru trece-jos cu rezistenta variabila prin 3 rezistente de 10K ohmi pentru a proteja pinii de output. Filtrul trece-jos ​ poate netezi o undă pătrată, transformând-o într-o undă triunghiulară și modificând astfel sunetul de la unul aspru la unul mai placut. In final, semnalul intra intr-un amplificator LM386 pentru a putea fi auzi prin difuzor si pentru a proteja pini (fiind un speaker de 8 ohmi curentul necesar ar fi prea mare pentru pinii arduinoului fara un amplificator). 
 + 
 + 
 +=== Pini Folositi === 
 + 
 +| Pin Arduino | Conectat la                            | Descriere ​               | 
 +| 5V          | Vcc | Alimentare ​              | 
 +| GND         | Toate GND-urile ​                       | Masă comună ​             | 
 +| D0 (RX)     | Iesire Octocuplor ​                                  | Input semnal midi           | 
 +| D1 (TX)     | —                                      |               | 
 +| D3          | R4                                     | Semnal PWM către difuzor | 
 +| D5          | R5                                     | Semnal PWM către difuzor | 
 +| D9          | R6                                     | Semnal PWM către difuzor | 
 +| D2          | Buton S1                               | Intrare digitală ​        | 
 +| D10         | CS (Pin 6 MicroSD) ​                    | SPI chip select ​         | 
 +| D11         | MOSI (Pin 4 MicroSD) ​                  | SPI MOSI                 | 
 +| D12         | MISO (Pin 3 MicroSD) ​                  | SPI MISO                 | 
 +| D13         | SCK (Pin 5 MicroSD) ​                   | SPI Clock                | 
 +| A4 (SDA)    | SDA OLED                               | Comunicare I2C (date) ​   | 
 +| A5 (SCL)    | SCL OLED                               | Comunicare I2C (ceas) ​   | 
 + 
 + 
 +<​note>​{{:​pm:​prj2025:​avaduva:​whatsapp_image_2025-05-17_at_23.07.18.jpeg?​600|}} 
 + 
 +Dovada functionare ecran.</​note>​
  
-   * Arduino nano 
-   * conector DIN 5 pini mama 
-   * octocuplor 4n25 
-   * dioda de protectie 
-   * rezistente 
-   * condensatori 
-   * modul micro sd 
-   * modul ecran 
-   * speaker de 1W 
  
 <note tip> <note tip>
Line 35: Line 78:
  
 ===== Software Design ===== ===== Software Design =====
 +Am folosit Arduino IDE pentru mediul de dezvoltare.
  
 +Biblioteci folosite:
  
 +- **SdFat.h**,​** MD_MIDIFile.h**:​
 +
 +Pentru a citi si procesa fisiere MIDI de pe cardul SD.
 +
 +- **SSD1306Ascii.h**,​ **SSD1306AsciiWire.h**:​
 +
 +Pentru a afisa informatii pe ecranul OLED.
 +
 +**Structura cod**:
 +
 +Sistemul are 3 stari:
 +
 +  - **MANUAL** - sintetizatorul primeste comenzi MIDI de la claviatura si ecranul OLED afiseaza informatii despre notele primite.
 +  - **LOADING** - sintetizatorul citeste fisierul MIDI de pe cardul SD si il incarca in memorie.
 +  - **PLAYING_SD** - sintetizatorul reda fisierul MIDI incarcate de pe card. 
 +
 +**Initialiare**:​
 +In Setup() se initializeaza timerul pentru PWM, interuptul de pe pinul 2, cardul SD, obiectul MIDI (pentru redare din fisier MIDI) si ecranul. De asemenea, se seteaza starea initiala a sistemului la MANUAL.
 +
 +**Loop**:
 +
 +  - **MANUAL**: se citesc 3 bytes pe usart si functia handleMidi() seteaza frecventa timerul si afiseaza informatiile pe ecran.
 +  - **LOADING**:​ se citeste fisierul MIDI de pe cardul SD si se incarca in obiectul MIDI, dupa programul trece in starea PLAYING_SD automat.
 +  - **PLAYING_SD**:​ se apeleaza functia getNextEvent() pentru a reda urmatorul eveniment MIDI din fisierul incarcat. Astfel se simuleaza primirea de comenzi MIDI de la claviatura.
 +
 +Trecerea intre stari se face prin apasarea butonului de pe pinul 2, care declanseaza un interupt.
 +Aceasta trece de la starea MANUAL la LOADING sau de la starea LOADING, PLAYING_SD la MANUAL.
 +Este implementata si debouncing pentru a evita treceri multiple intre stari la o singura apasare a butonului.
 +Totodata la apasarea de 2 ori a butonului sistemul trece in **teaching mode** atunci cand reda fisiere, reducand viteza de redare a fisierului si afisand informatii despre note pe ecran.
 +
 +Functia **showNoteName()** calculeaza numele si octava notei primite si le afiseaza pe ecran.
 +
 +Notiuni din laborator aplicate:
 +  * PWM: pentru a genera semnalul audio.
 +  * Interupt: pentru a schimba starea sistemului la apasarea butonului.
 +  * USART: pentru a primi comenzi de la clapa.
 +
 +
 +{{:​pm:​prj2025:​avaduva:​diaconuandrei_synth1.zip| cod sursa}}
 +[[https://​www.youtube.com/​watch?​v=0_4VnZYQpdc|demo]]
 <note tip> <note tip>
 Descrierea codului aplicaţiei (firmware): Descrierea codului aplicaţiei (firmware):
Line 46: Line 131:
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
 +
  
 <note tip> <note tip>
Line 52: Line 138:
  
 ===== Concluzii ===== ===== Concluzii =====
 +Desi nu am putut implementa de la 0 citirea fisierelor midi, proiectul m-a ajutat sa invat mai mult despre acest protocol si despre cum functioneaza clapa digitala. Am învatat cum sunt interpretate comenzile MIDI și cum acestea pot fi folosite pentru a genera sunete în timp real. De asemenea, am avut ocazia sa experimentez cu un filtru trece-jos RC si sa reusesc sa trec peste bug-uri hardware.
 ===== Download ===== ===== Download =====
  
pm/prj2025/avaduva/andrei.diaconu1410.1747482115.txt.gz · Last modified: 2025/05/17 14:41 by andrei.diaconu1410
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