This shows you the differences between two versions of the page.
|
pm:prj2026:vlad.radulescu2901:rares.ciociea [2026/05/05 19:27] rares.ciociea [2. Scheme Electrice și Maparea Pinilor] |
pm:prj2026:vlad.radulescu2901:rares.ciociea [2026/05/25 18:36] (current) rares.ciociea [Jurnal] |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ====== Descriere generală ====== | ====== Descriere generală ====== | ||
| - | <note tip> | + | {{:pm:prj2026:vlad.radulescu2901:schema_bloc_ciociea_rares.png?700|}} |
| - | {{:pm:prj2026:vlad.radulescu2901:schema_bloc.png?200|}} | + | |
| **Descrierea sumara a modulelor si a modului de interactiune** | **Descrierea sumara a modulelor si a modului de interactiune** | ||
| Line 24: | Line 23: | ||
| Sistemul interactioneaza printr-o bucla continua de tip **Achizitie date -> Procesare -> Actiune**. | Sistemul interactioneaza printr-o bucla continua de tip **Achizitie date -> Procesare -> Actiune**. | ||
| Pachetul de baterii alimenteaza intregul ansamblu. In timpul rularii, senzorii colecteaza date din mediu si le transmit catre microcontroler sub forma de impulsuri sau niveluri de tensiune. ATmega328P analizeaza aceste intrari si, pe baza algoritmului de decizie, trimite semnale de control (PWM si directie logica) catre driverul L298N. Driverul actioneaza ca un amplificator, cupland motoarele la curentul bateriei pentru a executa deplasarea. In paralel, microcontrolerul raporteaza constant starea sistemului (baterie, distante, decizii de viraj) prin intermediul modulului Bluetooth. | Pachetul de baterii alimenteaza intregul ansamblu. In timpul rularii, senzorii colecteaza date din mediu si le transmit catre microcontroler sub forma de impulsuri sau niveluri de tensiune. ATmega328P analizeaza aceste intrari si, pe baza algoritmului de decizie, trimite semnale de control (PWM si directie logica) catre driverul L298N. Driverul actioneaza ca un amplificator, cupland motoarele la curentul bateriei pentru a executa deplasarea. In paralel, microcontrolerul raporteaza constant starea sistemului (baterie, distante, decizii de viraj) prin intermediul modulului Bluetooth. | ||
| - | </note> | ||
| ====== Hardware Design ====== | ====== Hardware Design ====== | ||
| Line 42: | Line 40: | ||
| * **Sistem de Comunicație:** 1x Modul Bluetooth HC-05. | * **Sistem de Comunicație:** 1x Modul Bluetooth HC-05. | ||
| * **Sistem de Alimentare:** | * **Sistem de Alimentare:** | ||
| - | * 1x Suport pentru 4 baterii tip AA. | + | * 1x Suport pentru 6 baterii tip AA. |
| - | * 4x Baterii Alcaline AA 1.5V (Tensiune totală nominală: 6V). | + | * 6x Baterii Alcaline AA 1.5V (Tensiune totală nominală: 9V). |
| * **Componente Pasive & Conectică:** | * **Componente Pasive & Conectică:** | ||
| - | * 1x Rezistor 4.7kΩ (Albastru-precizie: Galben-Violet-Negru-Maro). | + | * 2x Rezistor 10kΩ |
| - | * 1x Rezistor 2.2kΩ (Albastru-precizie: Roșu-Roșu-Negru-Maro). | + | |
| * 1x Breadboard mini (170 puncte). | * 1x Breadboard mini (170 puncte). | ||
| * Set fire conexiune Dupont (Tată-Tată, Mamă-Tată). | * Set fire conexiune Dupont (Tată-Tată, Mamă-Tată). | ||
| Line 56: | Line 53: | ||
| *(Notă tehnică: Alimentarea logicii de 5V a microcontrolerului se face prin pinul de +5V al modulului L298N, acesta coborând tensiunea de 6V a bateriei printr-un regulator integrat).* | *(Notă tehnică: Alimentarea logicii de 5V a microcontrolerului se face prin pinul de +5V al modulului L298N, acesta coborând tensiunea de 6V a bateriei printr-un regulator integrat).* | ||
| - | {{:pm:prj2026:vlad.radulescu2901:schematic_provizoriu_ciociea_rares.png?500|}} | + | {{:pm:prj2026:vlad.radulescu2901:schematic_rares_ciociea.png?800|}} |
| **Tabelul Conexiunilor Hardware (Pinout Map):** | **Tabelul Conexiunilor Hardware (Pinout Map):** | ||
| - | Pentru interfațarea senzorilor cu perifericele interne ale ATmega328P (Timere, ADC, USART, Întreruperi) s-a utilizat următoarea mapare: | + | Pentru interfațarea senzorilor cu perifericele interne ale ATmega328P s-a utilizat următoarea mapare: |
| ^ Modul Extern ^ Pin Modul ^ Conexiune ATmega328P ^ Rol / Periferic Utilizat ^ | ^ Modul Extern ^ Pin Modul ^ Conexiune ATmega328P ^ Rol / Periferic Utilizat ^ | ||
| - | | **Modul HC-05** | TX | PD0 (RXD) | Comunicație Serială (USART) | | + | | **Modul HC-05** | TX | PB0 | Comunicație Serială (USART) | |
| - | | **Modul HC-05** | RX | PD1 (TXD) | Comunicație Serială (USART) | | + | | **Modul HC-05** | RX | PB1 | Comunicație Serială (USART) | |
| - | | **L298N (Driver)** | ENA | PB1 (OC1A) | Control Viteză Motor Stânga (PWM Hardware) | | + | | **L298N (Driver)** | ENA | PD5 | Control Viteză Motor Stânga (PWM Hardware) | |
| - | | **L298N (Driver)** | ENB | PB2 (OC1B) | Control Viteză Motor Dreapta (PWM Hardware) | | + | | **L298N (Driver)** | ENB | PD6 | Control Viteză Motor Dreapta (PWM Hardware) | |
| - | | **L298N (Driver)** | IN1, IN2 | PD4, PD5 | Control Direcție Motor Stânga (GPIO) | | + | | **L298N (Driver)** | IN1, IN2 | PD4, PD7 | Control Direcție Motor Stânga (GPIO) | |
| - | | **L298N (Driver)** | IN3, IN4 | PD6, PD7 | Control Direcție Motor Dreapta (GPIO) | | + | | **L298N (Driver)** | IN3, IN4 | PB2, PB3 | Control Direcție Motor Dreapta (GPIO) | |
| - | | **Divizor Tensiune** | Vout (Intersecție) | PC0 (ADC0) | Monitorizare nivel baterie (ADC) | | + | | **Divizor Tensiune** | Vout (Intersecție) | PC0 (A0) | Monitorizare nivel baterie (ADC) | |
| - | | **TCRT5000** | A0 | PC1 (ADC1) | Detecție analogică margine (ADC) | | + | | **TCRT5000** | A0 | PC1 (A1) | Detecție analogică margine / podea (ADC) | |
| - | | **HC-SR04 (Senzori)** | Pinii Echo | PD2/PD3 (INT0/INT1) | Captură timp răspuns (Întreruperi Externe) | | + | | **HC-SR04 (Față)** | Trig, Echo | PD2, PD3 | Măsurare distanță față (GPIO) | |
| - | + | | **HC-SR04 (Stânga)** | Trig, Echo | PC2 (A2), PC3 (A3) | Măsurare distanță stânga (ADC folosit ca GPIO) | | |
| + | | **HC-SR04 (Dreapta)** | Trig, Echo | PC4 (A4), PC5 (A5) | Măsurare distanță dreapta (ADC folosit ca GPIO) | | ||
| ===== 3. Diagrame de Semnal ===== | ===== 3. Diagrame de Semnal ===== | ||
| Line 87: | Line 84: | ||
| {{:pm:prj2026:vlad.radulescu2901:l298n.png?800|}} | {{:pm:prj2026:vlad.radulescu2901:l298n.png?800|}} | ||
| - | ===== Software Design ===== | ||
| - | <note tip> | + | ====== Software Design ====== |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | ===== 1. Mediu de dezvoltare ===== |
| - | <note tip> | + | Pentru scrierea, compilarea si incarcarea codului pe microcontroler (ATmega328P), am renuntat la clasicul Arduino IDE in favoarea **Visual Studio Code (VS Code) impreuna cu extensia PlatformIO**. |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | Aceasta alegere ne-a oferit un flux de lucru mult mai profesional. PlatformIO permite impartirea codului in mai multe fisiere (cum ar fi separarea logicii de Bluetooth in ''hc05_comm.hpp''), ofera un sistem de autocomplete mult mai destept si gestioneaza automat compilarea fara sa ne incurcam in setari ascunse. Desi folosim framework-ul Arduino pentru usurinta, mediul VSC + PlatformIO ne-a permis sa scriem un cod mult mai curat si modular. |
| + | |||
| + | ===== 2. Librarii si surse 3rd-party ===== | ||
| + | |||
| + | Ca sa pastram o viteza de reactie maxima a robotului si sa nu incarcam memoria procesorului cu cod inutil, am decis sa limitam la extrem folosirea librariilor externe. Astfel, am folosit doar: | ||
| + | * **<Arduino.h>** - Importata automat de PlatformIO, esentiala pentru functiile de baza (''millis()'', ''analogRead()'', ''digitalWrite()''). | ||
| + | * **<SoftwareSerial.h>** - Libraria standard folosita pentru a crea un port serial virtual pe alti pini, necesara pentru comunicarea cu modulul Bluetooth HC-05. | ||
| + | * **"hc05_comm.hpp"** - Un fisier header propriu creat pentru a pastra functiile de trimitere si primire mesaje separat de fisierul principal ''main.cpp''. | ||
| + | |||
| + | Nu am folosit librarii terte (gen NewPing) pentru senzorii ultrasonici tocmai pentru a putea controla manual timpii de asteptare si a preveni blocarea procesorului. | ||
| + | |||
| + | ===== 3. Algoritmi si structuri de date ===== | ||
| + | |||
| + | Programul a fost gandit pe o arhitectura **100% non-blocanta**. Asta inseamna ca nu exista nicio instructiune de tip ''delay()'' in bucla principala, permitand robotului sa citeasca senzorii, sa conduca motoarele si sa trimita telemetrie pe telefon in acelasi timp. | ||
| + | |||
| + | Logica principala se bazeaza pe doua mari concepte: | ||
| + | * **Masina de Stari Finita (FSM):** Creierul robotului este o variabila (''stareRobot'') care ii dicteaza ce face in orice moment: | ||
| + | * **Starea 0 (Stop):** Asteapta comenzi, motoarele sunt oprite. | ||
| + | * **Starea 1 (Mers Inainte):** Robotul inainteaza si scaneaza continuu cu cei 3 senzori frontali si cu senzorul de podea. | ||
| + | * **Starea 2 (Mers Inapoi):** Se activeaza automat daca vede un obstacol sub 30 cm sau daca ramane fara podea. Da cu spatele cateva sute de milisecunde pentru a-si face loc. | ||
| + | * **Starea 3 (Rotire):** Executa virajul efectiv pe baza deciziei luate in starea 2, dupa care revine in starea 1. | ||
| + | |||
| + | * **Algoritmul de Acoperire Organica (Memoria deciziilor):** Pentru ca robotul sa nu se blocheze intr-o bucla repetitiva (cum ar fi sa faca mereu stanga si sa se invarta in cerc), am implementat un vector ''istoricDecizii[10]''. Acesta memoreaza ultimele 10 directii alese. Cand robotul da de un obstacol, algoritmul alege directia de viraj pe baza senzorilor laterali, dar timpul de rotire este generat **aleatoriu** (intre 400 si 900 milisecunde). Daca memoria detecteaza ca robotul face prea multe viraje in aceeasi directie sau se loveste de prea multe ori intr-un timp scurt, declanseaza o masura de urgenta: sterge memoria si executa o rotatie foarte lunga, tot aleatorie, pentru a evada din acel colt al camerei. | ||
| + | |||
| + | ===== 4. Surse si functii implementate ===== | ||
| + | |||
| + | Pentru a pune in practica algoritmii de mai sus, codul a fost impartit in cateva functii vitale si puternic optimizate hardware: | ||
| + | * **''setup()'' si ''loop()''**: In ''setup()'' initiem pinii si generam un ''randomSeed()'' citind "zgomotul" de pe un pin analogic liber (A6), asigurandu-ne ca deciziile robotului sunt diferite la fiecare pornire. In ''loop()'' se ruleaza Masina de Stari si se trimite telemetria spre telefon (voltaj, distanta) la fiecare 1000 de milisecunde, calculat via ''millis()''. | ||
| + | * **''getDistanta()''**: Aceasta este functia senzorilor ultrasonici. Secretul ei sta in parametrul de timeout modificat la 3500 microsecunde. Astfel, procesorul nu asteapta dupa ecouri venite de la 4 metri distanta, ci inchide ascultarea la aprox. 60 cm. Asta a eliberat procesorul si a reparat complet lag-ul de pe comenzile Bluetooth. | ||
| + | * **''citesteVccReal()''**: Functia care masoara voltajul real al bateriei LiPo folosind referinta interna de 1.1V a cipului. Aici am folosit tehnica de "Double Dummy Read" (citire in gol a pinilor analogici) pentru a da timp condensatorului intern din microcontroler sa se goleasca, evitand astfel combinarea valorilor de la senzorul de podea cu cele de la baterie. | ||
| + | * **''salveazaDecizie()''**: Functia care gestioneaza memoria circulara de 10 pozitii, adaugand noul viraj (Stanga sau Dreapta) in vector si mentinand logica de evadare alerta. | ||
| + | * **Functiile de miscare** (''mergiInainteIncet()'', ''rotesteStangaIncet()'' etc.): Setari rapide de stare logica (HIGH/LOW) si PWM pe pinii L298N pentru a controla puntea H fara a aglomera bucla principala. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | ===== Download ===== | + | Proiectul ne-a demonstrat ca o placuta simpla cu microcontroler ATmega328P poate sa gestioneze multi senzori si sa ia decizii destul de destepte, daca codul este scris eficient si curat. |
| - | <note warning> | + | Cea mai mare lectie invatata a fost legata de functiile blocante. Pentru un robot care trebuie sa reactioneze in timp real si sa asculte si de comenzi prin Bluetooth, instructiunile de tip delay() sau timeout-urile prea mari la senzori sunt complet interzise. De asemenea, am vazut ca limitarile fizice ale cipului (cum ar fi un singur voltmetru intern impartit la toti pinii) pot fi pacalite usor prin trucuri software, cum sunt citirile duble. |
| - | 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**. | + | Din punct de vedere al traseului, am realizat ca daca lasam robotul sa faca doar viraje fixe (de exemplu, mereu la 90 de grade), acesta va ramane blocat rapid intr-o bucla infinita pe acelasi traseu. Introducerea algoritmului cu timpi de viraj aleatori si stocarea istoricului de decizii au fost cheia pentru a obtine un comportament mult mai inteligent si o acoperire foarte buna a intregii camere. |
| - | </note> | + | |
| + | ===== Download ===== | ||
| + | |||
| + | GitHub: https://github.com/raresciociea/swiffer-autonom | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | <note tip> | + | 13.05.2025 - Au fost lipite cu cositor firele care duc la motoare si la divizorul de tensiune. Dovada ca etapa hardware a fost indeplinita este transmiterea pe serial Bluetooth a citiriilor senzorilor, si rotirea motoarelor. |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| + | {{:pm:prj2026:vlad.radulescu2901:serial_bluetooth_terminal_rares_ciociea.jpg?300|}} | ||
| + | |||
| + | Link test roti: https://drive.google.com/file/d/1JDcxumcGRbAPboI4evX0atG_J3Q3IFuz/view?usp=drivesdk | ||
| + | |||
| + | 20.05.2026 - Am rezolvat problema uriasa de lag de pe Bluetooth, din cauza careia trebuia sa apasam de multe ori pe telefon ca sa prindem comanda de Start sau Stop. Problema era de la pulseIn(), care bloca procesorul timp de 25 de milisecunde pentru fiecare senzor ultrasonic cand robotul era in spatiu deschis. Am scazut timeout-ul la 3500 microsecunde (suficient pentru vreo 60cm in fata), iar acum aplicatia de pe telefon raspunde instant, din prima. | ||
| + | |||
| + | 22.05.2026 - Am reparat citirea divizorului de tensiune pentru baterie. Dupa ce am scos delay-urile din cod, telemetria incepuse sa arate aiurea o valoare blocata in jur de 3V, desi la multimetru aveam 8.4V. Bug-ul era cauzat de schimbarile extrem de rapide de pe multiplexorul ADC intre senzorul de podea (A1) si baterie (A0). Am rezolvat prin adaugarea unei "citiri in gol" (dummy read) si a unei micro-pauze de stabilizare hardware, curatand condensatorul intern al ADC-ului. Acum tensiunea afisata este stabila si corecta. | ||
| + | |||
| + | 24.05.2026 - Am imbunatatit radical algoritmul de acoperire a camerei. Am renuntat la timpii ficsi de viraj care invarteau robotul in aceleasi zone si am trecut pe timpi de rotire complet aleatori (intre 400ms si 900ms). In plus, am activat si memoria ultimelor 10 decizii salvate intr-un vector. Daca robotul se loveste des in acelasi loc sau face aceeasi intoarcere la nesfarsit, sistemul isi da seama ca e blocat, reseteaza istoricul si forteaza o manevra lunga de evadare (U-Turn) ca sa iasa din colturi. | ||
| + | Link Demo: | ||
| + | https://drive.google.com/file/d/1l5hyUvKaTeUjokgSLg2P7t9O1l73x-RN/view?usp=drivesdk | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| <note> | <note> | ||
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | ===== Resurse Hardware (Datasheet-uri) ===== |
| + | * **ATmega328P Xplained Mini** - User Guide-ul oficial Microchip (utilizat pentru maparea pinilor fizici ai placii si schemele de alimentare): [[https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Xplained-Mini-User-Guide-DS50002659B.pdf|ATmega328P Xplained Mini User Guide (PDF)]] | ||
| + | * **Microcontroler ATmega328P** - Datasheet complet (utilizat pentru intelegerea arhitecturii, registrilor interni, Timere, ADC, USART si intreruperi): [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet (PDF)]] | ||
| + | * **Driver Motoare L298N** - STMicroelectronics Datasheet (consultat pentru limitele de curent, caderea de tensiune pe puntea H si logica de control): [[https://www.st.com/resource/en/datasheet/l298.pdf|L298N Datasheet (PDF)]] | ||
| + | * **Senzor Ultrasonic HC-SR04** - Specificatii tehnice (utilizat pentru extragerea diagramelor de semnal si a formulei de calcul a distantei bazate pe viteza sunetului): [[https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf|HC-SR04 Datasheet (PDF)]] | ||
| + | * **Modul Bluetooth HC-05** - Manual de utilizare (consultat pentru tensiunile de operare si pinii de comunicatie RX/TX): [[https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf|HC-05 Datasheet (PDF)]] | ||
| + | * **Senzor Infrarosu TCRT5000** - Vishay Datasheet (utilizat pentru curbele de reflectie si intelegerea circuitului emitator-receptor): [[https://www.vishay.com/docs/83760/tcrt5000.pdf|TCRT5000 Datasheet (PDF)]] | ||
| + | * **Motoare DC cu Reductor (TT Motors 1:48)** - Specificatii generice pentru motoarele galbene de sasiu (utilizate pentru a calcula curentul de stall necesar a fi suportat de L298N): [[https://cdn.sparkfun.com/datasheets/Robotics/DG01D.pdf|TT Motor Datasheet (PDF)]] | ||
| + | |||
| + | ===== Resurse Software ===== | ||
| + | * **OCW UPB - Proiectare cu Microprocesoare:** Suportul teoretic de laborator pentru configurarea perifericelor hardware si notiuni de electronica: [[https://ocw.cs.pub.ro/courses/pm|ocw.cs.pub.ro/courses/pm]] | ||
| + | * **Arduino Reference:** Documentatia oficiala pentru arhitectura de cod si functiile standard (millis, pini I/O) utilizate in sistemul non-blocant: [[https://www.arduino.cc/reference/en/|Arduino Language Reference]] | ||
| + | * **WaveDrom:** Unealta utilizata pentru generarea diagramelor de semnal (timing diagrams) din sectiunea de Hardware Design: [[https://wavedrom.com/|wavedrom.com]] | ||
| </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> | ||