This shows you the differences between two versions of the page.
|
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/16 19:26] costin.grasu |
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/22 18:57] (current) costin.grasu [Download] |
||
|---|---|---|---|
| Line 62: | Line 62: | ||
| {{:pm:prj2026:theodor_ioan.buliga:inlimita.jpeg?500|}} | {{:pm:prj2026:theodor_ioan.buliga:inlimita.jpeg?500|}} | ||
| + | |||
| + | Bumper coborat. Vehiculul circula cu viteza legala (< = 30 km/h) | ||
| {{:pm:prj2026:theodor_ioan.buliga:limitadepasita.jpeg?500|}} | {{:pm:prj2026:theodor_ioan.buliga:limitadepasita.jpeg?500|}} | ||
| + | Bumper ridicat. Vehiculul circula cu viteza ilegala (> 30 km/h) | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | <note tip> | + | **Mediul de dezvoltare si biblioteci folosite:** |
| - | Descrierea codului aplicatiei (firmware): | + | Pentru dezvoltarea firmware-ului am utilizat platforma **PlatformIO** integrata in mediul de dezvoltare VS Code, folosind toolchain-ul `avr-gcc`. |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librarii si surse 3rd-party (e.g. Procyon AVRlib) | + | 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. |
| - | * algoritmi si structuri pe care planuiti sa le implementati | + | |
| - | * (etapa 3) surse si functii implementate | + | **Elementul de noutate:** |
| - | </note> | + | Spre deosebire de limitatoarele de viteza clasice care afecteaza fluiditatea traficului indiferent de comportamentul soferului, noutatea software consta in algoritmul de decizie in timp real. Microcontrollerul calculeaza viteza instantaneu si activeaza bariera fizica **exclusiv** pentru vehiculele care incalca regulamentul, transformand o solutie de trafic pasiva intr-una activa si inteligenta. |
| + | |||
| + | **Laboratoare utilizate ca referinta:** | ||
| + | * **GPIO:** A fost utilizat pentru actionarea Buzzer-ului (pin PB4) si a Servomotorului (pin PB1). Prin manipularea directa a bitilor din registrii `PORTB` si `DDRB`, am implementat controlul perifericelor. Semnalul de control pentru servomotor a fost generat exclusiv software prin pini GPIO (mentinand pinul HIGH o anumita durata in microsecunde, urmata de starea LOW), fara a bloca resursele hardware. | ||
| + | * **Intreruperi Externe (INT0 si INT1):** Senzorii IR au fost configurati sa declanseze o intrerupere pe front descrescator (modificand registrii `EICRA` si `EIMSK`). Citirea senzorilor prin intreruperi hardware elimina latenta metodei de "polling", asigurand o inregistrare exacta (la nivel de microsecunda) a momentului trecerii masinii. | ||
| + | * **Timere:** Am configurat `Timer1` (16-biti) in modul CTC (Clear Timer on Compare Match) cu un prescaler de 64, generand o intrerupere fix la fiecare 1 milisecunda (`OCR1A = 249`). Aceasta funcionalitate creeaza o variabila de sistem (`systicks`) fiabila pentru contorizarea timpului scurs, complet independenta de intarzierile din bucla principala. | ||
| + | * **I2C / TWI:** Folosit pentru ecranul LCD. Am construit propriul protocol scriind direct in registrii `TWBR`, `TWCR`, `TWDR`, setand frecventa magistralei la 100 kHz si generand manual conditiile de START, STOP si WRITE. | ||
| + | |||
| + | **Scheletul proiectului:** | ||
| + | |||
| + | Ierarhia de fisiere a proiectului in PlatformIO: | ||
| + | <code> | ||
| + | SmartBumper/ | ||
| + | └── src/ | ||
| + | ├── main.c | ||
| + | ├── i2c.h | ||
| + | ├── i2c.c | ||
| + | ├── lcd.h | ||
| + | └── lcd.c | ||
| + | </code> | ||
| + | |||
| + | Descrierea componentelor software: | ||
| + | * **main.c**: Contine logica principala a aplicatiei, initializarile pentru pinii GPIO, Timere si Intreruperi Externe, precum si algoritmul de calcul al vitezei si controlul bumperului. | ||
| + | * **i2c.h**: Defineste prototipurile functiilor necesare pentru configurarea si utilizarea magistralei hardware I2C/TWI a microcontrollerului. | ||
| + | * **i2c.c**: Implementeaza functiile de initializare, start, stop si scriere de octeti pentru protocolul I2C prin manipularea directa a registrilor hardware (`TWBR`, `TWCR`, `TWDR`). | ||
| + | * **lcd.h**: Defineste adresa I2C a ecranului si prototipurile functiilor de control (afisare caractere, stergere ecran, setare pozitie cursor). | ||
| + | * **lcd.c**: Implementeaza driverul ecranului LCD 16x2, traducand si transmitand comenzile si datele de afisat sub forma de pachete compatibile cu controlerul ecranului. | ||
| + | |||
| + | In fundal, Timer1 numara milisecundele. Trecerea vehiculului declanseaza `INT0`, care salveaza timpul initial (`t_start = systicks`). Trecerea prin cel de-al doilea senzor declanseaza `INT1`, salvand `t_stop` si ridicand un flag (`measure_complete = 1`). Bucla infinita `while(1)` proceseaza flag-ul, calculeaza viteza (V = d/t), o afiseaza pe LCD si comanda perifericele de avertizare (buzzer si servo) in functie de pragul setat de 30 km/h. | ||
| + | |||
| + | **Calibrarea elementelor de senzoristica:** | ||
| + | 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. | ||
| + | |||
| + | **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 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 ===== | ||
| - | <note tip> | + | In urma asamblarii si scrierii firmware-ului, a rezultat un sistem hardware-software perfect functional, capabil sa reactioneze in timp real la evenimente fizice. |
| - | Care au fost rezultatele obtinute in urma realizarii proiectului vostru. | + | Sistemul masoara cu succes timpul dintre cele doua puncte de referinta folosind rutine de tratare a intreruperilor (ISR) foarte rapide, evitand polling-ul. Viteza este calculata corect in bucla principala (raportata la distanta teoretica de 1 metru impusa pentru usurinta testarii manuale a senzorilor) si este afisata pe ecranul LCD folosind driverul I2C creat de la zero. |
| - | </note> | + | In cazul depasirii pragului de 30 km/h, sistemul de actiune (servomotorul si alarma sonora) este declansat instantaneu prin manipularea directa a pinilor GPIO. |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | |||
| + | Proiectul "SmartBumper" reprezinta o aplicatie completa de embedded systems care integreaza multiple periferice hardware si concepte software intr-un produs coeziv, capabil sa functioneze in timp real. | ||
| + | |||
| + | Implementarea acestui sistem a contribuit semnificativ la aprofundarea programarii la nivel low-level a microcontrolerului ATmega328P. Dezvoltarea firmware-ului a consolidat intelegerea si aplicarea unor concepte critice precum: configurarea Timerelor hardware pentru masurarea precisa a timpului, gestionarea Intreruperilor Externe pentru reactii asincrone imediate, manipularea directa a registrilor GPIO pentru controlul mecanic si acustic, precum si implementarea de la zero a protocolului de comunicatie I2C. | ||
| + | |||
| + | In final, proiectul demonstreaza modul in care conceptele tehnice independente, pot fi imbinate cu succes intr-un dispozitiv interactiv si functional, pentru a rezolva o problema reala din domeniul sigurantei rutiere. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | Arhiva completa cu codul sursa: |
| - | O arhiva (sau mai multe daca este cazul) cu fisierele obtinute in urma realizarii proiectului: surse, scheme, etc. Un fisier README, un ChangeLog, un script de compilare si copiere automata pe uC creaza intotdeauna o impresie buna ;-). | + | |
| - | Fisierele se incarca pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul in care se incarca fisierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (daca este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | {{:pm:prj2026:theodor_ioan.buliga:smartbumper.zip|}} |
| - | </note> | + | |
| - | ===== Jurnal ===== | + | Link repository: |
| - | <note tip> | + | [[https://github.com/costingrasu/SmartBumper|SmartBumper]] |
| - | Puteti avea si o sectiune de jurnal in care sa poata urmari asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | **Resurse Hardware:** |
| - | Lista cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** si **Resurse Hardware**. | + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet (published by Microchip)]] |
| - | </note> | + | * Documentatie tehnica Controller LCD si Modul interfata I2C |
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | **Resurse Software:** |
| + | * Materialele de Laborator PM pentru: GPIO, Intreruperi Externe, Timere si I2C / TWI. | ||
| + | * [[https://docs.platformio.org/|PlatformIO Documentation]] | ||