This shows you the differences between two versions of the page.
|
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/08 02:14] costin.grasu created |
pm:prj2026:theodor_ioan.buliga:costin.grasu [2026/05/22 18:57] (current) costin.grasu [Download] |
||
|---|---|---|---|
| Line 29: | Line 29: | ||
| **Schema bloc:** | **Schema bloc:** | ||
| - | {{:pm:prj2026:theodor_ioan.buliga:schema_bloc_smartbumper.png?1000|}} | + | {{:pm:prj2026:theodor_ioan.buliga:smart_bumper.png?700|}} |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | **Lista de piese:** | + | **Lista de piese si Rolul lor in proiect:** |
| - | * 1 x Placa de dezvoltare compatibila Arduino Uno (microcontroller ATmega328P)[cite: 1] | + | * **Placa de dezvoltare compatibila Arduino Uno:** Functioneaza ca placa de baza pentru microcontrollerul **ATmega328P**, care reprezinta "creierul" proiectului. Acesta proceseaza intreruperile, calculeaza timpul si viteza, si comanda perifericele. |
| - | * 2 x Modul Senzor Infrarosu (IR) pentru detectarea obstacolelor[cite: 1] | + | * **2 x Modul Senzor Infrarosu (IR):** Au rolul de a detecta momentul exact in care vehiculul trece prin doua puncte de referinta. Ofera un semnal digital (LOW/HIGH) atunci cand raza IR este intrerupta. |
| - | * 1 x Servomotor SG90 (Micro Servo 9g)[cite: 1] | + | * **1 x Servomotor SG90:** Actioneaza ca mecanism fizic pentru ridicarea si coborarea bumperului (limitatorului de viteza). |
| - | * 1 x Ecran LCD 16x2 cu modul de interfata I2C[cite: 1] | + | * **1 x Ecran LCD 16x2 cu modul I2C:** Interfata cu utilizatorul, folosita pentru a afisa in timp real viteza calculata a vehiculului si mesajul de stare ("LIMITA DEPASITA"). |
| - | * 1 x Buzzer[cite: 1] | + | * **1 x Buzzer:** Unitate de avertizare sonora care se activeaza daca se depaseste pragul de viteza stabilit. |
| - | * 1 x Breadboard pentru prototipare rapida[cite: 1] | + | |
| - | * Fire de conexiune (Jumper wires: tata-tata, tata-mama)[cite: 1] | + | |
| - | * Elemente de machetare[cite: 1] | + | |
| - | <note tip> | + | **Conectarea componentelor si justificarea pinilor folositi:** |
| - | Aici puneti restul detaliilor de hardware design (cand le veti avea gata): | + | |
| - | * scheme electrice (se pot lua si de pe Internet si din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | * **Senzorul IR 1 (Start):** Conectat la pinul Arduino **D2**, care corespunde pinului fizic **PD2** al ATmega328P. |
| - | * diagrame de semnal | + | * *Justificare:* Pinul PD2 este pinul hardware dedicat pentru Intreruperea Externa 0 (**INT0**). Acest lucru permite microcontrollerului sa reactioneze instantaneu (asincron) la trecerea masinii, fara a folosi polling in bucla principala. |
| - | * rezultatele simularii | + | * **Senzorul IR 2 (Stop):** Conectat la pinul Arduino **D3**, care corespunde pinului fizic **PD3** al ATmega328P. |
| - | </note> | + | * *Justificare:* Pinul PD3 este pinul dedicat pentru Intreruperea Externa 1 (**INT1**), pentru a inregistra exact momentul in care masina a parcurs distanta si a opri Timerul intern. |
| + | * **Ecranul LCD I2C:** Conectat la pinii Arduino **A4** (SDA) si **A5** (SCL), corespunzatori pinilor fizici **PC4** si **PC5** ai ATmega328P. | ||
| + | * *Justificare:* Acesti doi pini sunt pinii hardware dedicati pentru magistrala TWI (Two-Wire Interface / I2C) din arhitectura microprocesorului, permitand o comunicare directa si eficienta prin manipularea registrilor TWBR, TWCR, TWSR, TWDR. | ||
| + | * **Servomotorul SG90:** Conectat la pinul Arduino **D9**, care corespunde pinului **PB1**. | ||
| + | * *Justificare:* Folosit ca pin GPIO de iesire. Miscarea servomotorului va fi generata exclusiv din software (manipuland starea pinului si timpii). | ||
| + | * **Buzzer-ul:** Conectat la pinul Arduino **D12**, care corespunde pinului **PB4**. | ||
| + | * *Justificare:* Utilizat ca pin GPIO general. Setarea bitului corespunzator in registrul PORTB declanseaza instantaneu alarma sonora. | ||
| + | |||
| + | **Schema electrica:** | ||
| + | |||
| + | {{:pm:prj2026:theodor_ioan.buliga:schemaelectrica.png?500|}} | ||
| + | |||
| + | Schema ilustreaza conexiunile logice si de alimentare prezentate in sectiunea anterioara. Microcontrollerul este alimentat prin regulatorul placii, iar de pe liniile de 5V/GND sunt alimentate toate perifericele externe. | ||
| + | |||
| + | **Proiectul in functiune:** | ||
| + | |||
| + | {{: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|}} | ||
| + | |||
| + | 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]] | ||