This shows you the differences between two versions of the page.
|
pm:prj2026:vlad.radulescu2901:rares.ciociea [2026/05/15 18:24] 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> | + | {{:pm:prj2026:vlad.radulescu2901:schema_bloc_ciociea_rares.png?700|}} |
| - | {{:pm:prj2026:vlad.radulescu2901:schema_bloc.png?700|}} | + | |
| **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 87: | Line 84: | ||
| {{:pm:prj2026:vlad.radulescu2901:l298n.png?800|}} | {{:pm:prj2026:vlad.radulescu2901:l298n.png?800|}} | ||
| - | ====== Software Design ====== | ||
| - | *(Nota: Aceasta sectiune prezinta o arhitectura de nivel inalt, detaliile urmand sa fie rafinate in etapa finala de implementare).* | + | |
| + | ====== Software Design ====== | ||
| ===== 1. Mediu de dezvoltare ===== | ===== 1. Mediu de dezvoltare ===== | ||
| - | Pentru scrierea, compilarea si incarcarea firmware-ului, mediul de dezvoltare ales este **Arduino IDE**. Desi platforma hardware este un ATmega328P Xplained Mini, ecosistemul Arduino ofera un flux de lucru mult mai rapid (Rapid Prototyping) si o sintaxa mai accesibila pentru gestionarea pinilor (GPIO) si a functiilor de timp, comparativ cu programarea stricta pe registri in Microchip Studio. | + | |
| + | 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**. | ||
| + | |||
| + | 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 ===== | ===== 2. Librarii si surse 3rd-party ===== | ||
| - | Pentru a mentine un control strict asupra executiei si a minimiza overhead-ul, utilizarea librariilor externe va fi limitata la minimum necesar: | ||
| - | * Se va folosi exclusiv biblioteca standard **Arduino Core** (pentru functii de baza precum millis(), analogRead(), analogWrite(), digitalWrite()). | ||
| - | * Interfatarea cu senzorii ultrasonici si citirea nivelului bateriei se vor face prin metode standard, fara a importa librarii masive din surse terte. | ||
| - | * Optional, pentru modulul Bluetooth, se poate folosi libraria SoftwareSerial.h inclusa in pachetul standard Arduino. | ||
| - | ===== 3. Algoritmi si structuri de date planificate ===== | + | 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: |
| - | Aplicatia va fi proiectata pe o arhitectura **non-blocanta** (fara utilizarea instructiunii delay()), esentiala pentru reactia in timp real a robotului la datele primite de la senzori. | + | * **<Arduino.h>** - Importata automat de PlatformIO, esentiala pentru functiile de baza (''millis()'', ''analogRead()'', ''digitalWrite()''). |
| - | * **Multitasking cooperativ:** Se va utiliza functia millis() pentru a implementa "software timere". Acest algoritm permite procesorului sa citeasca senzorii, sa raporteze date prin Bluetooth si sa ajusteze PWM-ul motoarelor (aproape) simultan. | + | * **<SoftwareSerial.h>** - Libraria standard folosita pentru a crea un port serial virtual pe alti pini, necesara pentru comunicarea cu modulul Bluetooth HC-05. |
| - | * **Masina de Stari Finita (FSM):** Structura principala de control va fi un bloc switch-case ce defineste comportamentul robotului. Starile planificate includ: MERGE_FATA, DETECTARE_PERETE, INTOARCERE_90_GRADE_ST/DR, ALINIERE_ZIG_ZAG, OPRIRE_URGENTA_MARGINI si LOW_BATTERY. | + | * **"hc05_comm.hpp"** - Un fisier header propriu creat pentru a pastra functiile de trimitere si primire mesaje separat de fisierul principal ''main.cpp''. |
| - | * **Algoritm de acoperire:** Logica FSM va dicta un traseu de tip zig-zag. La detectarea unui obstacol frontal, robotul va verifica senzorii laterali pentru a alege directia corecta de viraj, alternand intoarcerile stanga-dreapta. | + | |
| - | ===== 4. Surse si functii implementate (Etapa 3) ===== | + | Nu am folosit librarii terte (gen NewPing) pentru senzorii ultrasonici tocmai pentru a putea controla manual timpii de asteptare si a preveni blocarea procesorului. |
| - | *(Sectiunea va fi completata cu fragmente de cod in momentul finalizarii dezvoltarii. Principalele functii planificate sunt:)* | + | |
| - | * void setup() si void loop() - structura de baza Arduino. | + | |
| - | * void readSensors() - responsabila de declansarea impulsurilor Trig si citirea duratei Echo, precum si citirea ADC pentru TCRT5000 si baterie. | + | |
| - | * void motorControl(int vitezaStanga, int vitezaDreapta) - o functie de abstractizare ce transpune cerintele de miscare in semnale PWM si stari logice pentru driverul L298N. | + | |
| - | * void updateFSM() - functia care proceseaza datele de la senzori si decide comutarea dintr-o stare in alta. | + | |
| - | ===== Rezultate Obţinute ===== | + | |
| - | <note tip> | + | ===== 3. Algoritmi si structuri de date ===== |
| - | To be determined. | + | |
| - | </note> | + | 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 ===== | ||