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:

  • aici avem un exemplu de cum vor fi conectate componentele

Software Design

Descrierea codului aplicaţiei:

  • mediu de dezvoltare → Arduino IDE
  • 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
  • funcţii implementate
    • SonarSenzor care intoarce dinstanta
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;
}
  • algoritmi si structuri pe care plănuiti să le implementati:
    • pentru calcularea distantelor am folosit functia “SonarSensor”
    • dupa ce am facut rost de distantele receptionate de cei doi senzori, cele pentru care vom schimba notele se vor schimba doar daca a fost o diferenta de cel putin 2 cm intre distanta actuala si cea precedenta.
  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();
  }
  • Calibrarea si optimizarea elementelor:
    • timerul si acea diferenta de 2 cm ma ajuta la calibrare
    • de foarte multe ori sunt fluctuatii mici intre distantele interceptate de senzori, iar intr-un caz de genul nu este mereu nevoie si de o schimbare de nota
    • cu aceste 2 imbunatatiri am reusit sa calibrez si optimizez performanta pianului
  • Element de noutate
    • este o experienta unica sa canti la un astfel de instrument daca nu ai avut sansa sa incerci un theremis
  • Noutiuni folosite din laborator:
    • GPIO → pentru trimiterea si receptia semnalelor de la senzorii ultrasonici
    • UART → pentru comunicarea seriala cu calculatorul (pentru a avea si o evidenta vizuala la ce se intampla, afisez in interfata seriala distantele interceptate de senzori si timpul intregistrat de timere)
    • Timere
    • PWM → pentru generarea tonurilor audio
    • Intreruperi → implicit utilizate de temporizatoare si functiile de tonuri

Rezultate Obţinute

Download

Bibliografie/Resurse

pm/prj2024/aungureanu/cristinaionescu.02.txt · Last modified: 2024/05/26 15:43 by cristina.ionescu02
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