This is an old revision of the document!


Parking obstacle detector

Introducere

Asistent de parcare bazat pe 4 senzori pentru fiecare parte a unei masini (Fata, spate, stanga, dreapta) care vor verifica si detecta aparitia unor obstacole pe una din parti si va semnala asta cu un sunet sonor si aprinderea unui led intr-o anumita culoare (in functie de distanta pana la obstacol). De asemenea, pe un display se va afisa starea celor 4 parti, ex. Right - Safe, Front - Medium, Behind - Critical. De asemenea va exista un buton pentru activarea modului de parcare. In caz de apropiere de obstacol, in functie de distanta, buzzerul va emite sunete de avertizare.

Descriere generală

Odata apasand pe buton pentru intrarea in modul de parcare, senzorii vor incepe sa scaneze si sa detecteze obstacolele. Cei patru senzori vor comunica distanta fata de obstacole, iar in functie de asta, “conducatorul” va fi avertizat astfel:

  • led-ul RGB se va aprinde intr-o culoare, in functie de cea mai mica distanta pana la obstacole comunicata de vreun senzor, astfel ca Verde va fi distanta safe, Galben - distanta medie, Rosu, distanta critica
  • ecranul LCD va afisa informatia de pe cei 4 senzori in formatul urmator:
LEFT : MEDIUM RIGHT : SAFE
FRONT : MEDIUM BACK : CRITICAL
  • buzzerul, in functie de distanta, va scoate un sunet la o frecventa anumita in functie de distanta, cum am descris la LED.

Schema bloc:

Hardware Design

Lista piese:

  • breadboard
  • 4x ultrasonic senzor
  • arduino uno
  • 1x buzzer
  • 1x RGB led
  • 3x rezistente pentru LED RGB (330 ohm)
  • Fire
  • 1x buton
  • 1x ecran LCD (I2C)

Schema electrica:

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
  • librării şi surse 3rd-party (e.g. Procyon AVRlib)
  • algoritmi şi structuri pe care plănuiţi să le implementaţi
  • (etapa 3) surse şi funcţii implementate

Mediu de dezvoltare

Arduino IDE 2.1.0

Librarii folosite
  • #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

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

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

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.

Jurnal

  • 26.04.2023 - Alegere tema proiect
  • 04.05.2023 - Primire piese necesare proiectului
  • 16.05.2023 - Testare piese, asamblare hardware (software - arduino library)
  • 20.05.2023 - Trecere de la arduino framework la implementare pe registri. Folosire timere, intrerupere, GPIO etc.
  • 28.05.2023 - Documentatia finala.

Bibliografie/Resurse

pm/prj2023/alexau/park_det.1685301257.txt.gz · Last modified: 2023/05/28 22:14 by ionel.catruc
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0