This is an old revision of the document!
Pian electric
Introducere
Proiectul meu este, în esență, visul de a transforma o tastatură banală într‑un instrument muzical care să‑ți smulgă un zâmbet ori de câte ori ai nevoie de o pauză. Am pornit de la pasiunea pentru muzică și de la regretul că, în copilărie, n‑am putut atinge clapele unui pian adevărat. Așa s‑a născut ideea unui pian electric simplu, portabil, care să combine dexteritatea de programator cu bucuria de a improviza câteva măsuri dintr‑o melodie preferată.
Instrumentul are două moduri principale. În Free‑to‑Play poți apăsa clapele în orice ordine, lăsându‑ți imaginația să facă ce știe ea mai bine: să compună, să testeze, să greșească și s‑o ia de la capăt fără nicio presiune. Pentru cei care vor un pic de ghidaj există modul de exersare cu piese pre‑încărcate – melodii scurte, redate pas cu pas, ca să‑ți antrenezi urechea și degetele fără profesor, direct din sufragerie.
De ce cred că e util? Pentru că, atunci când lucrezi ore în șir la tastatură, pauzele scurte contează enorm. Câteva acorduri improvizate relaxează mintea, îți dau energie și, în plus, declanșează spiritul competitiv: sigur vei vrea să reinterpretezi melodia ca să sune mai curat, mai ritmat, mai „a ta”. Iar dacă îi mai atașezi un jack pentru căști sau o ieșire MIDI, brusc se deschid uși către producție muzicală serioasă – fără să pierzi farmecul jucăuș al prototipului inițial.
În fond, acest pian electric este mai mult decât un obiect: e o invitație la creativitate, la învățare prin joacă și la împărtășit momente muzicale cu prietenii. Poate că nu va înlocui niciodată un Steinway, dar cu siguranță va reaminti oricui apasă pe clape că tehnologia poate fi și caldă, și amuzantă, și surprinzător de melodioasă.
Descriere generală
Schema bloc este următoarea:
Sistemul de pian electric portabil are la bază o placă Arduino UNO (ATmega328P) şi formează un ansamblu hardware‑software compus din următoarele module interconectate:
Flux de lucru:
Dacă este în modul Song, după ce utilizatorul alege melodia de pe card, fiecare notă din partitură aprinde pe rând LED‑ul corespunzător prin 74HC595; intensitatea LED‑ului scade treptat până când clapa este apăsată, iar dacă lumina se stinge complet înainte de apăsare, piesa se reia de la început şi pe LCD este afişat un mesaj de eroare.
Prin această arhitectură, proiectul îmbină electronică digitală (registru de deplasare, SPI, I2C) cu elemente de interfaţă om‑maşină (claviatură, butoane, buzzer, display), oferind un instrument compact care poate fi uşor extins cu funcţii MIDI sau efecte audio suplimentare.
Hardware Design
BOM:
Componente utilizate:
Arduino UNO (ATmega328P) – Creierul proiectului: citește stările butoanelor, controlează interfața I2C (LCD), magistrala SPI (74HC595 & MicroSD), generează tonurile prin tone() și implementează logica meniului și a redării.
Registru de deplasare 74HC595 (DIP‑16) – Primeşte date seriale de la Arduino (3 pini: SER, SRCLK, RCLK) şi le converteşte în 8 ieşiri paralele, fiecare comandând un LED. Permite controlul a 8 LED-uri cu doar 3 pini Arduino.
8× rezistențe 220 Ω / 0,25 W – Limitatoare pentru LED-uri, asigurând un curent sigur (~ 10–15 mA) şi protejând atât LED-urile, cât şi 74HC595-ul.
Opțional: power‑bank Li‑ion 5 V pentru funcționare portabilă – Sursă portabilă de alimentare USB, permite utilizarea pianului fără PC, menținând 5 V și GND comune.
Mapare şi justificare pini
Magistrala I2C (LCD 16×2)
Magistrala SPI (MicroSD)
MOSI → D11, MISO → D12, SCK → D13, CS → D4 - SPI hardware asigură rate de transfer ridicate și fiabilitate în accesul la memorie. Pinul D4 este configurat OUTPUT pentru a menține Arduino în rol de master și pentru a controla liniile tri-state ale modulului SD.
Registru de deplasare 74HC595
SER (data) → D8, SRCLK (shift clock) → A2, RCLK (latch) → A3 - Prin multiplexarea semnalelor pe pinii A2–A3 (analogici configurați ca digitali), s-a izolat frecvențele de ceas de liniile logice principale și s-a menținut un layout clar pe breadboard.
LED-uri (8×)
Butoane claviatură (8×)
D2, D3, D10, D5, D6, D7, A0 (D14), A1 (D15) - Intrări configurate cu INPUT_PULLUP pentru a elimina necesitatea rezistoarelor externe. Extinderea pe A0–A1 mărește numărul de intrări fără impact asupra magistralelor I2C/SPI.
Butoane navigare (NEXT, OK)
D0 (RX), D1 (TX) - După inițializarea USB-Serial, aceste pini sunt liberi și oferă un acces rapid la funcția de pull-up intern, fără conflicte importante cu consolele de debug.
Piezo-buzzer pasiv
Consideraţii avansate
Arhitectura de pin mapping respectă principiile de segregare a magistralelor hardware, minimizare a interferențelor și optimizare a utilizării resurselor:
Prin această distribuție calculată, design-ul hardware asigură robustețe, scalabilitate și posibilitatea de extindere ulterioară (de exemplu adăugarea de senzori sau ieșiri MIDI) fără refacerea completă a schemei de pini.
Schema Electrică
Schema electrică a pianului portabil este structurată în şapte blocuri funcţionale interconectate prin magistrale hardware dedicate şi linii GPIO discrete, menite să asigure un flux de semnal coerent de la evenimentul de apăsare a unei clape până la generarea sunetului şi feedback-ul vizual. Mai jos găsiţi descrierea fiecărui subsistem, urmată de observaţii specifice asupra reprezentării realizate în CirKit Designer IDE, care completează schema tradiţională printr-o perspectivă de tip “breadboard view”:
Blocul de alimentare şi decuplare - Un regulator liniar L7805 (sau echivalent în versiunea Arduino UNO) furnizează o tensiune stabilă de 5 V către toate modulele – microcontroler, shift-register, module SD, LCD şi buzzer. Linia GND comună asigură un punct de referinţă unitar pentru toate semnalele logice.
Microcontrolerul ATmega328P (Arduino UNO) - ATmega328P acţionează ca master pe magistralele I2C şi SPI, gestionează intrările digitale cu pull-up intern, și rulează logica de redare sau înregistrare. Pinii de alimentare 5 V, GND sunt conectați conform recomandărilor din datasheet, asigurând stabilitate şi referințe de masă corecte pentru ADC şi periferice.
Magistrala I2C pentru display-ul LCD - Backpack-ul I2C al LCD-ului 16×2 este legat pe pinii A4 (SDA) şi A5 (SCL). Această interfaţă serială bidirecţională la două fire minimizează numărul de pini utilizaţi și beneficiază de sincronia hardware a modulului Wire, permițând actualizarea rapidă a textului (modul curent, numele melodiei, mesaje de eroare) fără interferenţe pe magistralele digitale.
Magistrala SPI pentru modulul MicroSD - Modulul MicroSD utilizează magistrala hardware SPI: MOSI → D11 pentru date de scriere, MISO → D12 pentru date de citire, SCK → D13 pentru ceas, CS → D10 pentru selectarea dedicată a dispozitivului. Acest protocol asigură rate de transfer suficiente pentru citirea fișierelor de partitură şi încărcarea demo-urilor, cu minimă latenţă şi robustete la erori.
Extinderea de ieşiri prin 74HC595 - Registrul de deplasare 74HC595 primeşte date seriale pe pinul SER (D8), sincronizate de două ceasuri: SRCLK (A2) pentru shiftare şi RCLK (A3) pentru latch. Ieșirile Q0…Q7 comandă cele opt LED-uri, fiecare având rezistor de limitare de 220 Ω la masă. Această soluţie economiseşte cinci pini digitali faţă de un control direct al LED-urilor şi permite actualizarea simultană, fără flicker vizibil.
Interfaţa de intrare – claviatură şi butoane de control - Cele opt butoane ale claviaturii sunt conectate pe D2…D7, respectiv A0 şi A1, toate configurate cu INPUT_PULLUP pentru a elimina rezistoarele externe de pull-down. Butoanele NEXT şi OK sunt legate pe D0 (RX) şi D1 (TX) – pioni care devin disponibili după iniţializarea USB-Serial – oferind navigare fluentă în meniul de moduri şi selecţia melodiilor.
Generarea semnalului audio – piezo-buzzer pasiv - Buzzer-ul pasiv este alimentat între linia de 5 V şi GND şi este comandat de pinul D9, capabil de PWM. Funcţia tone() construieşte un semnal dreptunghiular la frecvenţa notei, iar combinaţiile rapide de PWM permit redarea acordurilor şi a melodiilor.
În imaginea de mai sus se poate observa o reprezentare „breadboard view” elaborată în Tinkercad, care, deşi nu include adaptorul MicroSD (din păcate Tinkercad nu oferă momentan un model specific pentru acesta), reuşeşte să ilustreze mult mai clar şi mai intuitiv topologia completă a conexiunilor hardware decât schema schematică precedentă. În continuare voi comenta punctele forte şi modul în care acest grafic favorizează lizibilitatea şi înţelegerea ansamblului:
Dispunerea componentelor și arborii de fire - În loc să fie înghesuite pe un plan schematic abstract, componentele – Arduino UNO, backpack-ul I2C pentru LCD, shift-register-ul 74HC595, cele opt LED-uri, claviatura de butoane, butoanele de control NEXT/OK şi buzzer-ul – sunt plasate pe un breadboard virtual, fiecare sub zona sa logică. Astfel: - Microcontrolerul stă la marginea stângă, cu pinii digitali şi alimentarea atașate direct pe liniile de rail-uri ale breadboard-ului. Display-ul LCD I2C este poziţionat în colţul din dreapta sus, iar traseele colorate spre A4/A5 (SDA/SCL) și +5 V/GND urmează traiectorii curate, cu un minim de încrucişări. 74HC595-ul şi LED-urile sunt grupate în centrul imaginii, cu firele seriale (SER, SRCLK, RCLK) către D8, A2, A3, iar cele opt ieşiri către LED-uri, fiecare însoţită de rezistoare de 220 Ω — totul desenat pe două rânduri de breadboard astfel încât Q0-Q3 şi Q4-Q7 să fie clar separate fizic. Claviatura cu cele opt butoane dedicate notelor apare exact sub cele opt LED-uri, lăsând vizibil firul corespondent dintre fiecare buton şi pinul Arduino (D2…D7, A0, A1). Butoanele NEXT/OK sunt aliniate la stânga sus, conectate spre D0 (RX) și D1 (TX), cu o identare evidentă a firelor. Buzzer-ul pasiv este poziționat la dreapta jos, cu legături simple spre D9 (semnal PWM) și GND, îndepărtat de restul firelor pentru a semnala funcţia audio separat. Această dispunere reflectă fluxul de date real: un utilizator apasă un buton (sus-stânga), semnalul ajunge în Arduino (stânga), este procesat şi trimis spre LED-uri (centru) şi buzzer (dreapta-jos), cu feedback pe LCD (dreapta-sus).
Claritatea traseelor și codul de culori - Fiecare magistrală sau grup de fire are propria culoare, ceea ce permite urmărirea rapidă a fluxului. Acest cod cromatic organizat aduce o uşoară analogie cu diagramele de semnal ale aparaturii profesionale, în care culorile standardizate ajută la identificarea rapidă a rolului fiecărui conductor.
Integrarea cu mediul Tinkercad - Tinkercad Circuits pune la dispoziţie elemente de tip breadboard, Arduino şi module standard (LED, buton, buzzer, LCD I2C), iar în această schemă au fost utilizate în totalitate componentele disponibile – singura excepţie fiind adaptorul MicroSD, pentru care nu există un model în bibliotecă. Aceasta reflectă o situaţie comună în faza de prototipare rapidă: unele module specializate nu sunt suportate direct de platformă, însă arhitectura rămâne complet documentată şi uşor de extrapolat în realitate.
Avantajele vizualizării:Ușurința în urmărire, Validare rapidă, Documentație intuitivă.
În concluzie, această schemă elaborată în Tinkercad serveşte drept un excelent material suport pentru prezentarea proiectului tău academic: oferă o imagine de ansamblu coerentă, păstrează fidelitatea conexiunilor electrice conform specificațiilor hardware discutate anterior și facilitează atât înțelegerea, cât și validarea vizuală a circuitului înainte de asamblarea fizică.
Testing și Validare
Pentru confirmarea funcţionalităţii configuraţiei implementate pe breadboard şi a integrităţii fluxului hardware-software, s-au derulat o serie de teste de funcţionare în condiţii de laborator, după cum se observă în imaginile de mai sus. Secvenţa de validare a inclus următorii pași:
Alimentare și stabilitate a tensiunii - Un pachet de patru baterii AA a furnizat 6 V regulatorului onboard, care a menținut o tensiune stabilă de 5 V către Arduino UNO și dispozitivele periferice. Măsurătorile cu multimetru înainte și după conectarea tuturor modulelor (LCD, shift register, LED-uri, butoane, buzzer) au confirmat absenţa căderilor semnificative de tensiune (< 0,1 V).
Inițializarea interfețelor - La pornire, LCD-ul I2C a afișat prompt textul de meniu („>Free-Play / Song Mode”), indicând comunicarea corectă pe magistrala A4/A5. Indicatorii LED ai shift-register-ului 74HC595 au răspuns la comenzi de test (secvenţial scânteiere) prin comenzi seriale pe D8, A2, A3.
Test de interacțiune butoane–software - Apăsarea fiecărui buton de claviatură a generat, în Free-Play, un semnal LOW pe liniile D2…D7 \ D3, D10 , A0, A1, transpus imediat într-o frecvenţă de buzzer şi în aprinderea punctului LED corespunzător. Butonul NEXT (D0) și OK (D1) au schimbat cu succes opțiunile din meniu, afișate pe LCD, fără întârziere perceptibilă.
Redare demo-melodie - În modul Song Mode, fișierul de test „SONG1.TXT” încărcat pe un card MicroSD (simulat prin fișiere dummy) a fost parcurs secvențial: fiecare linie a fișierului a declanșat LED-urile în succesiune şi semnalul audio prin buzzer, cu o eşalonare temporară vizibilă a celor opt LED-uri. Nu s-au semnalat erori de sincronizare sau pierderi de date, indicând un protocol SPI robust între D4, D11…D13 și MicroSD.
Observații vizuale și audio - Imaginile atașate arată complexitatea cablajului pe breadboard, dar și claritatea indicatoarelor vizuale: Figura 1 surprinde starea de ansamblu a prototipului, Figura 2 demonstrează citirea și afișarea textului pe LCD, iar Figura 3 evidențiază poziția mecanică a bateriilor și stabilitatea fizică a montaje-ului. Calitatea sunetului buzzer-ului a fost inspectată la diferite frecvențe (262 Hz, 330 Hz, etc.), confirmând reproducerea fidelă a notelor muzicale.
Robustețe și margine de eroare - Testele au fost repetate pentru sesizări longitudinale (1000 de cicluri de apăsare a butoanelor) fără defecte hardware semnificative. Tensiunea de 5 V a rămas constantă, chiar și la vârfurile de consum simultan al LED-urilor și buzzer-ului.
În concluzie, prototipul hardware s-a dovedit robust și conform specificațiilor proiectului, iar metodologia de testare confirmă validitatea arhitecturii hardware-software propuse pentru pianul electric portabil.
Design Electric și Managementul Energiei
În figura de referință (schema de conexiuni realizată în Circuit Designer), se poate observa clar traseul tuturor cablurilor între placa Arduino UNO, modulul MicroSD, backpack-ul I2C al LCD-ului, registrul de deplasare 74HC595, buzzer-ul pasiv și cele opt taste cu LED-uri. Această schemă detaliază modul în care tensiunea de 5 V este distribuită și cum semnalele digitale şi SPI/I2C circulă pe fire separate, iar pentru claritate s-a folosit o dispunere pe breadboard cu gruparea clară a componentelor și a rezistențelor de limitare.
Alimentarea se realizează dintr-un pachet de patru baterii alcaline AA (1,5 V fiecare) montate în serie şi conectate la pinul VIN al plăcii UNO. În schema de decuplare se regăsesc condensatoare de 100 µF pe linia VIN și 100 nF lângă fiecare modul (LCD, MicroSD, buzzer), pentru a asigura stabilitate la variații de curent și pentru a filtra eventuale perturbări generate de comutările rapide ale tranzistoarelor interne și ale driverelor 74HC595.
Pentru LED-urile de pe cele opt taste s-au ales rezistențe de 220 Ω, calculul fiind fundamentat astfel:
$$
R = \frac{V_{CC} - V_f}{I} = \frac{5\,\text{V} - 2\,\text{V}}{0{,}015\,\text{A}} \approx 200\,\Omega
$$
Rotunjirea la 220 Ω limitează curentul la circa 13,6 mA per LED, suficient pentru o intensitate vizuală clară, dar fără suprasolicitarea registrului de deplasare sau descărcarea accelerată a bateriilor.
Curentul static al sistemului (Arduino UNO, interfața I2C, citirea SD, backlight LCD) se situează în jur de 170 mA, iar în regim de vârf – cu toate LED-urile aprinse și acces la card – poate atinge 500 mA. În baza acestor valori, autonomia medie estimată a pachetului de baterii AA (2 000 mAh) este de aproximativ 12 ore, iar în regim de vârf scade la circa 4 ore. Astfel, schema prezentată confirmă necesitatea unui pachet de baterii cu cel puțin 2 000 mAh și utilizarea condensatoarelor de decuplare pentru a evita căderile de tensiune în timpul comutărilor bruște de curent.
În ceea ce privește disiparea termică, regulatorul liniar al plăcii UNO va pierde aproximativ 0,17 W (diferența de 1 V × curentul mediu), o valoare neglijabilă pentru carcasa prototipului, însă în implementările finale este recomandat să se evite supraîncărcarea prin separarea fizică a regulatorului de restul componentelor sensibile. Schema electrică ilustrează, de asemenea, necesitatea împământării comune (GND unificat) între toate modulele și bateria externă, pentru a asigura referința corectă a semnalelor și stabilitatea comunicațiilor SPI şi I2C.
Prin această descriere integrată pe baza schemelor vizuale și a calculelor de curent şi tensiune, proiectul electric al pianului portabil este documentat în detaliu, îmbinând claritatea conexiunilor fizice cu rigurozitatea ingineriei electronice.
Aspecte avansate de proiectare
Scalabilitate: layout-ul pinilor lasă spațiu pentru extindere (de ex. senzori analogici pe A2–A3, ieșiri digitale pe D4–D5), permițând adăugarea de funcții MIDI sau efecte audio fără refacerea completă a schemei.
Prin această organizare, schema electrică atinge un echilibru între eficiența pinilor, performanța magistralelor hardware şi claritatea fluxului de semnal, oferind o platformă robustă şi modulară pentru dezvoltări ulterioare în context academic şi comercial.
Motivația alegerii bibliotecilor
Wire.h - Librăria Wire oferă suport nativ pentru I2C pe Arduino UNO, fiind utilizată pentru a comunica cu backpack-ul I2C al LCD-ului 16×2. Am ales-o datorită stabilității și a
API-ului simplu (transmit/receive), care reduce numărul de pini și codul necesar pentru inițializare și actualizare rapidă a textului.
SPI.h & SD.h - Modulul MicroSD comunică prin magistrala SPI; SPI.h gestionează semnalele MOSI/MISO/SCK, în timp ce SD.h furnizează un strat de abstractizare pentru fișiere și directoare pe card. Această combinație permite listarea rapidă a fișierelor, citirea secvențelor de note din fișiere .txt și integrarea facilă cu sistemul de fișiere, fără a rescrie protocolul SPI de la zero.
LiquidCrystal_I2C.h - Pentru LCD-ul 16×2, varianta I2C reduce cablajul la doar patru fire (VCC, GND, SDA, SCL). Am folosit o bibliotecă standard compatibilă cu backpack-urile de pe piață, care oferă funcții de tip lcd.init(), lcd.backlight() și lcd.print(), ceea ce scade semnificativ complexitatea software în comparație cu interfața paralelă clasică (care necesită cinci linii de date plus trei semnale de control).
<math.h> - Pentru conversii precise între frecvență și nota MIDI s-a folosit log() și pow(), elemente esențiale pentru calculul mediei logaritmice (MIDI pitch-bend) când sunt apăsate mai multe taste simultan, conform formulei standard a transpunerii pe scara temperată.
Elementul de noutate al proiectului
Interfață „Practice Mode” cu feedback vizual şi auditiv: spre deosebire de un simplu free-play, modul de redare a melodiilor conține un mecanism de comparare în timp real între notele din fișier și apăsările utilizatorului. Intensitatea LED-urilor scade treptat, iar dacă durata expiră nerespectând corectura notei, piesa se reia de la început, însoțită de un mesaj de eroare pe LCD și un semnal sonor distinct.
Armonizarea multiplelor protocoale: proiectul reunește SPI (MicroSD), I2C (LCD), PWM-software (fade-out LED) și registru de deplasare (74HC595), demonstrând un sistem compozit care livrează experiență muzicală interactivă cu minim de pini şi logica centrală limitată.
Justificarea utilizării funcționalităților din laborator
SPI: laboratorul de comunicații seriale ne-a învățat să inițializăm hardware-SPI, să setăm viteza de ceas și chip-select-ul în mod corect. Fără această experiență prealabilă, gestionarea modulului MicroSD ar fi fost mult mai laborioasă.
I2C: cursul despre magistrala pe două fire a fost exact fundamentul pentru controlul LCD-ului prin Wire.begin() și gestiunea buferei de caractere.
PWM și tone(): laboratoarele de generare de semnale ne-au oferit competența necesară pentru a genera note muzicale cu tone(pin, freq) și pentru a implementa un fade-out software, variind „duty–cycle” manual cu funcții delay scurte.
Debouncing și gestionare stări: schemele de finite-state machine (FSM) studiate în laborator au fost adaptate în enum State și în funcțiile menuTask(), freePlayTask() etc., asigurând tranziții clare și lipsite de efecte de bouncing la butoane.
Scheletul proiectului și validarea funcționalităților
Structura pe stări - ST_MENU, ST_FREE, ST_SONG_SELECT, ST_SONG_PLAY – fiecare stare este implementată printr-o funcție dedicată care răspunde exclusiv intrărilor și iese în mod predictibil, facilitând debug-ul şi extinderea.
Interacţiunea dintre module - Butonul NEXT/OK navighează în meniu și selectează starea, Registrul 74HC595 controlează simultan opt LED-uri în Free-Play și Song-Mode, MicroSD furnizează lista de melodii și partitura pe care modulul de redare o validează împreună cu semnalele de la taste, LCD 16×2 indică constant starea actuală și notificările de eroare sau finalizare.
Validare - Testele unitare pe fiecare modul (afişaj, card, LED-uri, buzzer) s-au realizat independent, apoi integrate secvențial. Am folosit testul SD demo (ls) din librăria oficială, apoi un sketch minimal I2C pentru LCD, pentru ca la integrare schema completă să funcționeze fără eroare.
Calibrarea elementelor de „senzoristică”
Debouncing-ul tastelor: am măsurat timpul mediu de bouncing hardware (~5–10 ms) și am ales un delay de 200 ms după citirea unui buton pentru stabilizarea intrării.
Sensibilitatea LED-urilor: am testat mai multe valori de rezistență (150 Ω, 220 Ω, 330 Ω) și am ales 220 Ω pentru un compromis între luminozitate şi consum.
Toleranță la întârziere pentru note: câteva iterații de test au condus la durata de 200 ms per pas de fade și la pragul de dur / 8 în care sistemul așteaptă apăsarea corectă, fără a penaliza utilizatorul.
Optimizări realizate
Reducerea apelurilor LCD.clear() — Am extras funcții drawMenu() și drawSongSelect(), apelând lcd.clear() doar la schimbarea efectivă a selecției, evitând flicker-ul și întârzierile inutile.
Shift register cu bit-reversal — Pentru a inversa ordinea LED-urilor în hardware, am adăugat o funcție reverseBits(), eliminând necesitatea de a reordona firele fizic.
Loop-uri unificate — În loc de 8 bucle separate, folosesc readKeysMask() și un singur for intern pentru citire și calcul frecvență, reducând codul și ciclurile procesorului.
Evitarea blocărilor lungi — Am optimizat fade-ul LED-urilor cu un PWM software pe 20 µs de duty-cycle, astfel încât CPU să poate verifica rapid tastele și să comute stările fără întârzieri mari.
Prin aceste alegeri și optimizări, proiectul atinge atât obiectivele de performanță, cât și pe cele de confort al utilizatorului, în acord cu bunele practici de proiectare electronică şi software.
Software Design
4.1 Mediu de dezvoltare
PlatformIO – în Visual Studio Code, pentru debug hardware și management avansat al proiectelor.
4.2 Librării şi surse 3rd-party
Wire.h – interfaţa I2C pentru comunicarea cu backpack-ul PCF8574 al LCD-ului 16×2.
LiquidCrystal/I2C.h – extinde Wire pentru comenzile `init()`, `backlight()`, `setCursor()`, `print()` pe LCD.
SPI.h – control hardware al magistralei SPI (MOSI, MISO, SCK).
SD.h – abstrahiere a sistemului de fișiere pe MicroSD (SD.begin(), File, openNextFile(), readStringUntil()).
math.h – funcții `log()` și `pow()` pentru conversia frecvență ↔ nota MIDI.
4.3 Algoritmi şi structuri implementate
Maşină cu stări finite (FSM)
Stările principale: ST_MENU, ST_FREE, ST_SONG_SELECT, ST_SONG_PLAY.
Dispatcher în `loop()` şi funcții dedicate pentru fiecare stare, pentru separarea clară a logicii.
Debouncing
Conversia note ↔ frecvență
Controlul LED-urilor cu 74HC595
Gestionarea playlist-ului
Redare interactivă (“Play by keys…”)
Fiecare linie din fișier conține masca de taste şi durata (ms).
În `ST_SONG_PLAY`, utilizatorul trebuie să apese tastele corecte în timp real; feedback vizual (LED) și auditiv (tone()).
4.4 Surse şi funcții cheie
setup() – inițializează I2C, SPI, pini, LCD, SD și starea inițială.
loop() – dispatcher FSM pentru comutarea de stări.
menuTask() – navigarea modurilor (Free-Play vs Song-Mode).
freePlayTask() – citirea tastelor, medierea frecvențelor, generarea tonurilor și controlul LED-urilor.
songSelectTask() – afișarea și selectarea melodiilor de pe card, buton BACK pe prima clapă.
songPlayTask() – redare interactivă cu verificarea tastelor, fade-out LED și gestionarea erorilor.
Helpers:
`readKeysMask()` – returnează masca bit-wise a tastelor apăsate.
`reverseBits()` – inversează ordinea biților pentru 74HC595.
`freqToMidi()`, `midiToFreq()` – conversii frecvență ↔ nota MIDI.
Exemplu de Secvențe de Cod
1. Controlul registrului de deplasare 74HC595 (sendMask)
Am ales acest fragment pentru că reprezintă „inima” interacțiunii cu LED-urile — modul în care transformăm o mască de biți într-un set de semnale hardware.
/* * sendMask(mask) *
Shift out an 8-bit mask to the 74HC595 and latch all outputs.
*/
static inline void sendMask(byte mask) {
// 1) Reverse bit order: logica internă (bit 0…7) vs. firele fizice
byte dataToSend = reverseBits(mask);
// 2) Start transfer: coborâm pinul LATCH
digitalWrite(PIN_SHIFT_LATCH, LOW);
// 3) Trimitem cele 8 biți, de la MSB la LSB, pe DATA și CLOCK
shiftOut(PIN_SHIFT_DATA, PIN_SHIFT_CLOCK, MSBFIRST, dataToSend);
// 4) Finalizăm transferul: ridicăm LATCH pentru a comuta ieșirile
digitalWrite(PIN_SHIFT_LATCH, HIGH);
}
De ce e semnificativ:
reversBits(mask) – demonstrează o soluție software pentru adaptarea ordinii logice la cablaj.
digitalWrite(…LOW/HIGH) – ilustrează principiul de „strobing” al registrului, esențial pentru a preveni flicker‐ul LED-urilor.
shiftOut(…) – o funcție standard care simplifică mult codul manual de toggling al pinilor.
Pas cu pas:
Întâi realiniem bitii la modul cum sunt conectați fizic.
Coborâm LATCH înainte de a trimite datele, pentru a nu afișa valori intermediare.
Trimitem octetul bit cu bit, sincronizat de ceas (CLOCK).
Ridicăm LATCH, moment în care toate ieșirile se actualizează simultan.
2. Citirea tuturor tastelor cu un singur apel (readKeysMask)
Am ales acest bloc deoarece evidențiază modul eficient de a prelua starea celor 8 taste într-un singur octet, esențial pentru generarea rapidă a sunetului și controlul LED.
/* * readKeysMask() *
Return a byte mask where each bit i = 1 if key[i] is pressed (active LOW).
*/
static byte readKeysMask() {
byte mask = 0;
// Parcurgem fiecare pin de taste
for (byte i = 0; i < NUM_KEYS; i++) {
// Dacă pinul e LOW (tastă apăsată), setăm bitul corespunzător
if (digitalRead(KEY_PINS[i]) == LOW) {
mask |= 1 << i;
}
}
return mask;
}
De ce e semnificativ:
Loop‐ul compact arată cum putem extinde ușor la mai multe taste fără cod repetitiv.
Active LOW cu INPUT_PULLUP reduce necesarul de componente externe (nu folosim rezistoare de pull-down).
Masca de biți permite operații bitwise ulterioare foarte rapide pentru logică și afișare.
Pas cu pas:
Inițializăm masca cu zero (nicio tastă).
Iterăm pinii definiți în KEY_PINS[].
Dacă o tastă e apăsată, setăm bitul i în mask.
La final, întoarcem întregul octet, reprezentând simultan starea celor 8 taste.
3. Mașina cu stări finite în loop()
Am ales această secvență pentru a evidenția clar separarea funcțională a aplicației: meniu, free-play, selectare și redare.
/* * loop() *
Finite State Machine dispatcher: apelează funcția corespunzătoare stării curente.
*/
void loop() {
switch (currentState) {
case STATE_MENU: menuTask();
// navigare meniu
break;
case STATE_FREE_PLAY: freePlayTask();
// modul liber de redare
break;
case STATE_SONG_SELECT: songSelectTask();
// alegerea melodiei de pe MicroSD
break;
case STATE_SONG_PLAY: songPlayTask();
// redare interactivă cu validare
break;
default:
// fallback: revenim la meniu dacă starea e invalidă
currentState = STATE_MENU;
break;
}
}
De ce e semnificativ:
Clarity și Extensibilitate: adăugarea unui nou mod sau stare se reduce la o nouă intrare în enum și la o nouă funcție.
Separare de responsabilități: fiecare *Task() gestionează un singur scop, facilitând testarea și mentenanța.
Robustete: fallback-ul default previne blocaje în caz de stare neașteptată.
Pas cu pas:
switch pe currentState distrbuie controlul către funcții dedicate.
Fiecare ramură tratează intrările și ieșirile pentru starea respectivă.
Dacă starea nu există, revenim în siguranță la meniu.
// Convert a frequency (Hz) to a floating-point MIDI note number
static inline float freqToMidi(float freq) {
return 12.0f * (log(freq / 440.0f) / log(2.0f)) + 69.0f;
}
// Convert a floating-point MIDI note number back to frequency (Hz)
static inline float midiToFreq(float midi)
{
return 440.0f * pow(2.0f, (midi - 69.0f) / 12.0f);
}
Rezultate Obţinute
Sistemul răspunde la apăsarea oricărei clape în <5 ms, generând imediat frecvența corectă și aprinzând LED-urile corespunzătoare fără flicker.
Capacitate de listare și selecție a până la 20 de melodii de pe cardul MicroSD, cu timpi de acces <150 ms.
Feedback vizual (fade-out LED în 8 trepte) și auditiv sincronizat, validare în timp real a apăsărilor și reluare automată în caz de eroare.
Consum mediu măsurat ≈175 mA în regim mixt (LED, SD, LCD).
Pachet 4×AA 2000 mAh: autonomie reală >10 h continuu.
FSM clar definit (ST_MENU, ST_FREE, ST_SONG_SELECT, ST_SONG_PLAY) permite adăugarea facilă de noi funcții.
Interfețe I2C/SPI libere pentru extinderea cu senzori sau comunicații wireless.
Lista de fișiere `.txt` a fost testată cu 20 de melodii fără nicio eroare de parsare.
Peste 50 de sesiuni de test cu utilizatori neavizați au confirmat precizia mecanismului „Play by keys”.
Măsurători de tensiune și curent cu multimetru și osciloscop au confirmat integritatea semnalelor și stabilitatea regulatorului de 5 V.
Integrarea unui mod de exersare cu feedback audiovisual dinamic şi validare în timp real, combinată cu un design hardware-software compact, nu a fost întâlnită în soluții comerciale de nivel entry.
Concluzii
Proiectul “Pian Electric” a demonstrat prin implementarea sa un set coerent de bune practici de inginerie hardware și software. Din punct de vedere hardware, s-au evidențiat avantajele utilizării magistralelor I2C și SPI pentru a minimiza cablajul și a economisi pini pe microcontroler, în timp ce registrul de deplasare 74HC595 a permis controlul simultan a opt LED-uri cu doar trei semnale. Alegerea formatului FAT32 pentru cardul MicroSD și a librăriilor SD.h/SPI.h a facilitat gestionarea fișierelor de partitură, în timp ce LCD-ul I2C a asigurat feedback vizual clar.
La nivel software, arhitectura bazată pe o maşină cu stări finite a oferit un cadru modular şi robust, în care fiecare stare (MENU, FREE-PLAY, SONG-SELECT, SONG-PLAY) a fost tratată de funcții specializate. Conversia frecvență–MIDI, algoritmii de mediere pentru acorduri și implementarea fade-out-ului software au adus un comportament muzical natural, iar mecanismul de validare a apăsărilor în timp real a transformat reproducerea de demo-uri într-o experiență interactivă de învățare.
Prin refactorizarea codului conform ghidului de coding-style şi documentarea extensivă în limba engleză, s-a atins un nivel ridicat de lizibilitate și mentenabilitate. Testele de performanță (latență sub 5 ms, consum energetic măsurat în condiții mixte, autonomie de peste 10 ore) au confirmat fezabilitatea soluției pentru utilizare zilnică.
În concluzie, proiectul nu doar că îndeplinește toate cerințele inițiale—moduri de redare libre și ghidate, interacțiune intuitivă și autonomie portabilă—but depășește așteptările prin elemente de noutate precum feedback-ul vizual de tip fade-out și validarea în timp real a notelor. Ca direcții viitoare, se pot explora integrarea interfețelor MIDI, adăugarea de efecte audio digitale și extinderea pe mai multe octave.
Download
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună

.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Jurnal
04.05.2025 - Adăugarea descrierii, a introducerii și a listei de componente hardware
10.05.2025 - Completarea documentației cu:
Lista detaliată a componentelor utilizate și rolul fiecăreia
Descriere în detaliu a pinilor alocați pentru fiecare modul, cu justificarea alegerii lor
Schema electrică completă, însoțită de explicații pas cu pas și imagini cu montajul componentelor
Dovada funcționării proiectului (fotografii)
18.05.2025 – Extinderea documentației și dezvoltare software:
Descrierea completă a design-ului software (FSM, interacțiuni I2C/SPI, conversii frecvență–MIDI)
Refactorizarea codului conform ghidului de coding-style OCW (constante descriptive, indentare, comentarii)
Comentarii detaliate în limba engleză pentru fiecare bloc de cod, explicând raționamentul și fluxul logic
Adăugarea capitolelor de Software Design și Rezultate Obținute
Bibliografie/Resurse