This shows you the differences between two versions of the page.
pm:prj2025:iotelea:bogdan.fratiman [2025/05/25 20:46] bogdan.fratiman [Hardware Design] |
pm:prj2025:iotelea:bogdan.fratiman [2025/05/26 12:08] (current) bogdan.fratiman |
||
---|---|---|---|
Line 41: | Line 41: | ||
</note> | </note> | ||
- | {{:pm:prj2025:iotelea:barrier_down.jpg?300|}} | + | {{:pm:prj2025:iotelea:barrier_down.jpg?300|}} {{:pm:prj2025:iotelea:barrier_up.jpg?300|}} |
=== Schema electrică === | === Schema electrică === | ||
Line 59: | Line 59: | ||
**Surse şi funcţii implementate:** | **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. | + | * ''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: |
- | * ''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> |
+ | 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''. | * ''handleButtonPress()'' - Activează rutina de întrerupere pentru buton setând flag-ul ''buttonPressed''. | ||
- | * ''loop()'' - Bucla principală. | + | <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 68: | 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 93: | Line 123: | ||
</note> | </note> | ||
- | <note tip> | + | <note important> |
Resurse utilizate: | Resurse utilizate: | ||