This shows you the differences between two versions of the page.
pm:prj2022:robert:jewelry_box [2022/04/28 17:37] stefania.dina created |
pm:prj2022:robert:jewelry_box [2022/05/20 19:39] (current) stefania.dina |
||
---|---|---|---|
Line 3: | Line 3: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | <note tip> | + | |
* Cutia de bijuterii muzicală este concepută pentru a ne ușura viața și a ne crea o experiență plăcută la utilizare. La simpla apropiere de cutie aceasta se va deschide automat pentru a putea depozita acolo bijuteriile. De asemenea, la fiecare deschidere va începe o melodie simulând astfel cutiuța muzicală. | * Cutia de bijuterii muzicală este concepută pentru a ne ușura viața și a ne crea o experiență plăcută la utilizare. La simpla apropiere de cutie aceasta se va deschide automat pentru a putea depozita acolo bijuteriile. De asemenea, la fiecare deschidere va începe o melodie simulând astfel cutiuța muzicală. | ||
- | * Ideea a venit o dată cu laboratorul 3 [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2022|]] în combinație cu laboratorul 2 [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2022|]] | + | * Ideea a venit o dată cu laboratoarele[[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2022| Laborator 3]] ,[[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2022| Laborator 2]] |
* Cutia de bijuterii muzicală este utilă pentru depozitarea și sortarea cât mai rapidă a bijuteriilor. Totodată aceasta te introduce într-o lume de basm cu ajutorul sunetului. | * Cutia de bijuterii muzicală este utilă pentru depozitarea și sortarea cât mai rapidă a bijuteriilor. Totodată aceasta te introduce într-o lume de basm cu ajutorul sunetului. | ||
- | </note> | + | |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <note tip> | + | Printr-un senzor de mișcare se va detecta prezența unei persoane în apropierea cutiei și se va porni automat un servomotor conectat printr-un fir de capacul cutiei. Odată deschisă cutia va începe o melodie preluată din repo-ul public [[https://github.com/robsoncouto/arduino-songs/tree/master/furelise | Github]] |
- | Printr-un senzor de mișcare se va detecta prezența unei persoane în apropierea cutiei și se va porni automat un servomotor conectat printr-un fir de capacul cutiei. Odată deschisă cutia va începe o melodie preluată din repo-ul public [[https://github.com/robsoncouto/arduino-songs/tree/master/furelise]] | + | |
- | </note> | + | Schema bloc: |
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2022:robert:schema_bloc_dina_stefania.png?550|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | {{:pm:prj2022:robert:bij.drawio.png?200|}} | ||
Piese folosite: | Piese folosite: | ||
Line 23: | Line 27: | ||
- Servomotor | - Servomotor | ||
- Difuzor | - Difuzor | ||
- | - Breadboard | ||
- Cabluri | - Cabluri | ||
- | ===== Jurnal ===== | + | Schemă circuit: |
+ | |||
+ | ---- | ||
+ | {{:pm:prj2022:robert:schema_circuit_dina_stefania.png?800|}} | ||
+ | |||
+ | Schema electrică: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{:pm:prj2022:robert:schema_electrica_dina_stefania.png?800|}} | ||
+ | |||
+ | |||
+ | ===== Software Design ===== | ||
+ | |||
+ | |||
+ | Descrierea codului aplicaţiei (firmware): | ||
+ | * Mediu de dezvoltare: Arduino 1.8.14 | ||
+ | * Librărie folosită: Servo Library | ||
+ | * Se realizează acționarea motorului care depinde de distanța utilizatorului. | ||
+ | |||
+ | |||
+ | Idei principale ale dezvoltării cu ajutorul funcțiilor: | ||
+ | |||
+ | ---- | ||
+ | **void setup()** | ||
+ | <note> Setare parametrii de I/O | ||
+ | sg90.attach(8); | ||
+ | pinMode(trig, OUTPUT); | ||
+ | pinMode(echo, INPUT); | ||
+ | </note> | ||
+ | **void loop()** | ||
+ | <note> Se calculează distanța și durata interceptării senzorului ultrasonic | ||
+ | duration = pulseIn(echo,1); | ||
+ | distance = duration*0.034/2; | ||
+ | </note> | ||
+ | |||
+ | <note> Parametrii de acționare | ||
+ | if (distance < 30) | ||
+ | </note> | ||
+ | |||
+ | ---- | ||
+ | Explicație a melodiei, calcului duratei plus funcțiile folosite: | ||
+ | |||
+ | <note> **Sizeof** oferă numărul de octeți, fiecare valoare **int** este compusă din doi octeți (16 biți). Există două valori pe notă (**înălțimea și durata**), deci pentru fiecare notă sunt patru octeți. | ||
+ | int notes = sizeof(melody) / sizeof(melody[0]) / 2; | ||
+ | </note> | ||
+ | |||
+ | <note> Calculează durata unei **note întregi** în ms | ||
+ | int wholenote = ( 60000 * 4 ) / tempo; | ||
+ | </note> | ||
+ | |||
+ | <note> Selectare notă, prelucrare și emitere finală | ||
+ | // Itereazăm până la finalul notelor melodiei | ||
+ | // Vectorul de note conține atât notele cât și durata fiecăreia | ||
+ | for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) { | ||
+ | // Calculăm durata fiecărei note | ||
+ | divider = pgm_read_word_near(melody+thisNote + 1); | ||
+ | if (divider > 0) { | ||
+ | // Notă obișnuită, merge mai departe | ||
+ | noteDuration = (wholenote) / divider; | ||
+ | // Dacă nota este cu durată negativă atunci se ia valoarea pozitivă însă se mărește durata cu jumătate | ||
+ | } else if (divider < 0) { | ||
+ | noteDuration = (wholenote) / abs(divider); | ||
+ | noteDuration *= 1.5; | ||
+ | } | ||
+ | // Cântăm nota doar pentru 90% din durată, lăsând 10% ca pauză | ||
+ | tone(buzzer, pgm_read_word_near(melody+thisNote), noteDuration * 0.9); | ||
+ | |||
+ | // Asteptăm durata specificată înainte de a reda următoarea notă | ||
+ | delay(noteDuration); | ||
+ | |||
+ | // Oprește generarea formei de undă înainte de următoarea notă | ||
+ | noTone(buzzer); | ||
+ | </note> | ||
+ | |||
+ | <note> Pentru a accesa mai rapid variabila stocată în SRAM dar și pentru a susține cantitatea mare de date ce conține notele muzicale nemodificate dinamic în timpul execuției am folosit funcția: | ||
+ | pgm_read_word_near() | ||
+ | |||
+ | </note> | ||
+ | |||
+ | <note> Am generat o undă pătrată cu frecvența de **pgm_read_word_near(melody + thisNote)** pentru pinul //buzzer// și o durată de 90%, lăsând 10% ca pauză. | ||
+ | tone(buzzer, pgm_read_word_near(melody+thisNote), noteDuration * 0.9); | ||
+ | </note> | ||
+ | |||
+ | <note> Dacă nu specific durata, tonul va continua până când funcția **noTone** este apelată pe același pin //buzzer//. | ||
+ | noTone(buzzer); | ||
+ | </note> | ||
+ | |||
+ | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | Creare: 28.04.2022 | + | Rezultatele se pot urmării aici: [[https://youtube.com/shorts/4BrKCf2BfKQ?feature=share | YouTube]] |
+ | </note> | ||
- | Modificări: | + | ===== Concluzii ===== |
+ | Proiectul s-a dovedit a fi o provocare din care am acumulat cunoștințe noi de lucru cu Arduino. | ||
+ | ===== Download ===== | ||
+ | |||
+ | <note warning> Proiectul poate fi descărcat de aici: | ||
+ | {{:pm:prj2022:robert:dina_stefania-gabriela-proiect_pm_1.zip| Arhiva }} | ||
</note> | </note> | ||
+ | ===== Jurnal ===== | ||
+ | |||
+ | |||
+ | Creare: 28.04.2022 | ||
+ | |||
+ | Modificări: 16.05.2022 | ||
+ | |||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
<note> | <note> | ||
- | [[https://ocw.cs.pub.ro/courses/pm/prj2022/robert/jewelry_box|]] | + | [[https://ocw.cs.pub.ro/courses/pm/prj2022/robert/jewelry_box]] |
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2022]] | ||
+ | [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2022]] | ||
+ | [[https://github.com/robsoncouto/arduino-songs/tree/master/furelise]] | ||
</note> | </note> |