This shows you the differences between two versions of the page.
pm:prj2024:iotelea:robert.stoica2205 [2024/05/17 21:12] robert.stoica2205 [Software Design] |
pm:prj2024:iotelea:robert.stoica2205 [2024/05/26 15:49] (current) robert.stoica2205 [Final Product] |
||
---|---|---|---|
Line 9: | Line 9: | ||
Anemometrul este un aparat care masoara viteza vantului. Desi exista mai multe metode prin care aceasta masuratoare poate fi facuta, am ales sa folosesc senzori ultrasonici deoarece sunetul este o unda mecanica. Prin natura sa, sunetul are nevoie de un mediu de propagare, acesta influentand atat viteza cat si amplitudinea/frecventa undei sonore. Pornind de la aceasta idee, putem deduce usor faptul ca viteza sunetului depinde de viteza aerului ce poarta unda sonora, si deci, viteza vantului va avea un impact direct asupra timpului dintre o transmise si o receptie a unui semnal. | Anemometrul este un aparat care masoara viteza vantului. Desi exista mai multe metode prin care aceasta masuratoare poate fi facuta, am ales sa folosesc senzori ultrasonici deoarece sunetul este o unda mecanica. Prin natura sa, sunetul are nevoie de un mediu de propagare, acesta influentand atat viteza cat si amplitudinea/frecventa undei sonore. Pornind de la aceasta idee, putem deduce usor faptul ca viteza sunetului depinde de viteza aerului ce poarta unda sonora, si deci, viteza vantului va avea un impact direct asupra timpului dintre o transmise si o receptie a unui semnal. | ||
- | {{pm:prj2024:iotelea:anemometru1.drawio.png}} | + | {{pm:prj2024:iotelea:anemometru1.drawio.png?600}} |
In imaginea de mai sus, distanta parcursa de sunet va fi: $\frac{d}{\sin(\alpha)}$, iar viteza de propagare pe directia transmitator-receptor va fi $c + v \cos(\alpha)$, unde: | In imaginea de mai sus, distanta parcursa de sunet va fi: $\frac{d}{\sin(\alpha)}$, iar viteza de propagare pe directia transmitator-receptor va fi $c + v \cos(\alpha)$, unde: | ||
Line 28: | Line 28: | ||
Pentru cazul particular in care $\alpha = \pi / 2$, distanta parcursa de unda sonora va fi chiar $d$. | Pentru cazul particular in care $\alpha = \pi / 2$, distanta parcursa de unda sonora va fi chiar $d$. | ||
+ | |||
+ | Deoarece este complicat sa determinam exact momentul in care semnalul sonor este receptionat, o alta abordare ar fi sa asteptam un timp fix pentru a se stabiliza semnalul, dupa care sa retinem valoarea timerului la primul front crescator. Facand masuratoarea in ambele directii, putem afla diferenta de timp daca aceasta se incadreaza intr-o perioada a semnalului sonor. Prin aceasta simplificare a problemei, dispozitivul este limitat la o viteza maxima de aproximativ 13.5 m/s. | ||
+ | |||
+ | Pentru calcului acestei viteze, putem spune ca: | ||
+ | |||
+ | $\Delta t = d \left( \frac{1}{c - v} - \frac{1}{c + v} \right)$ deci vom ajunge la: | ||
+ | |||
+ | $v^2 + \frac{2 \cdot v \cdot d}{\Delta t} - c^2 = 0$ si putem considera $v^2 << \frac{2 \cdot v \cdot d}{\Delta t}$ ajungand la: | ||
+ | |||
+ | $v \approx \frac{c^2 \cdot \Delta t}{2 \cdot d}$ | ||
+ | |||
+ | pentru $\Delta t = 25 us$, $d = 11 cm$ si $c = 344 m/s$, viteza maxima va fi $v = 13.44 m/s$ | ||
==== Descriere Generala ==== | ==== Descriere Generala ==== | ||
Line 46: | Line 58: | ||
== Speakers & Transducers 400PT16M == | == Speakers & Transducers 400PT16M == | ||
- | {{pm:prj2024:iotelea:senzori.png?700}} | + | {{pm:prj2024:iotelea:senzori.png?600}} |
Acest sistem de diode si rezistente permite folosirea senzorului atat ca transmitator cat si ca receptor, conectand pe rand la GND unul din cei 2 pini ai sai. | Acest sistem de diode si rezistente permite folosirea senzorului atat ca transmitator cat si ca receptor, conectand pe rand la GND unul din cei 2 pini ai sai. | ||
== Interface IC Multichannel RS-232 MAX3222ECDWR == | == Interface IC Multichannel RS-232 MAX3222ECDWR == | ||
- | {{pm:prj2024:iotelea:dvr_amp.png?700}} | + | {{pm:prj2024:iotelea:dvr_amp.png?600}} |
Datorita condensatoarelor din partea stanga, aceste componente actioneaza ca niste amplificatoare de semnal, marind amplitudinea PWM-ului generat de microcontroller. | Datorita condensatoarelor din partea stanga, aceste componente actioneaza ca niste amplificatoare de semnal, marind amplitudinea PWM-ului generat de microcontroller. | ||
== Switch ICs Dual 4-Ch SN74LV4052ADR == | == Switch ICs Dual 4-Ch SN74LV4052ADR == | ||
- | {{pm:prj2024:iotelea:mux.png?700}} | + | {{pm:prj2024:iotelea:mux.png?600}} |
Multiplexorul joaca un rol esential in functionarea circuitului deoarece el selecteaza pe rand perechile de transmisie-receptie prin intermediul intrarilor A si B. | Multiplexorul joaca un rol esential in functionarea circuitului deoarece el selecteaza pe rand perechile de transmisie-receptie prin intermediul intrarilor A si B. | ||
== Operational Amplifiers MCP6487-E/SN == | == Operational Amplifiers MCP6487-E/SN == | ||
- | {{pm:prj2024:iotelea:ao.png?700}} | + | {{pm:prj2024:iotelea:ao.png?600}} |
Dupa ce semnlul sonor a fost primit, acesta va fi amplificat pentru a putea fi interpretat de microcontroller. | Dupa ce semnlul sonor a fost primit, acesta va fi amplificat pentru a putea fi interpretat de microcontroller. | ||
== Nucleo G431KB == | == Nucleo G431KB == | ||
- | {{pm:prj2024:iotelea:nucleog431.png?700}} | + | {{pm:prj2024:iotelea:nucleog431.png?600}} |
Rolul microcontrollerului este acela de a genera semnalul PWM, de a citi raspunsul analogic primit si de a contoriza timpul scurs intre transmisie si receptie. In plus, acesta serveste ca sursa de tensiune si intrare de EN pentru o parte din componente, el fiind responsabil si de selectarea intrarilor multiplexorului. | Rolul microcontrollerului este acela de a genera semnalul PWM, de a citi raspunsul analogic primit si de a contoriza timpul scurs intre transmisie si receptie. In plus, acesta serveste ca sursa de tensiune si intrare de EN pentru o parte din componente, el fiind responsabil si de selectarea intrarilor multiplexorului. | ||
Line 75: | Line 87: | ||
== Design == | == Design == | ||
- | {{pm:prj2024:iotelea:PCB.png?700}} | + | {{pm:prj2024:iotelea:PCB.png?600}} |
Pentru simplitate si eficienta sporita, pe spatele placutei este planul de masa, componentele fiind plasate doar pe partea de top. Pozitionarea componentelor a fost facuta astfel incat sa minimizeze numarul de via-uri, realizand legaturi cat mai scurte si predominant pe partea de top. In ceea ce priveste microcontrollerul, acesta va fi asezat pe conectori pentru a simplifica procesul de debugging. | Pentru simplitate si eficienta sporita, pe spatele placutei este planul de masa, componentele fiind plasate doar pe partea de top. Pozitionarea componentelor a fost facuta astfel incat sa minimizeze numarul de via-uri, realizand legaturi cat mai scurte si predominant pe partea de top. In ceea ce priveste microcontrollerul, acesta va fi asezat pe conectori pentru a simplifica procesul de debugging. | ||
Line 84: | Line 96: | ||
== Soldering == | == Soldering == | ||
- | {{pm:prj2024:iotelea:PCB_nou.jpeg?700}} | + | {{pm:prj2024:iotelea:PCB_nou.jpeg?600}} |
- | Procesul de lipire a fost unul simplu si rapid deoarece am utilizat flux si un stencil pentru a distribui pasta pe pad-uri. Componentele au fost asezate cu penseta dupa care placuta a fost pusa pe plita. Conectorii au fost lipiti separat. | + | Procesul de lipire a fost unul simplu si rapid deoarece am utilizat solder paste si un stencil pentru a distribui pasta pe pad-uri. Componentele au fost asezate cu penseta dupa care placuta a fost pusa pe plita. Conectorii au fost lipiti separat. |
- | Cand a fost testata placuta, am observat ca microcontrollerul se reseta continuu din cauza unei conexiuni gresite. Asa cum se poate observa si in schenam de mai sus a amplificatorului operational, acesta a fost alimentat invers. Pentru a rezolva aceasta greseala a fost necesara taierea traseelor de Vcc si GND, tragand 2 fire pentru a corecta eroarea. | + | Cand a fost testata placuta, am observat ca microcontrollerul se reseta continuu din cauza unei conexiuni gresite. Asa cum se poate observa si in schenam de mai sus a amplificatorului operational, acesta a fost alimentat invers. Pentru a rezolva aceasta problema a fost necesara taierea traseelor de Vcc si GND, tragand 2 fire pentru a corecta eroarea. |
==== Software Design ==== | ==== Software Design ==== | ||
---- | ---- | ||
Line 94: | Line 106: | ||
=== Descrierea Functionala === | === Descrierea Functionala === | ||
- | {{pm:prj2024:iotelea:code_flow3.drawio.png?700}} | + | {{pm:prj2024:iotelea:code_flow3.drawio.png?600}} |
== GPIO == | == GPIO == | ||
Primul pas este acela de a alege o pereche transmitator-receptor cu ajutorul intrarilor A si B ale multiplexoruiui. Acestea sunt conectate la 2 pini de GPIO ai microcnotrollerului (PB7 si PA11). Pentru partea de selectie, vom utiliza urmatorul tabel din datasheet-ul multiplexorului: | Primul pas este acela de a alege o pereche transmitator-receptor cu ajutorul intrarilor A si B ale multiplexoruiui. Acestea sunt conectate la 2 pini de GPIO ai microcnotrollerului (PB7 si PA11). Pentru partea de selectie, vom utiliza urmatorul tabel din datasheet-ul multiplexorului: | ||
- | {{pm:prj2024:iotelea:tabel_mux.png}} | + | {{pm:prj2024:iotelea:tabel_mux.png?600}} |
- | == Generarea Semnaluli Sonor == | + | == Generarea Semnalului Sonor == |
- | In continuare, timerul 4 va fi utilizat pentru a genera semnalul de PWM pe pinul PB6. Acest PWM va servi ca semnal sonor, avand o frecventa de 40kHZ. Pentru a obtine aceasta frecventa, timerul are ca sursa de ceas clock-ul intern al microcontrollerului (care ruleaza la o frecventa de 170MHZ), un prescaler de 0 si o perioada de 4250, avand un duty cycle de 50%. Pentru a genera un numar de 5 pulsuri, o intrerupere va avea loc de fiecare data cand timerul atinge valoarea 4250. In aceasta intrerupere va fi incrementat un contor. Cand contorul atinge valoarea 5, duty cycle-ul va fi pus pe 0%, oprind astfel transmisia. | + | In continuare, timerul 4 va fi utilizat pentru a genera semnalul de PWM pe pinul PB6. Acest PWM va servi ca semnal sonor, avand o frecventa de 40kHZ. Pentru a obtine aceasta frecventa, timerul are ca sursa de ceas clock-ul intern al microcontrollerului (care ruleaza la o frecventa de 170MHZ), un prescaler de 0 si o perioada de 4250, avand un duty cycle de 50%. Pentru a genera un numar de 20 pulsuri, o intrerupere va avea loc de fiecare data cand timerul atinge valoarea 4250. In aceasta intrerupere va fi incrementat un contor. Cand contorul atinge valoarea 20, duty cycle-ul va fi pus pe 0%, oprind astfel transmisia. |
== Masurarea Timpului Transmisie-Receptie == | == Masurarea Timpului Transmisie-Receptie == | ||
Line 113: | Line 125: | ||
Pentru etapa de testare am folosit doar 2 senzori (transmitator receptor) si am incercat sa micsorez cat mai mult erorile de timp generate la masuratori succesive in lipsa vantului. | Pentru etapa de testare am folosit doar 2 senzori (transmitator receptor) si am incercat sa micsorez cat mai mult erorile de timp generate la masuratori succesive in lipsa vantului. | ||
- | {{pm:prj2024:iotelea:testare.jpeg?700}} | + | {{pm:prj2024:iotelea:testare.jpeg?600}} |
- | Atat semnalul transmis cat si cel primit au fost afisate oe osciloscop/ | + | Atat semnalul transmis cat si cel primit au fost afisate oe osciloscop. |
+ | |||
+ | {{pm:prj2024:iotelea:osciloscop.jpeg?600}} | ||
- | {{pm:prj2024:iotelea:osciloscop.jpeg?700}} | ||
Semnalul mov este PWM-ul generat de microcontroler si amplificat inainte de transmisie. Semnalul galben este cel receptionat. Acesta este un semnal sinusoidal analogic care a fost trecut prin 2 amplificaoare operationale, rezultand un semnal digital. Se poate observa ca acesta creste treptat, si nu este constant la inceput, avand nevoie de o perioada pentru a se stabiliza. | Semnalul mov este PWM-ul generat de microcontroler si amplificat inainte de transmisie. Semnalul galben este cel receptionat. Acesta este un semnal sinusoidal analogic care a fost trecut prin 2 amplificaoare operationale, rezultand un semnal digital. Se poate observa ca acesta creste treptat, si nu este constant la inceput, avand nevoie de o perioada pentru a se stabiliza. | ||
+ | |||
+ | |||
+ | ==== Final Product ==== | ||
+ | ---- | ||
+ | |||
+ | === Suport === | ||
+ | |||
+ | Suportul pentru senzori a fost realizat din brate subtiri si inalte de lemn, pentru a nu modifica foarte mult vantul care trece printre acestea. Distanta dintre senzori este de 11cm. | ||
+ | |||
+ | {{pm:prj2024:iotelea:anemometru_final.jpeg?600}} | ||
+ | |||
+ | === Aplicatie === | ||
+ | Pentru a prelucra datele obtinute de la timer, am realizat o aplicatie in Python care are rolul de a interpreta valoarie si a le afisa. | ||
+ | |||
+ | Graficul este unul pe 2 axe, reprezentand viteza atat pe OX cat si pe OY. Acesta consta intr-un vector a carui lungime si orientare se schimba in functie de viteza vantului si directia din care bate acesta. Aplicatia citeste de la USB valorile timerului si calculeaza viteza, stocand valorile intr-un buffer de 100 de elemente. Pentru reprezentarea pe grafic am ales sa fac media acestor 100 de elemente pentru a obtine o eroare cat mai mica, fiind nevoie de o modificare vizibila pe termen lung pentru a se actualiza graficul. | ||
+ | |||
+ | |||
+ | === Calibrare === | ||
+ | Pentru procesul de calibrare am folosit un anemometru real si am masurat cu el viteza vantului generat de feonul meu pentru 2 trepte de viteza: | ||
+ | |||
+ | {{pm:prj2024:iotelea:anem2.jpeg?600}} | ||
+ | |||
+ | {{pm:prj2024:iotelea:anem1.jpeg?600}} | ||
+ | |||
+ | Dupa teste repetate am observat ca viteza inregistrata de anemometru tinde sa fie de 1.3 ori mai mare decat cea inregistrata de dispozitivul meu. Modificand valorilor calculate, rezultatele obtinute tind sa fie foarte apropiate de cele reale. | ||
+ | |||
+ | Un videoclip demonstrativ poate fi vazut [[https://drive.google.com/file/d/1mQSsCN8R6oDgNeSaw6AFfXIIetQnqaTP/view?|aici]]. | ||
+ | |||
+ | ==== Concluzii ==== | ||
+ | ---- | ||
+ | |||
+ | In concluzie, aparatul s-a dovedit a fi un succes, fiind capabil sa inregistreze cu acuratete ridicata viteze de pana la aproximativ 13.5 m/s. Planuiesc ca acesta sa fie imbunatatit pe viitor, folosind o modulatie in frecventa pentru a determina exact momentul receptionarii semnalului. In acest fel, nu am mai fi limitati la o singura perioada de 25us, putand masura cu precizie viteze mult mai mari. | ||
+ | |||
+ | |||
+ | ==== Resurse ==== | ||
+ | ---- | ||
+ | |||
+ | [[https://github.com/majianjia/QingStation/blob/main/doc/anemometer.md|Anemometer1]] | ||
+ | |||
+ | [[https://www.dl1glh.de/ultrasonic-anemometer.html#advancement|Anemometer2]] | ||
+ | |||
+ | [[https://www.st.com/en/microcontrollers-microprocessors/stm32g431kb.html|STM32]] | ||
+ | |||
+ | |||