This shows you the differences between two versions of the page.
pm:prj2023:alexau:park_det [2023/05/28 21:44] ionel.catruc [Software Design] |
pm:prj2023:alexau:park_det [2023/05/28 22:41] (current) ionel.catruc [Bibliografie/Resurse] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Parking obstacle detector ====== | ====== Parking obstacle detector ====== | ||
+ | Student: Catruc Ionel 332CBa | ||
===== Introducere ===== | ===== Introducere ===== | ||
Line 26: | Line 26: | ||
* breadboard | * breadboard | ||
- | * 4x ultrasonic senzor | + | * 4x ultrasonic senzor HC-SR04 |
- | * arduino uno | + | * Arduino uno |
* 1x buzzer | * 1x buzzer | ||
- | * 1x RGB led | + | * 1x RGB led (anod comun) |
* 3x rezistente pentru LED RGB (330 ohm) | * 3x rezistente pentru LED RGB (330 ohm) | ||
- | * Fire | + | * Fire M-T, T-T |
* 1x buton | * 1x buton | ||
* 1x ecran LCD (I2C) | * 1x ecran LCD (I2C) | ||
Line 54: | Line 54: | ||
Arduino IDE 2.1.0 | Arduino IDE 2.1.0 | ||
== Librarii folosite == | == Librarii folosite == | ||
- | * #include <LiquidCrystal_I2C.h> | + | * #include <LiquidCrystal_I2C.h> - pentru a realiza comunicarea cu display-ul LCD prin I2C |
+ | == Descriere surse si functii implementate == | ||
+ | * **customDigitalRead(pin)** - digital read implementat pe registri (GPIO) | ||
+ | * **customDigitalWrite(pint, value)** - digital write implementat pe registri (GPIO) | ||
+ | * **customPinMode(int pin, int mode)** - custom pin mode (GPIO) | ||
+ | * **setupUltrasonic(int TRIG_PIN, int ECHO_PIN)** - seteaza pinul trig pin pe output si echo pin pe input (pentru senzorul ultrasonic) | ||
+ | * **getDistance(int TRIG_PIN, int ECHO_PIN)** - calculeaza distanta obtinuta de la un senzor ultrasonic cu pinii echo si trig primiti ca parametru | ||
+ | * **getRangeString(int distance)** - primeste stringul asociat distantei (CRITIC, MEDIUM, SAFE) | ||
+ | * **print_on_display()** - printeaza pe display starea sistemului. Daca suntem in mod de IDLE, va afisa "Press button", daca e in mod PARKING, va afisa starea pentru fiecare senzor in functie de distanta pana la obstacole. Face update la stare pe display doar atunci cand starea curenta e diferita de starea precedenta (sa nu scriu la fiecare iteratie pe display aceleasi chestii) | ||
+ | * **ledWarning()** - in functie de starea sistemului, coloreaza ledul rgb in Red, Green, Orange (in functie de stare Critical, Safe, Medium) sau in culoarea de IDLE daca nu suntem in mod parcare. Folosesc LED RGB cu anod comun, deci nu voi scrie x ci 255 - x. | ||
+ | * **ISR(TIMER1_COMPA_vect)** - rutina timer1 pentru buzzer. Aceasta rutina va face ca buzzerul sa scoata sunet in dependenta de frecventa configurata per stare. | ||
+ | * **conf_critic_timer()** - configurare timer pentru distanta critica. Timer1 cu frecventa 7 hz. | ||
+ | * **conf_safe_timer()** - configurare timer pentru distanta safe. Mai exact, se dezactiveaza timer-ul pentru ca suntem la o distanta sigura fata de vreun obstacol | ||
+ | * **conf_medium_timer()** - configurarea timer1 pentru distanta medie, anume 4 hz. | ||
+ | * **ISR(INT0_vect)** - intrerupere care se activeaza pe Rising Edge al INT0, folosita la buton. Pentru a previne detectarile multiple, am setat un debounce de 200ms. | ||
+ | * **setup()** - initializez pinii necesari sistemului, cat si intreruperile necesare, display-ul. | ||
+ | * **loop()** - daca sistemul e in mod parcare, extrage distanta de pe toti senzorii, calculez distanta minima din cele 4, si compar cu distanta minima anterioara, daca sunt diferite, extrag starea curenta, adica, safe, medium, critical, si in functie de asta, configurez timerul necesar. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
+ | Sistemul functioneaza perfect si detecteaza obstacolele. | ||
+ | Avem doua stari, IDLE si PARKING. | ||
+ | |||
+ | In starea idle nu se verifica prezenta obstacolelor (putem asocia asta cu faptul ca nu avem nevoie de asta, nu ne parcam). | ||
+ | |||
+ | Starea de parking va incepe verificarea obstacolelor si calcularea distantei pana la ele. | ||
+ | |||
+ | Am 3 nivele: Critic (obstacol intre 2-10 cm), Medium (obstacol intre 10-20 cm) si Safe, cand nu este nici un obstacol sau se afla peste limita de 20 cm. Am configurat limita la 20 pentru ca mereu detecta obiecte in jur la testare pe masa. In functie de distanta, aprinde ledul in rosu, portocaliu sau verde. Buzerrul va semnala daca avem vreun obstacol prea aproape, iar cu cat mai aproape se afla obstacolul, cu atat mai des va buzzui. | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Demo: https://www.youtube.com/shorts/B_JiHE_W5l0 |
</note> | </note> | ||
+ | == Starea de start == | ||
+ | {{:pm:prj2023:alexau:idle.jpg?400|}} | ||
+ | == Nici un obstacol == | ||
+ | {{:pm:prj2023:alexau:safe.jpg?400|}} | ||
+ | == Distanta medie == | ||
+ | {{:pm:prj2023:alexau:medium.jpg?400|}} | ||
+ | == Distanta critica == | ||
+ | {{:pm:prj2023:alexau:critic.jpg?400|}} | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | * Proiect foarte interesant | ||
+ | * Mai usor sa faci totul pe un tool online (TinkerCad, CircuitoIO, Wokwi) si dupa sa treci totul pe placa | ||
+ | * Mi-am luat destul de multe piese de rezerva, dar nu mi-au trebuit | ||
+ | * Cabluri, cabluri, cabluri... Are cineva cabluri? | ||
+ | * Destul de complicat sa bagi totul intr-o cutie si sa fac sa arate prezentabil... | ||
+ | * Uneori simularea nu reflecta realitatea. | ||
===== Download ===== | ===== Download ===== | ||
- | + | Codul sursa : {{:pm:prj2023:alexau:proiect_catruc_ionel_332cba.zip|}} | |
- | <note warning> | + | |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | + | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | |
- | </note> | + | |
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 77: | Line 107: | ||
* 04.05.2023 - Primire piese necesare proiectului | * 04.05.2023 - Primire piese necesare proiectului | ||
* 16.05.2023 - Testare piese, asamblare hardware (software - arduino library) | * 16.05.2023 - Testare piese, asamblare hardware (software - arduino library) | ||
- | * 20.05.2023 - Trecere de la arduino framework la implementare pe registri. Folosire timere, intreruper, GPIO etc. | + | * 20.05.2023 - Trecere de la arduino framework la implementare pe registri. Folosire timere, intrerupere, GPIO etc. |
+ | * 28.05.2023 - Documentatia finala. | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | * https://arduinogetstarted.com/tutorials/arduino-lcd-i2c |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://www.hackster.io/techmirtz/using-common-cathode-and-common-anode-rgb-led-with-arduino-7f3aa9 |
- | </note> | + | * Laboratoarele OCW |
+ | * https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||