This shows you the differences between two versions of the page.
pm:prj2024:aungureanu:cristinaionescu.02 [2024/05/16 14:13] cristina.ionescu02 [Hardware Design] |
pm:prj2024:aungureanu:cristinaionescu.02 [2024/05/26 15:43] (current) cristina.ionescu02 [Rezultate Obţinute] |
||
---|---|---|---|
Line 10: | Line 10: | ||
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. | 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. | ||
- | {{ :pm:prj2024:aungureanu:schemabloc_pian_pe_distante.png?500 |}} | + | {{ :pm:prj2024:aungureanu:schemabloc_pian_pe_distante-final.png?500 |}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
**Piese necesare**: | **Piese necesare**: | ||
- | * Arduino UNO - microcontroler | + | * 2 x Arduino UNO - microcontroler |
- | * Senzori de distanta(cu ultrasonice) - pentru a putea masura distantele | + | * 4 x Senzori de distanta(cu ultrasonice) - pentru a putea masura distantele |
- | * Difuzoare - pentru redare sunet | + | * 4 x Difuzoare - pentru redare sunet |
**Schema**: | **Schema**: | ||
- | * dupa cum se poate observa si in schema, vom folosi doar de pinii digitali ai arduinoului. | + | * vom folosi doar de pinii digitali ai arduinoului. |
- | * pinii: 4, 7, 10, 13 vor fi conectati la difuzoare si prin ei vom reda sunetul | + | * pinii: 2, 3, 11, 12 vor fi conectati la difuzoare si prin ei vom reda sunetul |
- | * pinii: 2, 5, 8, 11 vor fi conectati la pinii trig ai senzorilor cu ajutorul carora atentionam senzorii ca pot incepe transmiterea de undelor sonore ultrasunete | + | * 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: 3, 6, 9, 12 vor fi conectati la pinii echo ai senzorilor cu ajutorul carora vom calcula care este distanta de la deget la senzor; acest pin echo atentionand cand a receptionat unda trimisa de trig | + | * 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 |
- | {{ :pm:prj2024:aungureanu:schema-pian-pe-dstante.png?700 |}} | + | {{ :pm:prj2024:aungureanu:schema-pian-pe-dstante-final.png?700 |}} |
**Circuit**: | **Circuit**: | ||
* aici avem un exemplu de cum vor fi conectate componentele | * aici avem un exemplu de cum vor fi conectate componentele | ||
- | {{ :pm:prj2024:aungureanu:circuit-pian-pe-dstante.png?700 |}} | + | {{ :pm:prj2024:aungureanu:circuit-pian-pe-dstante-final.png?800 |}} |
- | <note tip> | ||
- | Aici puneţi tot ce ţine de hardware design: | ||
- | * listă de piese | ||
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | ||
- | * diagrame de semnal | ||
- | * rezultatele simulării | ||
- | </note> | ||
===== Software Design ===== | ===== 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 | ||
+ | |||
+ | <code> | ||
+ | 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; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | * **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. | ||
+ | <code> | ||
+ | if (abs(firstDistance1 - distance1) >= 2 && timer1.read() > timer) { | ||
+ | firstDistance1 = distance1; | ||
+ | } else { | ||
+ | distance1 = firstDistance1; | ||
+ | } | ||
+ | </code> | ||
+ | * 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 | ||
+ | <code> | ||
+ | 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(); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | * **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 | ||
- | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | ||
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
- | * (etapa 3) surse şi funcţii implementate | ||
- | </note> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | * Demo -> https://youtu.be/de_qJpgqm_0 |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | * Arhiva cu schemele si codul: Cristina Ionescu, 333CC -> {{:pm:prj2024:aungureanu:pian_pe_distante.zip|}} |
- | 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**. | + | |
- | </note> | + | |
- | ===== Jurnal ===== | ||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | * **Resurse Hardware** |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf |
- | </note> | + | * https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf |
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | * **Resurse Software** |
+ | * https://github.com/sstaub/Timer | ||
+ | * https://www.theengineeringprojects.com/2015/02/interfacing-multiple-ultrasonic-sensor-arduino.html | ||
+ | * https://github.com/bhagman/Tone | ||