This shows you the differences between two versions of the page.
pm:prj2025:vstoica:stefan.lepinzean [2025/05/21 10:34] stefan.lepinzean |
pm:prj2025:vstoica:stefan.lepinzean [2025/05/27 23:26] (current) stefan.lepinzean [Rezultate Obţinute] |
||
---|---|---|---|
Line 34: | Line 34: | ||
Schema electrica: | Schema electrica: | ||
{{:pm:prj2025:vstoica:cd:stefan.lepinzean:proiect_pm_v15.pdf|}} | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:proiect_pm_v15.pdf|}} | ||
- | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:schema_proiect.png?500|}} | + | |
+ | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:schema_proiect.png?700|}} | ||
In schema respectiva am afisat cum sunt conectate componentele direct la pinii microcontrolerului Atmega328P din Arduino. Aceasta este schema completa a placutei Arduino, din care am folosit doar ilustratia microcontrolerului si a porturilor pentru jumpere: [[https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf|Arduino Uno R3]] | In schema respectiva am afisat cum sunt conectate componentele direct la pinii microcontrolerului Atmega328P din Arduino. Aceasta este schema completa a placutei Arduino, din care am folosit doar ilustratia microcontrolerului si a porturilor pentru jumpere: [[https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf|Arduino Uno R3]] | ||
Line 59: | Line 60: | ||
* (etapa 3) surse şi funcţii implementate | * (etapa 3) surse şi funcţii implementate | ||
</note> | </note> | ||
+ | |||
+ | * Am scris codul aplicatiei in libraria AVR, ca mediu de dezvoltare am folosit extensia Platformio din VSCode. | ||
+ | * Librarii/surse de inspiratie externe folosite in acest proiect: | ||
+ | * [[https://github.com/johnrickman/LiquidCrystal_I2C|LiquidCrystal_I2C]] librarie folosita in arduino pentru a transmite comenzile LCD catre adaptorul I2C, desigur am modificat libraria ca sa functioneze pe AVR. | ||
+ | * [[https://github.com/SKZ81/HX711|HX711]] librarie pur AVR pentru comunicarea cu modulul ADC HX711. | ||
+ | * [[https://www.electronicwings.com/avr-atmega/ultrasonic-module-hc-sr04-interfacing-with-atmega1632|HC-SR04]] am facut o functie similara cu cea descrisa de pe acest site pentru a comunica cu senzorul ultrasonic, desigur modificata pentru a merge cu microcontrolerul meu. | ||
+ | |||
+ | Flowul programului este urmatorul: | ||
+ | * Odata ce aparatul este alimentat la priza, microcontrolerul incepe rutina de initializare (functia init()). Aici incepe initializare tuturor registrelor si a perifericelor foliste. Timerul 0 este folosit pentru a transmite semnalul pwm catre pompa, timerul 1 este folosit pentru a inregistra durata semnalului (pinul ICP1) trimis de catre senzorul de distanta. ADC-ul intern este folosit pentru a citi semnalul de pe pinul PC0 transmis de catre banda de senzori IR. | ||
+ | * Dupa ce initializarea s-a terminat, aparatul intra intr-un loop repetitiv in care verifica daca senzorul de greutate simte un obiect sau daca au fost selectat butonul de setari. | ||
+ | * In caz ca au fost selectate setarile, aparatul intra in meniul de setari. Aici poate schimba cat de plin vrea sa fie paharul sau recalibra senzorii. | ||
+ | * Daca senzorul de greutate citeste o greutate destul de mare, aparatul intra in rutina de umplere a paharului. Pe ecran se afiseaza faptul ca un obiect a fost identificat in zona de umplere, apoi asteapta 3 secunde pentru ca utilizatorul sa aiba timp sa isi indeparteze mana. | ||
+ | * Dupa acest timp este pornita banda de senzori IR care aproximeaza inaltimea paharului. In caz ca inaltimea paharului nu poate fi masurata corect (fie nu a fost pus in zona corecta, fie senzorul este afectat de undele infrarosii din camera) un mesaj de eroare este transmis catre lcd, caz in care utilizatorul trebuie sa ridice paharul si sa mai incerce odata. | ||
+ | * Functia de citire a inaltimii functioneaza in modul urmator. Mai intai proneste banda de senzori IR apoi comuta multiplexorul pentru a citi pe rand fiecare senzor. odata ce toate valorile sunt inregistrate intr-un vector, se alega valoare de la senzorul numarul 5 (de jos in sus), acesta din testatile mele am observat sa transmita adesea cea mai amre valoare. Acest senzor este folosit ca referinta, daca valoarea transmisa de primii 4 senzori se afla sub nivelul de zgomot atunci citirea este considerata a fo eronata. In caz contrar se citesc toti senzorii peste 5 pana la primul senzor care intoarce o valoare mai mica decat jumatate din valoare transmisa de senzorul 5 (o valoare arbitrara obtinuta de mine tot dupa mai multe teste). | ||
+ | * Daca citirea este corecta se porneste senzorul ultrasonic pentru a aproxima distanta pana la fundul paharului, daca senzorul ultrasonic nu citeste corect distanta, paharul poate fi miscat putin pentru a incerca sa fie aliniat cu senzorul. | ||
+ | * Fiecare "citire" a senzorului ultrasonic este defapt un calup de 10 citiri consecutive (intrucat acuratetea senzorului este foarte proasta am decis sa calculez media a 10 citiri consecutive in incercarea disperata de a obtine o valoare stabilizata... rezultatul nu este perfect... in mare parte din cauza limitarii acestui senzor). Un semnal este transmis catre pinul de trigger dupa care este asteptat ca pinul echo sa intoarca inapoi durata de calatorie a undei ultrasonice. Aceasta durata esteinregistrata de catre timerul 1 si apoi calculata in distanta folosind frecventa ceasului impartita la viteza sunetului (Detalii amanuntite despre formula se gasesc in comentariile din cod). | ||
+ | * Urmatoarea etapa este pornirea pompei de apa, paharul este umplut cu lichid pana cand senzorul ultrasonic ajunge sa citeasca o distanta egala cu distanta initiala a paharului gol minsu inaltimea aproximativa a paharului (citita de banda IR) inmultita cu factorul de umplere. | ||
+ | * Odata ce paharul este umplut, utilizatorul este rugat sa indeparteze paharul iar dupa o asteptare de 5 secunde banda IR si celula de greutate sunt recalibrate (deoarece acesti senzori sunt destul de sensibili am optat sa ii recalibrez dupa fiecare rutina de umplere), dupa care programul se intoarce inapoi in loopul principal. | ||
+ | |||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | [[https://youtu.be/UZ_oGTI_lw4|Link YouTube]] |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | ||
===== Download ===== | ===== Download ===== | ||
Line 76: | Line 93: | ||
</note> | </note> | ||
+ | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:proiectpm.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 93: | Line 111: | ||
Apoi am inceput sa fac circuitul pentru pompa, care si acela a durat mai mult sa il fac decat as vrea sa recunosc... | Apoi am inceput sa fac circuitul pentru pompa, care si acela a durat mai mult sa il fac decat as vrea sa recunosc... | ||
- | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:pwmotor_circuit.jpeg?500|}} | + | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:circuit_pompa.jpeg?500|}} |
+ | |||
+ | In poza asta se poate vedea si carpitura de am facut-o ca sa tina celula de sarcina. Ea trebuie tinuta sub placa aceea rotunda de metal, pe care o sa stea paharul. Ca sa o fixez acolo m-am folosit de backplateul de la carcasa unui modul vechi de dvd player pentru masina. Am luat acea placa, care era prea mare sa incapa in aparatul meu asa ca am taiat-o cu bomfaierul. | ||
Dupa multe lipituri (si multe degete parlite) am inceput sa prind incredere in letcon si m-am apucat sa lipesc si resul senzorilor si sa ii conectez pe placuta de dezvoltare care face legatura cu Arduino (Tin sa atentionez ca poza de mai jos are impact puternic emotional daca aveti OCD, o sa ma pun mai tarziu sa aranjez toate firele sa arate uman). | Dupa multe lipituri (si multe degete parlite) am inceput sa prind incredere in letcon si m-am apucat sa lipesc si resul senzorilor si sa ii conectez pe placuta de dezvoltare care face legatura cu Arduino (Tin sa atentionez ca poza de mai jos are impact puternic emotional daca aveti OCD, o sa ma pun mai tarziu sa aranjez toate firele sa arate uman). | ||
- | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:senzorii_ir_montati.jpeg?400|}} | + | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:senzorii_ir_montati.jpeg?200|}} |
- | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:monstrul_de_fire.jpeg?400|}} | + | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:monstrul_de_fire.jpeg?200|}} |
+ | |||
+ | Dupa asta m-am apucat sa lipesc totul inauntru carcasei... asa arata pe interior aparatul: | ||
+ | |||
+ | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:bottomview.jpeg?200|}} | ||
+ | {{:pm:prj2025:vstoica:cd:stefan.lepinzean:topview.jpeg?200|}} | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
Line 105: | Line 131: | ||
</note> | </note> | ||
+ | Pentru sursele bibliotecilor folosite, sunt trecute la rubrica Software. | ||
+ | ==== Dataheeturi componente ==== | ||
+ | * [[https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf|HC-SR04]] | ||
+ | * [[https://www.pololu.com/product/4256|QTR-MDX-16A]] (Aceasta piesa nu are un datasheet oficial, chiar am cautat, doar informatiile de se gasesc pe pagina aceasta web) | ||
+ | * [[https://www.handsontec.com/dataspecs/module/I2C_1602_LCD.pdf|LCD-1602 cu interfata I2C]] | ||
+ | * [[https://www.handsontec.com/dataspecs/module/I2C_1602_LCD.pdf|Arduino Uno R3]] (Copia de chinezarie de o am eu nu are datasheet, pinoutul este totusi la fel. Am verificat si singura diferenta fata de original este in cateva integrate care probabil sunt de calitate mai proasta...) | ||
+ | * [[https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf|ADC HX711]] | ||
+ | * La pompa n-am datasheet, fiind o mizerie reciclata care cine stie pentru ce a fost folosita... Stiu ca motorul dinauntru functioneaza la 12V cu un consum de 400mA. | ||
+ | * [[https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf|Alimentator 12V]] (Nici la asta n-am gasit datashett neam, presupunand ca eticheta de pe el nu minte, se gasesc pe pagina de pe optimus specificatii) |