Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:rnedelcu:matei.popescu1811 [2025/05/20 09:41]
matei.popescu1811 [Software Design]
pm:prj2025:rnedelcu:matei.popescu1811 [2025/05/28 03:29] (current)
matei.popescu1811 [Jurnal]
Line 11: Line 11:
 [Senzor audio (microfon)] → [Amplificator semnal audio] → [Microcontroler (Arduino Uno)] → [Algoritm detecție frecvență și amplitudine] → [Control motoare pentru orientare] [Senzor audio (microfon)] → [Amplificator semnal audio] → [Microcontroler (Arduino Uno)] → [Algoritm detecție frecvență și amplitudine] → [Control motoare pentru orientare]
  
-Utilizatorul poate sa emita un sunet pe orice frecventa, care av fi setata din CLI in robot. Acesta, dupa o apasare ​de buton va incepe o calibrare apoiva detecta directia din care vine sunetul. La apasarea altui buton se va duce in acea directie pana la intalnirea unui obstacol. La apasarea altui butonacesta ​se va intoarce in pozitia initiala.+Utilizatorul poate sa emita un sunet pe orice frecventa, care av fi setata din CLI in robot. Acesta, dupa trimiterea comenzii ​de start va incepe o rotire de 180 de grade pentru a identifica amplitudinea maxima pentru frecventa tinta. Apoipentru a detecta directia din care vine sunetul, recurge ​la o a doua rotire de 180 de grade in sens opus pentru a detecta diferentele de amplitudine cu un threshold mai mic de 30 astfel, detectand directia din care venea sunetul. La introducerea comenzii de exitserverul ​se va inchide si programul se va termina.
 </​note>​ </​note>​
  
Line 18: Line 18:
 <note tip> <note tip>
 Descriere module: Descriere module:
-  * Microfon unidirecțional:​ captează sunetele din fața robotului și reduce zgomotul de fundal din alte direcții+  * Microfon ​(MAX4466) ​unidirecțional ​(Handmade): captează sunetele din fața robotului și reduce zgomotul de fundal din alte direcții.
-  * Amplificator audio: crește nivelul semnalului de intrare pentru a putea fi procesat corect de ADC-ul microcontrolerului.+
   * Microcontroler (Arduino MEGA 2560): evaluează amplitudinea semnalului audio și controlează motoarele pentru orientarea robotului.   * Microcontroler (Arduino MEGA 2560): evaluează amplitudinea semnalului audio și controlează motoarele pentru orientarea robotului.
-  * Motoare DC.+  * Motoare DC (X2). 
 +  * Breadboard pentru montarea driverului de motoare L293D si pentru folosirea mai larga si mai flexibila a pinului de 3.3V (microfon + wifi module esp-10s) 
 +  * Modul WiFi ESP01-S 
 +  * Breadboard Power Supply Module pentru alimentarea la 5V a driverului pentru motoare
 </​note>​ </​note>​
 {{ :​pm:​prj2025:​rnedelcu:​whatsapp_image_2025-05-13_at_09.40.43.jpeg?​200 |}} {{ :​pm:​prj2025:​rnedelcu:​whatsapp_image_2025-05-13_at_09.40.43.jpeg?​200 |}}
Line 36: Line 38:
 * Algoritmi și structuri implementate:​ * Algoritmi și structuri implementate:​
  
-  * Algoritmul ​Goertzel: este implementat ​pentru ​analiza ​frecvenței dominante ​dintr-un ​semnal audioAcesta ​este eficient pentru identificarea unei anumite ​frecvențe într-un ​semnal ​digitalizat+  * Goertzel ​analizează semnalul audio de pe pinul analogic (microfon) și calculează „amplitudinea” (puterea) ​pentru ​fiecare ​frecvență dintr-un ​interval (ex: 200 Hz – 5000 Hz). 
- +    Cum funcționează practic: 
-  ​* ​Citirea semnalului audio: se face de pe pinul analogic A0, cu o frecvență de eșantionare de 9 kHz. Sunt colectate 256 de probe.+         Se colectează un set de mostre (samples) de la microfon. 
 +         ​Pentru fiecare frecvență de interes, se rulează Goertzel și se obține o valoare care arată cât de „puternică” ​este acea frecvență în  
 +         semnal. 
 +         Se determină care frecvență are cea mai mare amplitudine (frecvența dominantă). 
 +         ​Citirea semnalului audio: se face de pe pinul analogic A0, cu o frecvență de eșantionare de 9 kHz. Sunt colectate 256 de probe.
  
   * Comunicare serială:   * Comunicare serială:
- +     * Cum funcționează comunicarea Arduino – ESP-01S cu comenzi AT și UART 
-      ​1) ​Utilizatorul introduce ​frecvență țintă prin portul serial ​(UART). +          ​1. Rolul componentelor 
-      2Sistemul analizează semnalul audio și afișează frecvența dominantă detectată. +              Arduino este creierul sistemului: citește date de la senzori, controlează motoare și decide ce și când să comunice. 
-      3) Dacă frecvența dominantă coincide ​cu frecvența țintă, ​se semnalează faptul ​că a fost detectată.+              ESP-01S (ESP8266este modulul WiFi, folosit doar ca „modem” – el se ocupă de conectarea la rețea și de trimiterea/​primirea datelor  
 +              pe internet. 
 +    * Comunicarea între Arduino și ESP-01S se face prin UART (Serial1), adică două fire: TX și RX, plus GND comun. 
 +          2. Inițializarea și configurarea ESP-01S cu comenzi AT 
 +             La pornire, Arduino trimite ​serie de comenzi AT către ESP-01S pentru a-l configura:​ 
 +             a) Resetarea modulului ESP-01S 
 +                  Comandă: AT+RST 
 +                  Ce face: Resetează modulul ESP-01S, ca să fie sigur că pornește dintr-o stare curată. 
 +             b) Testarea comunicării 
 +                  Comandă: AT 
 +                  Ce face: Verifică dacă ESP-01S răspunde la comenzi. Dacă răspunde cu OK, comunicarea funcționează
 +             c) Oprirea echo-ului 
 +                  Comandă: ATE0 
 +                  Ce face: Dezactivează echo-ul, adică ESP-01S nu mai repetă fiecare comandă primită. Astfel, răspunsurile sunt mai clare. 
 +             d) Setarea modului de funcționare 
 +                  Comandă: AT+CWMODE=1 
 +                  Ce face: Pune ESP-01S în modul „stație” ​(client WiFi), ca să se poată conecta la o rețea wireless existentă
 +             eConectarea la rețeaua WiFi 
 +                  Comandă: AT+CWJAP="​SSID","​PAROLA"​ 
 +                  Ce face: Conectează ESP-01S la rețeaua WiFi cu numele ​și parola specificate. Dacă totul merge bine, răspunde cu WIFI GOT IP. 
 +          3. Conectarea la un server TCP (de exemplu, un PC cu Python) 
 +                 După ce ESP-01S este conectat la WiFi, Arduino îi spune să se conecteze la un server TCP (de obicei, un script Python care ascultă  
 +                 pe un anumit port): 
 +                 a) Inițierea conexiunii TCP 
 +                    Comandă: AT+CIPSTART="​TCP","​IP_SERVER",​PORT 
 +                    Ce face: Deschide o conexiune TCP către adresa IP și portul specificate. Dacă reușește, răspunde cu CONNECT. 
 +          4. Trimiterea datelor de la Arduino la server prin ESP-01S 
 +             Când Arduino vrea să trimită date către server (de exemplu, rezultatul analizei Goertzel), folosește două comenzi AT: 
 +                 a) Anunțarea lungimii mesajului 
 +                    Comandă: AT+CIPSEND=lungime 
 +                    Ce face: Spune ESP-ului că urmează să trimită un mesaj de o anumită lungime (număr de caractere)ESP răspunde cu > dacă e gata  
 +                    să primească datele. 
 +                 b) Trimiterea efectivă a datelor 
 +                    Comandă: (nu e o comandă AT, ci datele efective) 
 +                    Ce face: Arduino trimite textul dorit (ex: Dominanta: 700 Hz | Magn: 63.| TARGET GASIT!). ESP-01S îl transmite pe internet  
 +                    către serverul TCP. 
 +          5. Primirea comenzilor de la server (PC → ESP-01S → Arduino) Serverul (de exemplu, un script Python) poate trimite comenzi către Arduino  
 +             (ex: start, 700). Aceste comenzi ajung la ESP-01S prin rețea, iar ESP-01S le transmite pe UART către Arduino. Arduino citește aceste  
 +             ​comenzi ​cu Serial1.readStringUntil('​\n'​) și le interpretează:​ 
 +                 Dacă primește start, pornește scanarea. 
 +                 Dacă primește un număr, setează ​frecvența țintă
 +          6. Răspunsuri și gestionarea erorilor 
 +             ​Pentru fiecare comandă ATArduino așteaptă un răspuns specific (ex: OK, CONNECT, >, WIFI GOT IP). 
 +             Dacă nu primește răspunsul așteptat într-un anumit timp, consideră că a apărut o eroare și poate încerca din nou. 
 +             Dacă conexiunea WiFi sau TCP se pierde, Arduino încearcă periodic să se reconecteze. 
 +          7. Exemple de comenzi AT folosite și explicații 
 +| Comandă AT | Explicație | 
 +|------------------------------------|----------------------------------------------------------------------------| 
 +| AT | Testează dacă ESP-01S răspunde. | 
 +| AT+RST | Resetează modulul ESP-01S. | 
 +| ATE0 | Dezactivează echo-ul (nu mai repetă comenzile primite). | 
 +| AT+CWMODE=1 | Setează modulul în mod stație (client WiFi). | 
 +| AT+CWJAP="​SSID","​PAROLA"​ | Conectează la rețeaua WiFi cu numele și parola date. | 
 +| AT+CIPSTART="​TCP","​IP",​PORT | Deschide o conexiune TCP către IP și portul specificate. | 
 +| AT+CIPSEND=lungime | Pregătește ESP-01S să primească un mesaj de o anumită lungime. | 
 +| (date efective, ex: start\n) | Trimite datele efective către server, după ce primește promptul >. | 
 +8. Fluxul complet de comunicare 
 +Arduino pornește și configurează ESP-01S cu comenzi AT. 
 +ESP-01S se conectează la WiFi și apoi la serverul TCP. 
 +Arduino trimite date către server folosind AT+CIPSEND și apoi datele efective. 
 +Serverul poate trimite comenzi către Arduino (prin ESP-01S), care le interpretează și acționează în consecință.  
 +Dacă apare o eroare sau conexiunea se pierde, Arduino încearcă să refacă legătura                 
  
    * Controlul fluxului: logica programului se bazează pe o buclă principală (loop()), în care sunt alternate etapele de:    * Controlul fluxului: logica programului se bazează pe o buclă principală (loop()), în care sunt alternate etapele de:
Line 53: Line 120:
       ​       ​
 * Gasirea sursei sunetului: * Gasirea sursei sunetului:
-  1) Un program separat va performa o rotire de 360 de grade pentru a calcula timpul de rotire al robotului (t_rot) +  1) Verifică conexiunea la WiFi și la serverul TCP. 
-  2) Timpul va fi salvat in memoria EEPROM pentru a fi folosit in codul efectiv +  2) Dacă nu e conectat, încearcă periodic să se reconecteze. 
-  3) Dupa intriducerea frecventei ​de detectat, robotul va incepe sa faca o rotire completa in care va analiza frecventele dectate si amplitudinile lor +  3) Ascultă comenzi ​de la server (prin ESP-01S): 
-  4) In momentul detectarii frecventei tintava compara amplitudinea cu maximul curent si daca aceasta depaseste, va salva timpul de rotatie curent +  4) Dacă primește o frecvență (ex: 700)o setează ca țintă. 
-  5) Dupa efectuarea rotatieiva calcula diferenta ​de timp dintre timpoul din EEPROM ​(t_rotsi timoul salvat in timpul rotatiei de dectare+  5) Dacă primește startpornește secvența ​de scanare ​(activează modul SCANNING). 
-  6) Diferenta va fi timpul de rotatie pe care il va face pentru a se orienta spre sursa. +  6) Când este în modul SCANNING sau RETURNING și are o frecvență țintă
- +     aColectează mostre de la microfon. 
-* Funcții implementate+     b) Rulează Goertzel pentru fiecare ​frecvență din intervalul dorit
- +     cGăsește frecvența ​dominantă și amplitudinea maximă. 
-goertzel(samples[],​ numSamples, targetFreq, samplingRate+     d) Trimite rezultatul către server ​(ex: Dominanta: 700 Hz | Magn: 63.3 | TARGET GASIT!). 
-Calculează magnitudinea unei anumite ​frecvențe în semnalul audio, folosind algoritmul Goertzel+     e) Controlează motoarele pentru a roti sonar-ul: 
- +        i) În modul SCANNINGface pași de rotație (de obicei la dreapta)la fiecare pas colectând date. 
-setup() +        ii) După ce terminat toți pașii (ex: 36 pași pentru 180°), trece în modul RETURNING (revenire). 
-Inițializează comunicarea serială și solicită ​frecvența ​țintă de la utilizator+        iii) În modul RETURNING, continuă să rotească până când amplitudinea se apropie de maximul detectatapoi revine la IDLE (așteptare). 
- +        ​
-loop() +
-Execută logica principală: citește datecalculează frecvența dominantăcompară cu frecvența țintă, trimite rezultat prin UART.+
  
 +* Funcții principale implementate în cod
 +   1. setupMotors()
 +      Inițializează pinii folosiți pentru controlul motoarelor (direcție și enable).
 +      Pune toate motoarele în stare oprită la pornire.
 +   2. rotateRightStep()
 +      Activează ambele motoare pentru a roti sonar-ul spre dreapta (un motor înainte, celălalt înapoi).
 +      Folosește PWM (putere maximă) pe pinii de enable.
 +      După un delay (MOTOR_DELAY),​ oprește motoarele.
 +   3. stopMotors()
 +      Dezactivează toți pinii de control ai motoarelor și pinii de enable.
 +      Oprește complet mișcarea.
 +   4. sendATcommand(cmd,​ expectedResponse,​ timeout)
 +      Trimite o comandă AT către ESP-01S prin UART.
 +      Așteaptă un răspuns specific (expectedResponse) sau timeout.
 +      Returnează true dacă răspunsul a fost primit, false altfel.
 +      Folosit pentru toate etapele de configurare și trimitere date prin WiFi.
 +   5. sendATcommandNoReply(cmd,​ delayAfter)
 +      Trimite o comandă AT fără să aștepte un răspuns specific.
 +      Folosit pentru resetare sau golire buffer.
 +   6. connectWiFi()
 +      Rulează secvența de comenzi AT pentru a conecta ESP-01S la rețeaua WiFi.
 +      Setează variabila de stare espConnectedToWiFi.
 +   7. connectTCPServer()
 +      Trimite comenzi AT pentru a conecta ESP-01S la serverul TCP (PC/​Python).
 +      Setează variabila de stare espConnectedToServer.
 +   8. goertzel(samples,​ numSamples, targetFreq, samplingRate)
 +      Implementarea algoritmului Goertzel.
 +      Primește un vector de mostre și returnează amplitudinea pentru o frecvență dată.
 +      Folosit pentru a detecta frecvența dominantă în semnalul audio.
 +   9. readSamples()
 +      Citește un număr fix de mostre de la microfon (A0) la o frecvență de eșantionare stabilită.
 +      Populează vectorul samples pentru analiza Goertzel.
 +  10. setup()
 +      Inițializează comunicația serială, motoarele și ESP-01S.
 +      Forțează o primă încercare de conectare la WiFi și server la pornire.
 +  11. loop()
 +      Bucla principală:​
 +      Gestionează reconectarea la WiFi și server dacă e nevoie.
 +      Primește comenzi de la server (frecvență țintă, start).
 +      Dacă este în mod SCANNING sau RETURNING, citește mostre, rulează Goertzel pe un spectru de frecvențe, trimite rezultatul la server și 
 +      controlează mișcarea motoarelor.
  
 </​note>​ </​note>​
Line 77: Line 183:
  
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +Hardware-ul a fost cea mai "​tricky"​ parte deoarece microfonul folosit, de altfel un microfon ​ recomandat pentru proiecte ​cu Arduino, nu este suficient de performant. Impedanta necesara acestuia a fost neprevazuta,​ astfel nefunctionand optim fara ca acesta sa aibe o sursa puternica de impamantare cum ar fi osciloscopul folosit in teste (Hantek 2D42). Astfel pentru rezultate optime in analiza sunetuluiacesta trebuia sa fie in permananta conectat la osciloscop. Astfelmobilitatea robotului a fost drastic redusaInsain timp ce acesta era conectatatat izolarea fonica cu scopul ​de a face microfonul unidirectional,​ cat si algoritmul folosit oentru analizarea semnalelor a functionat fara probleme. Cu atat mai mult si comunicarea intre ESP si Arduino, desi complexa, a fost una reusita astfel obtinand si conectivitate prin WiFi (LANla un server TCP in python.
-</​note>​ +
- +
-===== Concluzii ===== +
- +
-===== Download ===== +
- +
-<note warning>​ +
-O arhivă (sau mai multe dacă este cazul) ​cu fişierele obţinute în urma realizării proiectului:​ surseschemeetcUn fişier READMEun ChangeLogun 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 Alin331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**.+Asadarproiectul a decurs asa cum trebuie, singura imperfectiune si piedica fiind neajunsul hardware al microfonului,​ in rest scopurile acestui proiect au fost atinse.
 </​note>​ </​note>​
  
-===== Jurnal ===== 
  
 +===== Concluzii =====
 <note tip> <note tip>
-Puteți avea și secțiune ​de jurnal în care să poată urmări asistentul ​de proiect progresul proiectului.+Analiza de sunete si semnale poate fi sarcina prea complexa pentru un ATMEGA, insa cu algoritmii si eficientizarile potrivite acestea se pot realiza. Comunicarea atat intrea deviceuri si WiFi a fost bine servita ​de comunicarea UART si AT. Intrearuperile ​de semnal au fost vitale in folosirea motoarelor DC pentru oprirea lor in puncte specifice dar si folosirea PWM a fost un punct principal in utlizarea acestora. 
 </​note>​ </​note>​
  
-===== Bibliografie/​Resurse ​=====+===== Download ​=====
  
-<​note>​ +<​note ​warning
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.+Video despre comunicare wifi din proiect: https://​youtube.com/​shorts/​hZ5QWcgfgBw?​si=eNvZWDUsbxx5RMFM 
 +Video despre problemele micrfonului:​ https://​youtube.com/​shorts/​dZWT_SvphCc?​si=yuMNT8lP_xU6A4pt
 </​note>​ </​note>​
  
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ 
  
pm/prj2025/rnedelcu/matei.popescu1811.1747723279.txt.gz · Last modified: 2025/05/20 09:41 by matei.popescu1811
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0