This shows you the differences between two versions of the page.
pm:prj2025:avaduva:andrei.diaconu1410 [2025/05/13 07:26] 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. | ||
- | * Ecranul si cititorul de carduri SD vor comunica cu microcontrollerul prin SPI. | + | * Ecranul va comunica prin protocolul I2C. |
- | * Circuitul de iesire consta intr-un opamp si un filtru trece-jos RC pentru a reduce zgomotul din semnalul audio. | + | * Cititorul de carduri SD va comunica cu microcontrollerul prin SPI. |
+ | * Circuitul de iesire consta intr-un amplificator si un filtru trece-jos RC pentru a reduce zgomotul din semnalul audio si a proteja pinii de PWM. | ||
{{:pm:prj2025:avaduva:synth2.png?400|}} | {{:pm:prj2025:avaduva:synth2.png?400|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
+ | === 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> | ||
+ | |||
<note tip> | <note tip> | ||
Line 23: | 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 34: | Line 131: | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | |||
<note tip> | <note tip> | ||
Line 40: | 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 ===== | ||