This shows you the differences between two versions of the page.
pm:prj2023:apredescu:17 [2023/05/04 14:46] mihnea.mitroi |
pm:prj2023:apredescu:17 [2023/05/28 13:14] (current) mihnea.mitroi |
||
---|---|---|---|
Line 5: | Line 5: | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | Proiectul constă în realizarea unui sistem de semaforizare pentru o intersecție în cruce, ce are două direcții de circulație pentru mașini, fiecare fiind prevăzută cu o trecere pentru pietoni. Pietonii au optiunea de a apăsa un buton pentru a semnaliza faptul că doresc să treacă, iar dacă acest buton nu este apăsat semaforul va permite trecerea mașinilor în mod constant. Scopul proiectului este să asigure o circulație cât mai eficientă, fluidizând traficul prin eliminarea timpilor în care semaforul permite trecerea pietonilor atunci când nu există persoane pe trecerea de pietoni. | + | Proiectul constă în realizarea unui sistem de semaforizare pentru o intersecție în cruce, ce are două direcții de circulație pentru mașini, fiecare fiind prevăzută cu o trecere pentru pietoni. Pietonii au opțiunea de a apăsa un buton pentru a semnaliza faptul că doresc să treacă, micșorand timpul de așteptare. Scopul proiectului este să asigure o circulație cât mai eficientă, atât pentru mașini prin fluidizarea traficului, cât și pentru pietoni prin eliminarea timpului de așteptare atunci când acest lucru este posibil. |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | Pentru fiecare direcție de mers voi avea o plăcuță Arduino Uno ce va comanda un semafor pentru mașini (verde, galben, rosu) și un semafor pentru pietoni (verde, roșu), ce vor controla trecerea mașinilor și a pietonilor pe această direcție. Cele două plăcuțe vor comunica între ele pentru a sincroniza trecerea mașinilor în cele două direcții de mers. | + | Pentru fiecare direcție de mers voi avea câte o plăcuță Arduino Uno ce va comanda un semafor pentru mașini (verde, galben, roșu) și un semafor pentru pietoni (verde, roșu), ce vor controla trecerea mașinilor și a pietonilor pe această direcție. Cele două plăcuțe vor comunica între ele pentru a sincroniza trecerea mașinilor în cele două direcții de mers. |
Sistemul rulează în două moduri, ce sunt setate pe baza informațiilor oferite de un senzor de lumină: | Sistemul rulează în două moduri, ce sunt setate pe baza informațiilor oferite de un senzor de lumină: | ||
Line 15: | Line 15: | ||
* Mod de noapte (semafoarele pentru mașini afișează galben intermitent iar cele pentru pietoni sunt oprite) | * Mod de noapte (semafoarele pentru mașini afișează galben intermitent iar cele pentru pietoni sunt oprite) | ||
- | Atunci când un pieton apasă butonul pentru a trece, semaforul pentru mașini se face galben și apoi rosu, iar cel pentru pietoni se face verde. Semafoarele ce controlează fluxul celeilalte direcții vor facilita trecerea mașinilor și vor opri trecerea pietonilor. | + | Atunci când un pieton apasă butonul pentru a trece, daca semaforul său indică culoarea rosie, atunci semaforul pentru mașini se face roșu, iar cel pentru pietoni se face verde. Semafoarele ce controlează fluxul celeilalte direcții se vor schimba în mod opus, cel pentru mașini făcându-se verde, iar cel pentru pietoni roșu, facilitând trecerea mașinilor și oprind trecerea pietonilor. După apăsarea butonului pietonii vor avea un timp de așteptare pâna când vor putea apăsa din nou butonul. |
- | === Schema bloc === | + | În lipsa pietonilor, semafoarele permit trecerea mașinilor într-o direcție pe o anumită perioadă, iar apoi pe cealaltă direcție. |
- | {{:pm:prj2023:apredescu:schema_block_semafor.png?600|}} | + | |
+ | === Schema bloc === | ||
+ | {{ :pm:prj2023:apredescu:schema_bloc_semafor.png?600 |}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 25: | Line 26: | ||
Listă piese: | Listă piese: | ||
* 2 x Arduino Uno | * 2 x Arduino Uno | ||
- | * 2 x breadboard | + | * 2 x Breadboard |
- | * 2 x buton | + | * 2 x Buton |
* 4 x LED rosu | * 4 x LED rosu | ||
* 2 x LED galben | * 2 x LED galben | ||
* 4 x LED verde | * 4 x LED verde | ||
- | * senzor lumina Brick | + | * 1 x Senzor lumina Brick |
+ | |||
+ | === Schema electrică === | ||
+ | {{ :pm:prj2023:apredescu:schema_electrica_eagle_semafor.png?600 |}} | ||
+ | |||
+ | === Schemă Tinkercad=== | ||
+ | {{ :pm:prj2023:apredescu:schema_electrica_semafor.png?600 |}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | + | Mediul de dezvoltare folosit în realizarea proiectului: Arduino IDE. |
- | 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 | + | |
- | </note> | + | |
+ | === Descrierea codului aplicaţiei (firmware) === | ||
+ | |||
+ | void setup() - inițializează culorile LED-urilor în starea inițială, apelează funcțiile de configurare pentru întreruperi, timer și ADC și configurează magistrala serială. | ||
+ | * void configureInterrupt0() - configurează întreruperea externă 0 pentru apăsarea butonului conectat la PD2; | ||
+ | * void configureADC() - configurează citirea analogică de pe PA0; | ||
+ | * void configureTimer1() - configurează Timer-ul 1 să genereze o întrerupere la 0.5s; | ||
+ | * Serial.begin() - configurează comunicarea pe magistrala serială cu baud-rate 9600; | ||
+ | * ISR(INT0_vect) - întrerupere generată la apăsarea butonului conectat la PD2 ce facilitează trecerea pietonului care a apăsat butonul; | ||
+ | * ISR(TIMER1_COMPA_vect) - întrerupere generată de Timer-ul 1 care incrementează contorul de timp; | ||
+ | | ||
+ | void loop() - verifică daca valorea luminozității permite trecerea în modul de noapte, altfel implementează logica unui automat finit cu stări ce realizează tranziții la momente de timp predefinite. Stările celor două semafoare sunt în complementaritate (atunci când un semafor este în prima parte a ciclului de tranziții, cel de-al doilea este în partea a doua, iar apoi rolurile se inversează). | ||
+ | * uint16_t analogAdcRead() - citește valoarea luminozității (valoare analogică între 0 și 1024) de pe PA0; | ||
+ | * void greenYellow(), yellowRed(), pedRedGreen(), pedGreenRed(), redYellow(), yellowGreen() - funcții ce realizază trecerea sistemului dintr-o stare în alta; | ||
+ | * Serial.available(), Serial.read(), Serial.write() - funcții utilizate pentru a realiza comunicarea și sincronizarea dintre cele două plăcuțe Arduino pe magistrala serială; | ||
+ | | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | <html> |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | <iframe |
- | </note> | + | src="https://www.youtube.com/embed/q9DNmfMmjqE" |
+ | title="YouTube video pl{{:pm:prj2023:apredescu:surse_sistem_semaforizare.zip|https://ocw.cs.pub.ro/courses/lib/images/toolbar/linkextern.png}}ayer" | ||
+ | frameborder="0" | ||
+ | allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
+ | allowfullscreen | ||
+ | style="aspect-ratio: 16/9; width: 100%;" | ||
+ | ></iframe> | ||
+ | </html> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | |||
+ | Cred că a fost o experiență plăcută și foarte utilă, mai ales că a fost primul meu proiect de hardware. A fost destul de dificil să fac ca întregul sistem să se comporte în cel mai realist mod posibil, dar în final sunt mulțumit de ceea ce am obținut. | ||
===== Download ===== | ===== Download ===== | ||
- | + | {{:pm:prj2023:apredescu:surse_sistem_semaforizare.zip|Surse sistem semaforizare}} | |
- | <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 ===== | ||
- | * 04.05 - Crearea paginii de proiect și scrierea documentației | + | * 04.05 - Crearea paginii de proiect și scrierea documentației (M1) |
+ | * 17.05 - Adăugare Hardware Design (M2) | ||
+ | * 28.05 - Adăugare Software Design (M3) | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | Datasheet ATmega328P: https://ocw.cs.pub.ro/courses/_media/pm/atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
- | </note> | + | Biblioteca Serial: https://www.arduino.cc/reference/en/language/functions/communication/serial/ |
<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> | ||