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.
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.
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, dar si in momentul in care o masina care asteapta ca sa vireze la stanga este detectata de senzorul de distanta, se porneste un timer. Atunci cand timerul 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.
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.
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).
Proiectul foloseste modelul automatelor cu stari si imparte instructiunile in doua categorii: instructiuni de tranzitie intre stari si instructiuni de output pe baza starilor. Prima categorie este compusa din functiile de intreruperi ISR() si inputInterrupt(), care gestioneaza tranzitiile intre starile sistemului pe baza timer-ului intern sau prin folosirea butonului/senzorului. A doua categorie este reprezentata de functia loop() care gestioneaza pinii de output si, in consecinta, semafoarele. Variabila runningState face legatura dintre aceste functii, asigurand aprinderea si stingerea corecta a becurilor LED.
Sistemul inregistreaza atat apasarile de buton, cat si obstacolele din fata senzorului, permitand atat pietonilor, cat si masinilor care vireaza la stanga sa treaca sau sa traverseze. Timpul alocat trecerii pietonilor si a masinilor este reglabil, astfel ca sistemul poate fi usor extins la o scara mai mare.
Acest design este o evolutie a sistemului pe baza de buton pentru pietoni deoarece permite masinilor sa vireze la stanga si in absenta unor trecatori. El poate fi extins si dezvoltat pentru implementari in viata de zi cu zi, pentru a reduce stresul si frustrarea din anumite intersectii.
Proiectul m-a ajutat sa inteleg mai bine functionarea microprocesoarelor, interactiunea dintre acestea si circuitele simple, dar si nivelul de planificare necesar pentru a realiza un astfel de sistem.
https://roboticsbackend.com/arduino-push-button-tutorial/
https://www.instructables.com/Arduino-Timer-Interrupts/
https://arduinomodules.info/ky-032-infrared-obstacle-avoidance-sensor-module/
https://docs.arduino.cc/language-reference/en/functions/external-interrupts/attachInterrupt/
https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf