Autor: Iulian-Sebastian Docan
Grupa: 331AC
Având în vedere obiectivul acestui proiect, utilizarea celor 4 potențiometre pentru modificarea tonalității notelor constituie o modalitate optimă și facilă de implementare. Includerea potențiometrelor a impus și folosirea funcției specifice Arduino numită map(), pentru a calibra noul interval de valori care vor fi modificate. Prin urmare, capetele default ale interfalului 0 - 1023 sunt remapate pentru a corespunde intervalului marcat de variabilele lowFreq - highFreq din codul sursă.
De asemenea, redarea notelor muzicale necesită folosirea unor alte funcții specifice, tone() și noTone(). Cea dintâi va reda un semnal dreptunghiular pe pinul desemnat pentru mini-speaker, cu o frecvență la alegere (nota propriu-zisă) și o durată (poate fi omisă), iar cea de-a doua funcție va înceta redarea pe acel pin.
Pe lângă aceste module importante, se numără și includerea LED-urilor care se aprind într-o cadență determinată de BPM-ul setat de al cincilea potențiometru. Aceste LED-uri conectate la patru din pinii digitali ai plăcii se aprind și se sting folosind o funcție definită care realizează apeluri ale modulului digitalWrite(), în funcție de valoarea fiecărui potențiometru.
În designul acestui program sunt incluse două funcții definite de utilizator, void switchLEDs(int) ce realizează aprinderea și stingerea LED-urilor într-o manieră succesivă și int getNote(int) pentru determinarea frecvenței notei ce va fi redată în urma schimbării valorilor unuia dintre cele 4 potențiometre.
void switchLEDs(int pattern) { switch (pattern) { case 0: digitalWrite(LED4, LOW); digitalWrite(LED1, HIGH); break; case 1: digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); break; case 2: digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); break; case 3: digitalWrite(LED3, LOW); digitalWrite(LED4, HIGH); break; } }
int getNote(int pattern) { if (pattern == 0) { note = map(analogRead(A0), 0, 1023, lowFreq, highFreq); } else if (pattern == 1) { note = map(analogRead(A1), 0, 1023, lowFreq, highFreq); } else if (pattern == 2) { note = map(analogRead(A2), 0, 1023, lowFreq, highFreq); } else if (pattern == 3) { note = map(analogRead(A3), 0, 1023, lowFreq, highFreq); } return note; }
În interiorul funcției void setup() se realizează inițializarea pinilor digitali la care sunt conectate LED-urile.
pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW);
În cadrul funcției void loop() se verifică valoarea BPM-ului, setată de potențiometru, ce poate lua valori între 80 și 4000, după care se apelează funcțiile switchLEDs și getNote pentru a realiza funționalitățile principale de redare a sunetului și a jocului de lumini.
switchLEDs(pattern); note = getNote(pattern); pattern = (pattern + 1) % 4; if (note > lowFreq + 10) { tone(speaker, note); }
Arhiva ce conține codul sursă al proiectului, precum și imaginile schemelor de cricuit poate fi descărcată de aici.