This shows you the differences between two versions of the page.
pm:prj2022:arosca:robot_cu_roti [2022/05/30 16:38] Matei.iordache |
pm:prj2022:arosca:robot_cu_roti [2022/05/30 18:03] (current) Matei.iordache [Jurnal] |
||
---|---|---|---|
Line 12: | Line 12: | ||
{{:pm:prj2022:arosca:pm_iordache_matei_cezar_32241.png?600|}} | {{:pm:prj2022:arosca:pm_iordache_matei_cezar_32241.png?600|}} | ||
+ | |||
+ | ==== Schemă electrică ==== | ||
+ | {{:pm:prj2022:arosca:schema_electrica_matei_iordache.jpeg?600|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 42: | Line 45: | ||
* Servo ((https://www.arduino.cc/reference/en/libraries/servo/)) | * Servo ((https://www.arduino.cc/reference/en/libraries/servo/)) | ||
==== Structura codului ==== | ==== Structura codului ==== | ||
- | |||
- | **Initializari** - inainte de orice functie, initializam urmatoarele variabile: | ||
- | * //pox// → clasa care defineste senzorul de puls-oximetru | ||
- | * //sht// → clasa care defineste senzorul de temperatura si umiditate | ||
- | * //tsLastReport// → initializat cu 0, folosita pentru a actualiza display-ul la intervale determinate | ||
- | * //is_lying// → initializat cu -1, ne aflam intr-o stare in care nu se stie daca se minte sau se spune adevarul | ||
- | * //count// → necesar pentru a obtine media valorilor ce trebuie comparata cu threshold-ul | ||
- | * // melody, tempo, notes, wholenote, divider, noteDuration // → variabilele necesare buzzerului pentru a canta melodiile de mintit si spus adevarul (cate o variabila diferita pentru fiecare) | ||
**Functii** | **Functii** | ||
- | * //setup()// → initializarea pinilor pentru buzzer si LED-uri, initializarea ecran LCD, initializarea senzorului de puls, inregistrarea functie de callback pentru fiecare puls | + | * //setup()// → initializarea pinilor pentru driver si servomotor, scaneaza prima data zona |
- | * //loop()// → logica principala a programului: apeleaza //pox.update()// la fiecare 3 secunde calculeaza pulsul si umiditatea si afiseaza aceste infromatii pe ecran. Daca avem o valoare a pulsului valida (considerata de mine peste 60 bpm) atunci v-om adauga valoarea plusului si a umiditatii la cate o suma si vom incrementa counterul. Se apeleaza si functia make_choice() | + | * //loop()// → logica principala. La 50ms se citeste distanta de la senzorul cu ultrasunete. Se verifica daca suntem prea aproape de un obstacol. Se cheama functia drive care are grija ca vehiculul sa nu intre in obstacol. |
- | * //make_choice()// → Cand un counter declarat global ajunge la o valoare predefinita se va calcula media valorilor pentru puls si umiditate si se vor compara fiecare cu un thershold in functie de care se da verdictul de minciuna sau adevar si se apeleaza functia corespunzatoare. | + | * //drive()// → merge inainte daca nu e niciun obstacol. Merge la dreapta/stanga daca e un obstacol. |
- | * //sing_lying_song()// → se afiseaza pe ecran mesajul "You are lying!" si se porneste buzzer-ul care canta melodia corespunzatoare, apoi se reinitializeaza counterul, tsLastReport si pox; | + | * //checkClose()// → verifica daca distanta e prea aproape de vehicul. |
- | * //sing_telling_the_truth_song()// → se afiseaza pe ecran mesajul "You are telling the truth!" si se porneste buzzer-ul care canta melodia corespunzatoare, apoi se reinitializeaza counterul, tsLastReport si pox; | + | * //readNextDistance()// → scaneaza zona de obstacole. |
- | * //onBeatDetected()// → functie callBack care face un LED rosu si buzzerul sa se porneasca de fiecare data cand detecteaza un puls | + | * //readDistance()// → obtine distanta de la senzorul cu ultrasunete |
- | * //RGB_color(red, green, blue)// → seteaza pinii LED-ului RGB cu valorile date ca parametri | + | |
- | + | ||
- | + | ||
- | <note> | + | |
- | Senzorul puls-oximetru trebuie interogat cat mai rapid, altfel datele din buffer-ul sau se pierd. | + | |
- | Conform bibliotecii pe care am folosit-o, actualizarea ar trebui facuta la aproximativ 100Hz. | + | |
- | Astfel, in cod trebuie apelat cat mai des //pox.update()// | + | |
- | </note> | + | |
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 78: | Line 65: | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Mașina reușește să recunoască cu succes obstacolele aflate în fața ei și să le evite, deplasandu-se in alta directie. | ||
+ | |||
+ | A fost un proiect misto in care am invatat in mod practic sa fac inginerie (building a car) :) | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | {{:pm:prj2022:arosca:matei_pm.zip|}} |
- | 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 ===== | ||
- | |||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | |||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </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> | ||