This shows you the differences between two versions of the page.
pm:prj2025:iotelea:bogdan.fratiman [2025/05/19 19:18] bogdan.fratiman [Introducere] |
pm:prj2025:iotelea:bogdan.fratiman [2025/05/26 12:08] (current) bogdan.fratiman |
||
---|---|---|---|
Line 4: | Line 4: | ||
Grupa: **333CD** | Grupa: **333CD** | ||
</note> | </note> | ||
- | ===== Introducere ===== 8-) | + | ===== Introducere ===== |
**Mini Barrier** este un sistem automat de control al accesului, care detectează vehiculele care se apropie și acționeaza o barieră cu ajutorul unui servomotor. Utilizând un senzor ultrasonic, sistemul estimează distanța până la vehicul și decide automat dacă trebuie ridicată bariera. Pentru a permite și intervenția umană există și un buton care acționează manual bariera. Pe lângă acestea, un ecran LCD afișează distanța până la vehicul și contorizează numărul total de vehicule care au trecut prin sistem. | **Mini Barrier** este un sistem automat de control al accesului, care detectează vehiculele care se apropie și acționeaza o barieră cu ajutorul unui servomotor. Utilizând un senzor ultrasonic, sistemul estimează distanța până la vehicul și decide automat dacă trebuie ridicată bariera. Pentru a permite și intervenția umană există și un buton care acționează manual bariera. Pe lângă acestea, un ecran LCD afișează distanța până la vehicul și contorizează numărul total de vehicule care au trecut prin sistem. | ||
Line 40: | Line 40: | ||
- Cabluri jumper | - Cabluri jumper | ||
</note> | </note> | ||
+ | |||
+ | {{:pm:prj2025:iotelea:barrier_down.jpg?300|}} {{:pm:prj2025:iotelea:barrier_up.jpg?300|}} | ||
=== Schema electrică === | === Schema electrică === | ||
{{:pm:prj2025:iotelea:bogdan-schema-electrica.png?700|}} | {{:pm:prj2025:iotelea:bogdan-schema-electrica.png?700|}} | ||
- | <note tip> | + | |
- | Aici puneţi tot ce ţine de hardware design: | + | |
- | * listă de piese | + | |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | |
- | * diagrame de semnal | + | |
- | * rezultatele simulării | + | |
- | </note> | + | |
Line 56: | Line 52: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | **Mediu de dezvoltare:** Arduino IDE 8-O |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | **Librării şi surse 3rd-party:** ''LiquidCrystal_I2C.h'' - pentru interfața I2C a LCD-ului |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | **Algoritmi şi structuri:** Structura sistemului este asemănătoare unui state machine cu 4 stări: ''IDLE'', ''CAR_IN'', ''CAR_OUT'' și ''FULL'', determinate de distanța măsurată și starea butonului, tratat ca întrerupere externă. Controlul servomotorului se face prin generarea unui semnal PWM folosind Timer1, configurat in mod fast PWM cu TOP = ICR1. |
+ | |||
+ | **Surse şi funcţii implementate:** | ||
+ | * ''setup()'' - Inițializează toate perifericele și configurează Timer1 în mod Fast PWM (WGM13:0 = 14) cu TOP = ICR1 = 40000, pentru a genera un semnal PWM de 50 Hz pe pinul OC1A (pin 9), cu un prescaler de 8, potrivit pentru servomotorul SG90: | ||
+ | <code java> | ||
+ | TCCR1A = (1 << WGM11); | ||
+ | TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); | ||
+ | |||
+ | ICR1 = 40000; | ||
+ | TCCR1A |= (1 << COM1A1); | ||
+ | </code> | ||
+ | * ''setServoAngle(int angle)'' - Primește un unghi între 0° și 180°, îl convertește într-un impuls PWM între 750 și 2300 µs, apoi setează valoarea în OCR1A: | ||
+ | <code java> | ||
+ | int pulseWidth = map(angle, 0, 180, 750, 2300); | ||
+ | OCR1A = pulseWidth * 2; | ||
+ | </code> | ||
+ | * ''handleButtonPress()'' - Activează rutina de întrerupere pentru buton setând flag-ul ''buttonPressed''. | ||
+ | <code java> | ||
+ | attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, RISING); | ||
+ | </code> | ||
+ | * ''loop()'' - Bucla principală a programului. Se ocupă de: | ||
+ | * măsurarea distanței cu senzorul HC-SR04 | ||
+ | <code java> | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | delayMicroseconds(2); | ||
+ | digitalWrite(trigPin, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(trigPin, LOW); | ||
+ | |||
+ | long duration = pulseIn(echoPin, HIGH); | ||
+ | float distance = duration * 0.034 / 2; | ||
+ | </code> | ||
+ | * actualizarea ecranului LCD | ||
+ | * verificarea stării butonului | ||
+ | * acționarea barierei prin apeluri la ''setServoAngle(...)'' | ||
</note> | </note> | ||
Line 66: | Line 96: | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Link Youtube: |
+ | |||
+ | https://youtube.com/shorts/j4JR8kcPbFc?feature=share | ||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Proiectul **Mini Barrier** integrează mai multe componente hardware într-un sistem funcțional, de la controlul unui servomotor fără a folosi librăria Servo.h, prin configurarea directă a Timer-ului 1 în mod Fast PWM, până la tratarea butonului prin întrerupere externă și afișarea informațiilor pe un ecran LCD folosind protocolul I2C. |
- | + | Implementarea a demonstrat o aplicare practică a noțiunilor de bază din programarea microcontrolerelor, precum și modul în care acestea pot fi combinate într-o aplicație reală și interactivă. | |
- | <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 ===== | ||
<note tip> | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | **M1 – Documentație** - Am început redactarea paginii de OCW prin completarea următoarelor secțiuni: descriere, introducere, schema bloc și lista/descrierea componentelor hardware. |
+ | |||
+ | **M2 – Hardware** - Am adăgat schema electrică pe pagina de wiki și am realizat montajul parțial al proiectului atât hardware cât și software: LED-uri, buton, LCD. | ||
+ | |||
+ | **M3 - Software** - Am completat montajul și după ce m-am asigurat că toate componentele funcționează și logica state machine-ului este corectă am aplicat cunoștințele din laboratoare: Timer1 cu Fast PWM pentru servo, întreruperi pentru buton, I2C pentru LCD. | ||
</note> | </note> | ||
Line 89: | Line 121: | ||
<note> | <note> | ||
Repo Github: https://github.com/bogdiw/mini-barrier | Repo Github: https://github.com/bogdiw/mini-barrier | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Resurse utilizate: | ||
+ | |||
+ | https://forum.arduino.cc/t/controlling-a-single-servo-using-pwm-and-timer-1/491621 | ||
+ | |||
+ | https://www.youtube.com/watch?v=aQy3DGSIGm4 | ||
</note> | </note> | ||
<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> | ||