This shows you the differences between two versions of the page.
|
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/22 18:51] costin.grasu |
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/22 18:57] (current) costin.grasu [Download] |
||
|---|---|---|---|
| Line 72: | Line 72: | ||
| **Mediul de dezvoltare si biblioteci folosite:** | **Mediul de dezvoltare si biblioteci folosite:** | ||
| - | Pentru dezvoltarea firmware-ului am utilizat platforma **PlatformIO** integrata in mediul de dezvoltare VS Code, folosind toolchain-ul `avr-gcc`. | + | Pentru dezvoltarea firmware-ului am utilizat platforma **PlatformIO** integrata in mediul de dezvoltare VS Code, folosind toolchain-ul `avr-gcc`. |
| Alegerea bibliotecilor: Proiectul foloseste exclusiv bibliotecile standard C pentru AVR (`<avr/io.h>`, `<avr/interrupt.h>`, `<util/delay.h>`, `<stdio.h>`). Am evitat in mod intentionat bibliotecile third-party (precum `LiquidCrystal_I2C.h` sau `Servo.h`) pentru a construi drivere proprii si a implementa comunicarea cu perifericele la nivel de registru. | Alegerea bibliotecilor: Proiectul foloseste exclusiv bibliotecile standard C pentru AVR (`<avr/io.h>`, `<avr/interrupt.h>`, `<util/delay.h>`, `<stdio.h>`). Am evitat in mod intentionat bibliotecile third-party (precum `LiquidCrystal_I2C.h` sau `Servo.h`) pentru a construi drivere proprii si a implementa comunicarea cu perifericele la nivel de registru. | ||
| Line 108: | Line 109: | ||
| **Calibrarea elementelor de senzoristica:** | **Calibrarea elementelor de senzoristica:** | ||
| Pentru a asigura o functionare corecta, au fost realizate doua calibrari software: | Pentru a asigura o functionare corecta, au fost realizate doua calibrari software: | ||
| - | 1. **Ajustarea distantei:** Distanta dintre cei doi senzori IR de pe macheta a fost definita ca macro (`DISTANCE_M 1`) pentru a calcula corect viteza in m/s si ulterior in km/h. Valoarea de 1 metru definita in cod este o distanta teoretica, stabilita in urma testelor pentru a facilita demonstrarea functionalitatii sistemului. Deoarece pe macheta senzorii sunt montati la doar cativa centimetri distanta, simularea manuala a diferitelor praguri de viteza la scara reala ar fi fost extrem de dificil de controlat. | + | |
| - | 2. **Calibrarea servomotorului SG90:** Deoarece motoarele difera mecanic, s-au testat mai multe latimi de puls (delay in microsecunde). S-au stabilit empiric valorile `PULS_INITIAL_US = 500` pentru pozitia ascunsa a bumperului si `PULS_RIDICAT_US = 800` pentru inaltarea corespunzatoare la detectia depasirii vitezei. | + | 1. **Ajustarea distantei:** Distanta dintre cei doi senzori IR de pe macheta a fost definita ca macro (`DISTANCE_M 1`) pentru a calcula corect viteza in m/s si ulterior in km/h. Valoarea de 1 metru definita in cod este o distanta teoretica, stabilita in urma testelor pentru a facilita demonstrarea functionalitatii sistemului. Deoarece pe macheta senzorii sunt montati la doar cativa centimetri distanta, simularea manuala a diferitelor praguri de viteza la scara reala ar fi fost extrem de dificil de controlat. |
| + | |||
| + | 2. **Calibrarea servomotorului SG90:** Deoarece motoarele difera mecanic, s-au testat mai multe latimi de puls (delay in microsecunde). S-au stabilit empiric valorile `PULS_INITIAL_US = 500` pentru pozitia ascunsa a bumperului si `PULS_RIDICAT_US = 800` pentru inaltarea corespunzatoare la detectia depasirii vitezei. | ||
| **Optimizari:** | **Optimizari:** | ||
| - | * **Unde:** In constructia string-ului pentru afisarea pe LCD in functia `main()`. **Cum/De ce:** Am evitat folosirea functiei complexe `sprintf` cu argumente de tip `float`. Includerea suportului float pentru `sprintf` ar fi adaugat un overhead masiv in memoria Flash. In schimb, am optimizat extragand partea intreaga (`vit_int = (int)speed_kmh`) si prima zecimala (`vit_dec = (int)((speed_kmh - vit_int) * 10)`) si folosind formatare simpla de intregi (`%d.%d`). Aceasta tactica a redus dramatic memoria ocupata. | + | * **Unde:** In constructia string-ului pentru afisarea pe LCD in functia `main()`. |
| - | * **Unde:** In rutinele de tratare a intreruperilor (ISR). **Cum/De ce:** Calculele matematice grele (impartiri, conversii float) au fost plasate in interiorul buclei `while(1)`, nu direct in ISR. Intreruperile realizeaza doar atribuiri simple si rapide de variabile. Optimizarea mentine timpul de executie al ISR-urilor la minimum, prevenind fenomenul de "interrupt starvation" si blocarea microprocesorului. | + | * **Cum/De ce:** Am evitat folosirea functiei complexe `sprintf` cu argumente de tip `float`. Includerea suportului float pentru `sprintf` ar fi adaugat un overhead masiv in memoria Flash. In schimb, am optimizat extragand partea intreaga (`vit_int = (int)speed_kmh`) si prima zecimala (`vit_dec = (int)((speed_kmh - vit_int) * 10)`) si folosind formatare simpla de intregi (`%d.%d`). Aceasta tactica a redus dramatic memoria ocupata. |
| + | * **Unde:** In rutinele de tratare a intreruperilor (ISR). | ||
| + | * **Cum/De ce:** Calculele matematice grele (impartiri, conversii float) au fost plasate in interiorul buclei `while(1)`, nu direct in ISR. Intreruperile realizeaza doar atribuiri simple si rapide de variabile. Optimizarea mentine timpul de executie al ISR-urilor la minimum, prevenind fenomenul de "interrupt starvation" si blocarea microprocesorului. | ||
| ===== Rezultate Obtinute ===== | ===== Rezultate Obtinute ===== | ||
| Line 131: | Line 136: | ||
| ===== Download ===== | ===== Download ===== | ||
| - | Aici puteti gasi arhiva completa cu codul sursa: | + | Arhiva completa cu codul sursa: |
| {{:pm:prj2026:theodor_ioan.buliga:smartbumper.zip|}} | {{:pm:prj2026:theodor_ioan.buliga:smartbumper.zip|}} | ||
| - | Sau link-ul de la repository: | + | Link repository: |
| [[https://github.com/costingrasu/SmartBumper|SmartBumper]] | [[https://github.com/costingrasu/SmartBumper|SmartBumper]] | ||