This shows you the differences between two versions of the page.
pm:prj2021:cghenea:broloboc [2021/06/04 18:55] adrian.mihalcea2409 |
pm:prj2021:cghenea:broloboc [2021/06/04 19:16] (current) adrian.mihalcea2409 |
||
---|---|---|---|
Line 30: | Line 30: | ||
====== Software Design ====== | ====== Software Design ====== | ||
- | Librarii folosite: Wire.h, SevSeg.h (linked mai jos) | + | Biblioteci folosite: Wire.h, SevSeg.h (linked mai jos) |
Codul meu a fost dezvoltat folosind Arduino IDE. Integreaza Arduino-ul cu placuta cu giroscop, display-ul si buzzer-ul. | Codul meu a fost dezvoltat folosind Arduino IDE. Integreaza Arduino-ul cu placuta cu giroscop, display-ul si buzzer-ul. | ||
- | Functia setup trezeste placuta cu giroscop si initializeaza setarile displayul cu 4 cifre. Optional, afiseaza erorile gasite pe giroscop ca medie intre 200 de masuratori (presupunand ca este pe o suprafata plana), folosind functia print_errors. | + | Setup: |
+ | Comunicatia cu modulul MPU-6150 este realizata pe I2C (folosind biblioteca Wire). Se trezeste acest modulul printr-un 0 trimis la registrul sau 0x6B. Comunicatia cu 7-segment display se realizeaza folosind biblioteca SevSeg, in Setup setandu-se setarile acestuia (pinii pentru segmente si separatoare) si afisand 0000. Optional, se poate apela functia Print_error, descrisa mai jos. | ||
- | In loop, la fiecare iteratie improspatez display-ul, comunic prin I2C cu MPU 6150 si primesc cele 6 registre corespunzand masuratorilor pentru 3 axe. Folosind masuratorile pentru axa oX calculez, conform datasheet-ului, diferenta de unghi fata de ultima masuratoare si updatez unghiul curent. Acesta este afisat pe display folosind functia setNumber din library-ul pentru control de 7-segment display. Daca intervalul de toleranta este respectat, scoate zgomot si buzzer-ul. | + | Print_error: |
+ | Am descoperit ca giroscopul meu are niste erori vizibile din fabricatie, care il cauzau sa driftuiasca in timp cu ~0.5grade/secunda. Pentru a lua in calcul aceste erori, am facut o functie de one-time setup care realizeaza 200 de masuratori, presupunand ca giroscopul este pe o suprafata plana, face media acestora si printeaza eroarea gasita astfel. Scazand aceasta eroare din fiecare masuratoare, obtin niste rezultate mult mai precise si stabile. | ||
+ | |||
+ | Loop: | ||
+ | In loop, la fiecare iteratie improspatez display-ul si comunic prin I2C cu MPU-6150. Astfel ii cer 6 registre incepand cu adresa 0x43 (conform datasheetului_ si primesc cele 6 registre corespunzand masuratorilor pentru 3 axe, fiecare axa in cate 2 registre. Folosind masuratorile pentru axa oX calculez, conform datasheet-ului, diferenta de unghi fata de ultima masuratoare si updatez unghiul curent, tinand cont si de eroarea medie masurata cu print_error. | ||
+ | |||
+ | Acest rezultat este afisat pe display folosind functia setNumber din library-ul pentru control de 7-segment display. Daca intervalul de toleranta de (-2, +2) grade este respectat, scoate zgomot si buzzer-ul, controlat cu functiile Arduino Tone si noTone. | ||
====== Rezultate Obținute ====== | ====== Rezultate Obținute ====== | ||
+ | Proiectul isi indeplineste foarte bine sarcina si face niste masuratori destul de precise (un unghi de 90 de grade este afisat ca 88-92 de grade, in functie de cat de lina este miscarea). Singura mare dificultate pe care am intampinat-o a fost fix legata de faptul ca nu am lipit conexiunile la giroscop (ceea ce eu am crezut initial ca va fi mai usor), asa ca a trebuit sa am foarte multa grija cand miscam breadboard-ul cu giroscopul pentru a nu intrerupe conexiunea din greseala. | ||
{{:pm:prj2021:cghenea:broloboc_poza2.jpg?800 |}} | {{:pm:prj2021:cghenea:broloboc_poza2.jpg?800 |}} | ||
[[https://youtu.be/0DHgdXZ900M | Link Youtube Demo]] | [[https://youtu.be/0DHgdXZ900M | Link Youtube Demo]] |