This shows you the differences between two versions of the page.
|
pm:prj2022:robert:jewelry_box [2022/05/16 08:44] stefania.dina |
pm:prj2022:robert:jewelry_box [2022/05/20 19:39] (current) stefania.dina |
||
|---|---|---|---|
| Line 5: | Line 5: | ||
| * 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. | ||
| Line 11: | Line 11: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | 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]] | + | 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]] |
| + | |||
| + | 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 22: | 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> | ||