This shows you the differences between two versions of the page.
pm:prj2024:avaduva:serban.ionescu0609 [2024/05/27 07:21] serban.ionescu0609 [Software Design] |
pm:prj2024:avaduva:serban.ionescu0609 [2024/05/27 22:43] (current) serban.ionescu0609 [Rezultate Obţinute] |
||
---|---|---|---|
Line 17: | Line 17: | ||
{{:pm:prj2024:avaduva:block_diagram_ionescu_serban.png?600|}} | {{:pm:prj2024:avaduva:block_diagram_ionescu_serban.png?600|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
+ | {{:pm:prj2024:avaduva:circuit_diagram.png?600|}} | ||
Listă de piese pentru proiect: | Listă de piese pentru proiect: | ||
Line 33: | Line 33: | ||
* **Sursa de alimentare 9V** | * **Sursa de alimentare 9V** | ||
* **Breadboard** | * **Breadboard** | ||
+ | |||
+ | To Note: am decis in final sa folosesc 2 baterii, una pentru alimentarea Arduino-ului (9V) si una pentru alimentarea Motoarelor (7.4V), deoarece nu era recomandata alimentarea motoarelor cu mai mult de 6V. | ||
Line 39: | Line 41: | ||
Pentru programarea plăcii am folosit Arduino IDE, evitând bibliotecile specifice Arduino și implementând funcții manual, folosind doar <avr/io.h> și <util/delay.h>. Proiectul este axat pe integrarea și controlul senzorilor și motoarelor, utilizând tehnici de programare la nivel scăzut pentru a optimiza spațiul și eficiența. Am urmat principii și tehnici învățate în laboratoarele de GPIO și PWM pentru a asigura funcționarea corectă și eficientă a sistemului. | Pentru programarea plăcii am folosit Arduino IDE, evitând bibliotecile specifice Arduino și implementând funcții manual, folosind doar <avr/io.h> și <util/delay.h>. Proiectul este axat pe integrarea și controlul senzorilor și motoarelor, utilizând tehnici de programare la nivel scăzut pentru a optimiza spațiul și eficiența. Am urmat principii și tehnici învățate în laboratoarele de GPIO și PWM pentru a asigura funcționarea corectă și eficientă a sistemului. | ||
+ | ==== Implementarea functionalitatilor ==== | ||
+ | === Senzorul de linie === | ||
+ | Pentru senzorul de linie, am utilizat manipularea directa a registrelor pentru a initializa si citi starea senzorului: | ||
+ | Am setat pinul corespunzator ca intrare si am activat rezistenta pull-up interna. | ||
+ | Citirea starii pinului se face prin verificarea valorii in registrul PIN. | ||
+ | === Senzorul ultrasonic === | ||
+ | Senzorul ultrasonic a fost initializat si utilizat fara biblioteci Arduino, prin manipulari directe ale registrelor si prin functii de delay: | ||
+ | |||
+ | Am setat pinul de declansare (TRIG) ca iesire si pinul de ecou (ECHO) ca intrare. | ||
+ | Am implementat functii pentru trimiterea unui puls de declansare si pentru masurarea duratei raspunsului, calculand astfel distanta. | ||
+ | === Controlul motoarelor === | ||
+ | Controlul motoarelor se realizeaza prin setarea directa a pinilor de control si utilizarea PWM pentru ajustarea vitezei: | ||
+ | |||
+ | Am definit pinul de control pentru fiecare motor si am implementat functii pentru miscarea inainte, inapoi, rotirea la stanga si la dreapta, si oprirea motoarelor. | ||
+ | PWM este utilizat pentru a controla viteza motoarelor prin pinii de enable. | ||
+ | === Controlul servomotorului === | ||
+ | Pentru servomotor, am folosit functii de manipulare directa a pinilor pentru a genera semnalul PWM necesar: | ||
+ | |||
+ | Am implementat o functie care roteste servomotorul intre 0 si 180 de grade, ajustand incrementul si delay-ul pentru a controla viteza rotatiei. | ||
+ | |||
+ | === Intrerupere bucla principala === | ||
+ | De asemenea, pentru a nu folosi delay() in bucla principala, am ales sa folosesc o intrerupere. For performance reasons. | ||
+ | ==== Logica principala === | ||
+ | Codul principal include: | ||
+ | |||
+ | Initializarea componentelor (senzori, motoare, servomotor). | ||
+ | Citirea si afisarea distantei masurate de senzorul ultrasonic la intervale regulate. | ||
+ | Verificarea senzorului de linie si numararea detectarilor consecutive. | ||
+ | Implementarea unei miscari alternative dupa 10 minute de functionare initiala. | ||
+ | Controlul miscarilor robotului pentru a evita obstacolele si a detecta linii. | ||
+ | Aceste implementari au fost realizate pentru a optimiza utilizarea resurselor si a imbunatati eficienta codului, oferind in acelasi timp un control precis asupra hardware-ului. Design-ul software urmeaza principiile de programare la nivel scazut pentru a maximiza performanta si a minimiza utilizarea memoriei. | ||
+ | |||
+ | In concluzie, am folosit doar GPIO, PWM si Intreruperi pentru controlul senzorilor si motoarelor. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | {{:pm:prj2024:avaduva:ionescu_serban_picture_robot_under.jpg?200|}} |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | {{:pm:prj2024:avaduva:ionescu_serban_picture_robot_above.jpg?200|}} |
- | </note> | + | {{:pm:prj2024:avaduva:ionescu_serban_picture_robot_front.jpg?200|}} |
+ | {{:pm:prj2024:avaduva:ionescu_serban_picture_robot_diagonal.jpg?200|}} | ||
+ | In final am obtinut un robot care se descurca cu deplasarea printr-o incapere. | ||
+ | Un rezultat negativ este faptul ca am un container pentru dezinfectant cu un arc prea puternic, si servomotorul nu poate de fiecare data sa pulverizeze eficient. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Proiectul isi atinge majoritatea obiectivelor. Robotul se poate deplasa printr-o cladire fara a se lovi de obstacole, iar in cazul unei blocari, acesta isi poate reveni de unul singur. De asemenea, dupa terminarea curateniei, robotul nu va stationa in mijlocul drumului pentru a incurca trecatorii. O functionalitate la care inca trebuie lucrat ar fi modul de pulverizare cu solutie dezinfectanta. Solutia ar fi gasirea unui recipient cu un pulverizator mai fin, pentru a fi operat de servomotor. Proiectul a fost facut si cu intentia de a lucra cu functionalitati low-level ale arduino-ului, lucru care a fost obtinut prin controlul senzorilor si servomotorului in acest mod. |
- | <note warning> | + | ===== 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**. | + | |
- | </note> | + | |
+ | {{:pm:prj2024:avaduva:ionescu_serban.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 64: | Line 99: | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023 |
- | 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> | + | https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024 |
+ | https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf |