Pian pe distante
Introducere
Acest pian pe distante va fi un pian putin simplificat care se bazeaza pe cum pozitionezi tu mainile in fata unor senzori de dinstanta pentru a reda note muzicale sau mai bine spus, sunete la diferitre frecvente. In functie de distanta la care este tinuta mana sau cat de mult este tinuta in pozitia respectiva, va fi redat un sunet. Astfel se poate forma in timp real o linie melodica.
Scopul lui este de a imita functionalitatea unui pian normal, dar cu o gama mai mica de sunete redate si fara a trebui sa apesi pe clape pentru a reda sunetul.
M-am inspirat de la theremin, un instrument muzical care se foloseste de cum misti tu mainile pentru a reda sunet. Mi s-a parut interesanta ideea si mi-am dorit sa fac ceva care sa se apropie de ideea lui.
Acest proiect este o oportunitate buna de invatare dar cred ca poate aduce si o satisfactie la final, putand fiind folosit cand vrei sa te recreezi si sa canti cu el.
Descriere generală
Sunetele vor fi redate de difuzoare, fiecare senzor de distanta va avea difuzorul lui. La pozitionarea unui deget in fata a cel putin unuia din senzori, difuzorul corespunzator lui va reda sunet. Pentru fiecare senzor va fi o distanta prestabilita impartita in bucati, in functie de pozitionarea degetului va fi redat un sunet la o anumita frecventa. Distantele predefinite vor avea cate o frecventa de redare pentru difuzor. La pozitionarea degetului, senzorul va trimite distanta receptionata la Arduino UNO, acesta va decide in ce portiune din lungime se afla apoi va atentiona difuzorul alocat ce frecventa pentru suntet trebuie sa redea. Sunetul va fi redat cat timp degetul se alfa in limitele regiunii de lungime alocate frecventei respective.
Hardware Design
Piese necesare:
2 x Arduino UNO - microcontroler
4 x Senzori de distanta(cu ultrasonice) - pentru a putea masura distantele
4 x Difuzoare - pentru redare sunet
Schema:
vom folosi doar de pinii digitali ai arduinoului.
pinii: 2, 3, 11, 12 vor fi conectati la difuzoare si prin ei vom reda sunetul
pinii: 9, 7 vor fi conectati la pinii trig ai senzorilor, cu ajutorul carora atentionam senzorii ca pot incepe transmiterea de unde sonore ultrasunete
pinii: 8, 6 vor fi conectati la pinii echo ai senzorilor, cu ajutorul carora vom calcula care este distanta de la deget la senzor; acesti pini echo vor atentiona cand au receptionat unda trimisa de trig
Circuit:
Software Design
Descrierea codului aplicaţiei:
biblioteci:
Tone - pentru a putea reda sunete pe mai multe difuzoare in acelasi timp
Timer - este folosit pentru un delay intre notele schimbate, ca in cazul in care sunt fluctuatii foarte mici de distante si nu este necesara schimbarea notei sa nu se ia in calcul
long SonarSensor(int trigPin,int echoPin)
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = (duration/2) / 29.1;
return distance;
}
if (abs(firstDistance1 - distance1) >= 2 && timer1.read() > timer) {
firstDistance1 = distance1;
} else {
distance1 = firstDistance1;
}
distanta cu care vom lucra este de 40 de cm, tot ce e mai mare de atat nu va avea repartizat vreo nota
aceasta distanta este impartita in 5 regiuni de cate 8 cm; de la cea mai apropiata de senzor, la cea mai indepartata avem urmatoarele note: NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4
o schimbare de nota se va face doar daca distanta de schimbare se afla in limitele notei respective si daca a trecut un timp mai mare decat “timer” de cand a fost produsa ultima schimbare
if (distance1 >= 0 && distance1 < 8 && timer1.read() > timer) {
tone1.play(NOTE_C4);
timer1.stop();
timer1.start();
} else if (distance1 >= 8 && distance1 < 16 && timer1.read() > timer) {
tone1.play(NOTE_D4);
timer1.stop();
timer1.start();
} else if (distance1 >= 16 && distance1 < 24 && timer1.read() > timer) {
tone1.play(NOTE_E4);
timer1.stop();
timer1.start();
} else if (distance1 >= 24 && distance1 < 32 && timer1.read() > timer) {
tone1.play(NOTE_F4);
timer1.stop();
timer1.start();
} else if (distance1 >= 32 && distance1 < 40 && timer1.read() > timer) {
tone1.play(NOTE_G4);
timer1.stop();
timer1.start();
} else if (timer1.read() > timer){
tone1.stop();
}
Rezultate Obţinute
Download
Bibliografie/Resurse