This is an old revision of the document!


Sistem Intersectie Semaforizata

Introducere

Proiectul prezinta un model pentru o intersectie in T, semaforizata, controlata printr-un senzor de distanta si butoane. Intersectia este formata dintr-un bulevard des circulat, o trecere de pietoni si o strada secundara cu sens unic; soferii care trebuie sa vireze la stanga ca sa intre pe strada secundara trebuie sa astepte ca semaforul pentru directia inainte sa devina rosu.

Pentru a regula aceste intervale, semafoarele pentru directia inainte sunt initial verzi, iar daca un senzor de distanta detecteaza masini care vor sa vireze stanga sau un buton este apasat de catre un pieton, dupa un timp de asteptare semafoarele se vor schimba, permitand celor care asteapta sa treaca. Dupa un timp suficient de lung, sistemul se va intoarce in starea initiala, unde va ramane fortat pentru o perioada de timp pentru a preveni blocarea permanenta a semaforului inainte.

Scopul acestui sistem este acela de a regla timpul alocat traversarii intersectiei de catre pietoni si timpul alocat masinilor care circula inainte/la stanga. Ideea de la care am pornit este urmatoarea: daca pietonii si masinile care vireaza la stanga apar mult mai rar decat masinile care merg drept inainte, atunci ar fi util un sistem inteligent care sa gestioneze cand sa permita pietonilor (si masinilor care vireaza la stanga) sa treaca.

Un astfel de sistem ar reduce timpul petrecut la stop pentru cea mai mare parte a soferilor care circula prin intersectie, fara a exclude pietonii si minoritatea soferilor care trebuie sa vireze la stanga.

Descriere generală

Sistemul trece in mod circular prin mai multe stari care controleaza traficul intersectiei. La inceput, semafoarele pentru stanga si pietoni sunt rosii, iar semafoarele inainte sunt verzi. In momentul in care un pieton apasa pe un buton, se porneste un timer pentru pietoni. In momentul in care o masina care asteapta ca sa vireze la stanga este detectata de senzorul de distanta, se porneste un timer pentru masini. Atunci cand oricare dintre timere ajunge la 0, semaforul inainte va trece printr-o stare intermediara (culoarea galbena), apoi va deveni rosu. Dupa un delay de siguranta, semafoarele pentru pietoni si stanga vor deveni verzi.

Cand semafoarele pentru pietoni si stanga devin verzi, microprocesorul intra intr-o stare in care ignora butoanele si senzorul si porneste un timer de astepare. Cand timerul de asteptare ajunge la 0, semafoarele trec printr-o stare intermediara (pentru pietoni: clipeste rosu, pentru masini: culoarea galbena), apoi devin din nou rosii. Dupa un delay de siguranta, semafoarele pentru inainte devin verzi, iar microprocesorul incepe din nou sa astepte semnale de la senzor si butoane.

Hardware Design

Schema Electrica

BOM

Denumire Cantitate Datasheet
Arduino UNO R3 1 datasheet
Senzor Infrarosu KY-032 1 datasheet
LED Rosu 5
LED Galben 2
LED Verde 5
Rezistor 220 Ohm 13
Rezistor 10k Ohm 1
Large Breadboard 1
PushButton 1

Descriere componente

  • Arduino Uno R3: Controller ATMega328P, responsabil cu primirea datelor de la senzor si de aprinderea/stingerea LED-urilor.
  • Senzor Infrarosu KY-032: (GND-GND, VCC-5V, OUT-D3) Senzor cu infrarosu pentru detectarea obstacolelor, folosit pentru a detecta prezenta unei masini la semafor (distanta reglabila prin intermediul rezistorilor sai variabili; pinul ENABLE nu a fost conectat deoarece sistemul nu dezactiveaza senzorul.
  • LED-uri colorate: (pinii D5-10, D12-D13) Becuri LED care reprezinta luminile unor semafoare.
  • Buton: (pin D2, 5V, GND) Buton pentru pietoni.

Functionare KY-032

Software Design

  • Mediu de dezvoltare: Arduino IDE 2.3.6
  • Nicio biblioteca third-party
  • Element de noutate: activarea tranzitiilor folosind ori un senzor, ori un buton (spre deosebire de folosirea numai a unui buton)
  • Functionalitati din laboratoare: GPIO, intreruperi, timere

States

Sistemul se bazeaza pe multiple stari de functionare prin care cicleaza pe baza unui timer intern (Timer1, prescale 1024, compare mode). Fiecare configuratie de becuri aprinse si stinse are propria sa functie dedicata, functie apelata in interiorul functiei de loop a placutei. Tranzitiile intre stari au loc in cadrul unor intreruperi; la apasarea butonului si/sau detectarea unei masini de catre senzor, timer-ul intern este pornit cu o valoare de timp setata (valorile folosite sunt de 0.5, 1, 2 si 4 secunde, calculate folosind valoarea intern cycle = 16 MHz).

Dupa ce placuta trece din starea initiala (s0) la starea s1 in urma unei intreruperi cauzata de buton sau de senzor, intreruperile de buton si senzor sunt ignorate pana cand sistemul revine in starea initiala. Sistemul va trece prin stari de la 1 la 9 folosindu-se un compare timer interrupt. La fiecare completare a timer-ului, valoarea sa se reseteaza si pragul este modificat in functie de intervalul de timp care se vrea. Odata ce ultimul timer expira (in starea s9), timer-ul este dezactivat, interrupt-urile de buton si senzor sunt reactivate, iar la final se trece inapoi in starea initiala s0.

Scheletul proiectului

  • setup(): contine comenzile de inceput - initializarile de pini, stare initiala si functionarea timer-ului Timer1.
  • loop(): functia apelata la fiecare tick, aprinde sau opreste LED-urile in functie de starea curenta.
  • lights_######(): set de functii care aprind sau opresc LED-uri pentru a obtine o configuratie valida a luminilor intr-o intersectie. Configuratiile valide sunt: complet rosu, verde pentru masini inainte, galben pentru masini inainte, verde pentru masini la stanga si pietoni, si doua pentru galben pentru masini la stanga (semaforul de pietoni clipeste in loc sa foloseasca o a treia culoare).
  • inputInterrupt(): functie asociata pinilor 2 si 3 (buton si senzor), pini folositi de placuta Arduino Uno ca pini de interrupt. Functia este controlata de variabila canTrigger.
  • ISR(TIMER1_COMPA_vect): functie de interrupt care verifica daca Timer1 a atins pragul setat. In momentul in care este apelata, reseteaza timer-ul si seteaza o noua valoare de atins, apoi trece in starea urmatoare; daca se afla in starea s9, se va dezactiva timer-ul.

Fragmente de cod

void lights_forward()
{
  // Forward semaphore
  digitalWrite(fwd_sem_red_pin, LOW);
  digitalWrite(fwd_sem_ylw_pin, LOW);
  digitalWrite(fwd_sem_grn_pin, HIGH);
  
  // Left semaphore
  digitalWrite(left_sem_red_pin, HIGH);
  digitalWrite(left_sem_ylw_pin, LOW);
  digitalWrite(left_sem_grn_pin, LOW);
  
  // Walk semaphore
  digitalWrite(walk_sem_red_pin, HIGH);
  digitalWrite(walk_sem_grn_pin, LOW);
}

Exemplu de functie care gestioneaza care LED-uri sunt aprinse; in acest caz, semaforul “inainte” este verde, iar semafoarele “stanga” si “pieton” sunt rosii.

ISR(TIMER1_COMPA_vect)
{
  // Set duration based on current state
  switch (runningState) {
    case 1:
      TCNT1 = 0; // Set counter value to 0
      runningState = 2;

      // Set timer value to 2 seconds
      OCR1A = twoSecondCompare;

      break;
      ...
  }
}

Secventa de cod din cadrul functiei ISR. La fiecare intrerupere cauzata de Timer1, se trece in starea urmatoare si se reseteaza timer-ul. Pentru a controla timpul dintre schimbarile de culori, OCR1A primeste noi valori (precalculate, constante).

Rezultate Obţinute

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

Concluzii

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.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/ajipa/andrei.badescu1512.1748112905.txt.gz · Last modified: 2025/05/24 21:55 by andrei.badescu1512
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