Differences

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

Link to this comparison view

pm:prj2024:mdinica:bogdan.dumitrescu [2024/05/25 14:16]
bogdan.dumitrescu02
pm:prj2024:mdinica:bogdan.dumitrescu [2024/05/28 15:50] (current)
bogdan.dumitrescu02
Line 88: Line 88:
  
     <​h3><​strong>​Update -></​strong></​h3>​     <​h3><​strong>​Update -></​strong></​h3>​
 +    <i> Citeste partea software pentru varianta finala + software </i>
     <​p><​strong>​Arduino:</​strong></​p>​     <​p><​strong>​Arduino:</​strong></​p>​
     <ul>     <ul>
Line 123: Line 124:
     </p>     </p>
     <br/>     <br/>
-    <b> Pinii sunt alesi astfel incat protocolul folosit pe actuator/​senzor sa fie valid pentru fiecare. De exemplu, pentru rgb leds am ales pinii 10, 11, 12 care sunt pini PWM. Alti pini au fost alesi si aleator / am folosit pini analogici undeva unde puteau fi folositi pini digitali, dar nu am mai avut pini digitali pe placa, de exemplu, servomotorul este legat la un pin analog, in loc de un pin PWM, dar reuseste sa isi indeplineasca sarcina si asa </b>+    <b> Pinii sunt alesi astfel incat protocolul folosit pe actuator/​senzor sa fie valid pentru fiecare. De exemplu, pentru rgb leds am ales pinii 10, 11, 12 care sunt pini PWM. Alti pini au fost alesi si aleator / am folosit pini analogici undeva unde puteau fi folositi pini digitali, dar nu am mai avut pini digitali pe placa, de exemplu, servomotorul este legat la un pin analogic, in loc de un pin PWM, dar reuseste sa isi indeplineasca sarcina si asa </b>
  
     <div class="​table-container">​     <div class="​table-container">​
Line 148: Line 149:
         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Red)</​a></​td>​         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Red)</​a></​td>​
         <​td>​10</​td>​         <​td>​10</​td>​
-        <td>PWM</td>+        <td>GPIO</td>
     </tr>     </tr>
     <tr>     <tr>
         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Green)</​a></​td>​         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Green)</​a></​td>​
         <​td>​11</​td>​         <​td>​11</​td>​
-        <td>PWM</td>+        <td>GPIO</td>
     </tr>     </tr>
     <tr>     <tr>
         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Blue)</​a></​td>​         <​td><​a href="​https://​d.otto.de/​files/​4bdfa9e6-e985-5949-b2d7-b78059f9663b.pdf"​ target="​_blank">​RGB LED (Blue)</​a></​td>​
         <​td>​12</​td>​         <​td>​12</​td>​
-        <td>PWM</td>+        <td>GPIO</td>
     </tr>     </tr>
     <tr>     <tr>
Line 173: Line 174:
         <​td><​a href="​https://​www.kjell.com/​globalassets/​mediaassets/​701903_90770_datasheet_en.pdf"​ target="​_blank">​Servo Motor 360 Continuous</​a></​td>​         <​td><​a href="​https://​www.kjell.com/​globalassets/​mediaassets/​701903_90770_datasheet_en.pdf"​ target="​_blank">​Servo Motor 360 Continuous</​a></​td>​
         <​td>​A0</​td>​         <​td>​A0</​td>​
-        <td>PWM</td>+        <td>GPIO</td>
     </tr>     </tr>
     <tr>     <tr>
Line 386: Line 387:
     }     }
   }   }
- 
-    ​ 
     </​code></​pre>​     </​code></​pre>​
     ​     ​
Line 445: Line 444:
  
       Rutele pot fi impartite in doua tipuri, cele care comunica cu arduino, care tot ce fac este sa trimita un semnal prin serial a arduino, sau sa returneze daca exista semnale de la arduino, si rutele care tin de camera, /​capture ​ si /​live_video.<​br>​       Rutele pot fi impartite in doua tipuri, cele care comunica cu arduino, care tot ce fac este sa trimita un semnal prin serial a arduino, sau sa returneze daca exista semnale de la arduino, si rutele care tin de camera, /​capture ​ si /​live_video.<​br>​
-      Am ales ca protocol de comunicatie <b> HTTP </b>, deoarece este sateless, nu tine conexiunea pornita, ceea ce este perfect deoarece nu se fac apeluri atat de des la server si in teorie esp-ul ar consuma mai putina energie decat daca ar fi mereu conexiunea pornita penturu a astepta/​trimite mesaje. Am apelat totusi la o optiune de long polling pentru a astepta state-ul arduino-ului,​ deoarece <​b><​i>​ NU PUTEAM FACE</​i></​b>​ esp-ul accesibil in internet la PM fair, astfel aveam de ales intre doua optiuni, fie sa fie serverul extern hostat undeva si esp-ul sa trimita mesaje la acesta, iar acesta sa nu poata initia comunicarea cu esp-ul la pm fair, fie sa fie ambele conectate local, iar esp-ul sa nu poata accesa serverul localhost de pe calculator, deoarece au "​localhost"​ diferit ambele. Metoda eleganta era evident sa configurez port forwarding pe router si sa fac esp-ul accesibil in reteaua locala, iar serverului sa ii fac deploy, am reusit sa fac asta acasa(m-am chinuit sa hostez aplicatia de pe serverul extern pe azure), ca ulterior sa ma prind ca nu pot face asta la pm fair ;( <br>+      Am ales ca protocol de comunicatie <b> HTTP </b>, deoarece este sateless, nu tine conexiunea pornita, ceea ce este perfect deoarece nu se fac apeluri atat de des la server si in teorie esp-ul ar consuma mai putina energie decat daca ar fi mereu conexiunea pornita penturu a astepta/​trimite mesaje. Am apelat totusi la o optiune de long polling pentru a astepta state-ul arduino-ului,​ deoarece <​b><​i>​ NU PUTEAM FACE</​i></​b>​ esp-ul accesibil in internet la PM fair, astfel aveam de ales intre doua optiuni, fie sa fie serverul extern hostat undeva si esp-ul sa trimita mesaje la acesta, iar acesta sa nu poata initia comunicarea cu esp-ul la pm fair, fie sa fie ambele conectate local, iar esp-ul sa nu poata accesa serverul localhost de pe calculator, deoarece au "​localhost"​ diferit ambele. Metoda eleganta era evident sa configurez port forwarding pe router si sa fac esp-ul accesibil in reteaua locala, iar serverului sa ii fac deploy, am reusit sa fac asta acasa(m-am chinuit sa hostez aplicatia de pe serverul extern pe azure, creand un pipeline care sincronizeaza un director dintr-un repo de pe github cu unul de pe azure pentru deploy), ca ulterior sa ma prind ca nu pot folosi ​asta la pm fair ;(. Proof: 
 +     <​div style="​display:​ flex; justify-content:​ center; align-items:​ center;">​ 
 +    <img src="​https://​i.imgur.com/​pkQQ8ix.png"​ alt="​proof azure" width="​600px"​ height="​300px"/>​ 
 +</​div>​ 
 + 
 +       
 +      ​<br>
       Cele mai relevante de explicat sunt rutele de camera, deoarece celelalte sunt mesaje de <b> GET </b> sau un mesaj POST pentru ruta de change password, deoarece parola este trimisa printr-un mesaj POST, si trebuie facuta o parsare a body-ului pentru a obtine obiectul care contine parola efectiva, ulterior datele aceseta fiind trimise la arduino.<​br>​       Cele mai relevante de explicat sunt rutele de camera, deoarece celelalte sunt mesaje de <b> GET </b> sau un mesaj POST pentru ruta de change password, deoarece parola este trimisa printr-un mesaj POST, si trebuie facuta o parsare a body-ului pentru a obtine obiectul care contine parola efectiva, ulterior datele aceseta fiind trimise la arduino.<​br>​
       <​h5>/​capture</​h5>​ -> Imaginea este facuta si ulterior trimisa in chunk-uri, un mesaj http neputand include evident, toata imaginea, am incercat initial sa trimit mesajele in format base64 dar mereu am avut probleme la parase, ar fi trebui sa fie mai lightweight,​ dar fie dura prea mult conversia, fie nu se parsa imaginea corect<​br>​       <​h5>/​capture</​h5>​ -> Imaginea este facuta si ulterior trimisa in chunk-uri, un mesaj http neputand include evident, toata imaginea, am incercat initial sa trimit mesajele in format base64 dar mereu am avut probleme la parase, ar fi trebui sa fie mai lightweight,​ dar fie dura prea mult conversia, fie nu se parsa imaginea corect<​br>​
Line 478: Line 483:
     ​     ​
  
-    <​h2>​Rezultate Obţinute</​h2>​+    ​<!--<​h2>​Rezultate Obţinute</​h2>​
     <div class="​note tip">​     <div class="​note tip">​
         <​p>​Care au fost rezultatele obţinute în urma realizării proiectului vostru.</​p>​         <​p>​Care au fost rezultatele obţinute în urma realizării proiectului vostru.</​p>​
-    </​div>​+    </div> -->
     ​     ​
-    <h2OPTIMIZARI ​<h2>+    <h3Laboratoare folosite ​</h3> 
 +    - <​b>​Laboratorul 0 GPIO</​b>​ -> pentru senzorul ultrasonic, active buzzer si modulul RGB<​br>​ 
 +    - <​b>​Laboratorul 1 URAT</​b>​ -> pentru debug si comunicare ESP-ARDUINO<​br>​ 
 +    - <​b>​Laboratorul 3 PWM</​b>​ -> pentru micro servo <​br>​ 
 +    - <​b>​Laboratorul 6 I2C</​b>​ -> pentru modului Display cu I2C si comunicarea esp <-> camera<​br>
     ​     ​
 +    <h2> OPTIMIZARI <h2>
     <h5> Facute: </h5>     <h5> Facute: </h5>
-     - Dezactivare Bluetooth pe ESP deoarece nu il folosim +     - Dezactivare Bluetooth pe ESP deoarece nu il folosim ​<br> 
-     - Folosit http deoarece este stateless +     - Folosit http deoarece este stateless<br> 
-     - Folosit o rezolutie mai mica pentru video pentru a putea fi trimis datele mai fluid. +     - Folosit o rezolutie mai mica pentru video pentru a putea fi trimis datele mai fluid.<br> 
-     - Folosit cat mai putini senzori pe esp pentru a avea doar scopul de middleware intre serverul extern si arduino. +     - Folosit cat mai putini senzori pe esp pentru a avea doar scopul de middleware intre serverul extern si arduino.<br> 
-     - Arduino UNO intra in modul idle si se dezactiveaza toti senzorii mai putin senzorul ultrasonic daca nu este folosit +     - Arduino UNO intra in modul idle si se dezactiveaza toti senzorii mai putin senzorul ultrasonic daca nu este folosit<br> 
-     - Evit folosirea delay-urilor pentru a nu bloca interceptarea datelor de la alti senzori sau functionarea corecta a ledurilor si a buzzerului.+     - Evit folosirea delay-urilor pentru a nu bloca interceptarea datelor de la alti senzori sau functionarea corecta a ledurilor si a buzzerului.<br>
            
      <​h5>​ Incercate: </h5>      <​h5>​ Incercate: </h5>
-     - Am incercat sa pun placuta arduino in deep sleep(PWR_DOWN) si sa se activeze doar la primirea unui semnal de la senzorul ultrasonic, dar nu am reusit, de aceea am ales modul de idle, deoarece a fost singurul care functiona, chiar si cand incercam sa creez intreruperi doar pe pinul respectiv. +     - Am incercat sa pun placuta arduino in deep sleep(PWR_DOWN) si sa se activeze doar la primirea unui semnal de la senzorul ultrasonic, dar nu am reusit, de aceea am ales modul de idle, deoarece a fost singurul care functiona, chiar si cand incercam sa creez intreruperi doar pe pinul respectiv.<br> 
-     - Orice incercam pe esp32-cam, <b> NU </b> reuseam sa fac reconectarea la WiFi, nici nu are sens sa mai vorbesc de faptul ca nu functiona modul PWR_DOWN, deoarece nici macar o simpla reconectare la WiFi(WiFi-ul consumand foarte mult), am incercat orice functie de pe internet, conectare la mai multe access point-uri diferite, orice si nu reuseam, deci nu am reusit sa optimizez esp-ul din nefericire mai deloc. Foarte dezamagitor,​ avand in vedere ca prin modurile sale de sleep putea sa ajunga sa nu consume mai deloc curent(in deep sleep ~10uA)+     - Orice incercam pe esp32-cam, <b> NU </b> reuseam sa fac reconectarea la WiFi, nici nu are sens sa mai vorbesc de faptul ca nu functiona modul PWR_DOWN, deoarece nici macar o simpla reconectare la WiFi(WiFi-ul consumand foarte mult), am incercat orice functie de pe internet, conectare la mai multe access point-uri diferite, orice si nu reuseam, deci nu am reusit sa optimizez esp-ul din nefericire mai deloc. Foarte dezamagitor,​ avand in vedere ca prin modurile sale de sleep putea sa ajunga sa nu consume mai deloc curent(in deep sleep ~10uA)<​br>​ 
 + 
 +    <h3> Librarii folosite </​h3>​ 
 +    - LiquidCrystal_I2C -> deoarece folosesc display cu un modul I2C si libraria aceasta are toate metodele de care am nevoie.<​br>​ 
 +    - Servo -> librarie pentru servomotor, problema este ca aceasta este gandita pentru un servo, care nu este continuu, dar functiile acesteia pot fi folosite si pe un servo continuu, numai ca: servo.rotate(90),​ nu roteste la 90 de grade ca pe un servo normal, acesta de fapt opreste servo-ul, rotate(0) il roteste invers ceasului de ceasornic iar rotate(180) il roteste in sensul acelor de ceasornic.<​br>​ 
 +    - <​s>​Keypad></​s>​ -> nu am mai folosit keypad.h, deoarece am implementat eu functiile care tin de apasarea unei taste, dupa logica mea de debouncing + un feature care nu lasa tastatura sa scrie incontinuu pana nu ridici degetul de pe buton.<​br>​ 
 +    - ESPAsyncWebServer -> librarie pentru serverul http <​br>​ 
 +    - esp32-camera -> librarie pentru camera de pe esp32-cam<​br>​ 
 + 
 +    <h3> Calibrarea senzorilor </​h3>​ 
 +    Calibrarea fizica pe lcd-ul cu modul I2C, se face prin potentiometru,​ pana dispar patratele de pe ecran si pana se vad date pe ecran. <​br>​ 
 +    Calibrarea modului de sunet se face tot prin reglarea din potentiometru,​ ca sa i se seteze sensitivitatea.<​br>​ 
 +    Pe partea software, s-au setat pinii pentru fiecare prin digitalWrite(PIN,​ HIGH|LOW )<br>
  
     <​h2>​Concluzii</​h2>​     <​h2>​Concluzii</​h2>​
Line 501: Line 523:
     <p> Pot spune ca am invatat multe din acest proiect si doresc sa mentionez mai jos toate problemele de care m-am lovit </p>     <p> Pot spune ca am invatat multe din acest proiect si doresc sa mentionez mai jos toate problemele de care m-am lovit </p>
     ​     ​
-    -Debug-ul se face foarte greu pe un esp32-cam deoarece placuta trebuie montata si demontata mereu pentru fiecare update +    -Debug-ul se face foarte greu pe un esp32-cam deoarece placuta trebuie montata si demontata mereu pentru fiecare update<br> 
-    -Ar fi fost mult mai optim sa folosesc doua placute la fel(esp32) pentru a face o comunicare mai optima, nu doar ca aduce un plus de fire prin prezenta unui level shifter, dar am avut de multe ori surpriza ca datele sa nu se trimita corect, sau foarte intarziat. +    -Ar fi fost mult mai optim sa folosesc doua placute la fel(esp32) pentru a face o comunicare mai optima, nu doar ca aduce un plus de fire prin prezenta unui level shifter, dar am avut de multe ori surpriza ca datele sa nu se trimita corect, sau foarte intarziat.<br> 
-    -Pe langa folosirea a doua placute la fel, puteam sa nu folosesc deloc un arduino, deoarece dupa o analiza la pret si performanta(comparat cu un esp32-CAm sau orice tip de esp(chiar si 8266), arduino are un procesor foarte slab, foarte putina memorie ram si este prea mare, fara sens, comunicarea se face doar prin URAT, sau alta metoda pe care am incercat-o, comunicarea a doi senzori, foarte absurd, dar putea fi folosit un senzor de sunet si un buzzer unul langa altul pentru a trimite mesaje(insane dar functioneaza ;) ) +    -Pe langa folosirea a doua placute la fel, puteam sa nu folosesc deloc un arduino, deoarece dupa o analiza la pret si performanta(comparat cu un esp32-CAm sau orice tip de esp(chiar si 8266), arduino are un procesor foarte slab, foarte putina memorie ram si este prea mare, fara sens, comunicarea se face doar prin URAT, sau alta metoda pe care am incercat-o, comunicarea a doi senzori, foarte absurd, dar putea fi folosit un senzor de sunet si un buzzer unul langa altul pentru a trimite mesaje(insane dar functioneaza ;) )<br> 
-    -A fost greu sa flash-uiesc doua board-uri in paralel, deoarece imi trebuia un driver pentru a flash-ui esp32-CAM -CH340-, care odata ce detecta alta placuta in afara de esp32-cam, trebuia reinstalat si restart la laptop. +    -A fost greu sa flash-uiesc doua board-uri in paralel, deoarece imi trebuia un driver pentru a flash-ui esp32-CAM -CH340-, care odata ce detecta alta placuta in afara de esp32-cam, trebuia reinstalat si restart la laptop.<br> 
-    -Problemele mentionate cu sleep modes +    -Problemele mentionate cu sleep modes<br> 
-    -Am avut de multe ori surpriza ca esp-ul sa functioneze cand il tineam conectat la dev board dar sa nu mearga cand il conectam la bradboard PSU, totusi... mergea cand il conectam direct la bateria 9V, deci m-am prins dupa o zi ca problema era la breadboard PSU, de aceea acum il tin direct conectat la board-ul de development,​ chiar daca arata oribil, altcumva nu functioneaza,​ in plus, nereusing sa rezolv cu modurile de sleep, s-ar fi consumat foarte repede bateria(~6h) +    -Am avut de multe ori surpriza ca esp-ul sa functioneze cand il tineam conectat la dev board dar sa nu mearga cand il conectam la bradboard PSU, totusi... mergea cand il conectam direct la bateria 9V, deci m-am prins dupa o zi ca problema era la breadboard PSU, de aceea acum il tin direct conectat la board-ul de development,​ chiar daca arata oribil, altcumva nu functioneaza,​ in plus, nereusing sa rezolv cu modurile de sleep, s-ar fi consumat foarte repede bateria(~6h)<br> 
 +    -Am cumparat o antena pentru esp32-cam pentru a avea conexiune mai buna la interent, inital avea, dar dupa, nu se mai conecta la wifi din cauzaei, fara motiv(inca ceva timp de debug)<​br>​ 
 +     
 +    Concluzie -> Chiar daca a fost fun, si mi-am dat seama ca acum pot face multe proiecte care sa ma ajute in casa pentru diferite lucruri, programarea pe microprocesoare este grea nu doar pentru ca, in primul rand, trebuie folosit un limbaj cat mai low level(precum C/C++), deci trebuie sa te lupti cu problemele de memorie, dar intervin si problemele hardware, care, daca nu ai indeajuns de multa experienta, nu poti avea ideea de la ce provin. ​
  
     <​h2>​Download</​h2>​     <​h2>​Download</​h2>​
Line 525: Line 549:
         <​p>​Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe <​strong>​Resurse Software</​strong>​ şi <​strong>​Resurse Hardware</​strong>​.</​p>​         <​p>​Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe <​strong>​Resurse Software</​strong>​ şi <​strong>​Resurse Hardware</​strong>​.</​p>​
     </​div>​     </​div>​
---> + 
-    <​p><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​p>​+    <​p><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​p> -->
 </​body>​ </​body>​
 </​html>​ </​html>​
  
pm/prj2024/mdinica/bogdan.dumitrescu.1716635802.txt.gz · Last modified: 2024/05/25 14:16 by bogdan.dumitrescu02
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