Lepinzean Stefan - Dozator automat pentru bauturi
Introducere
Prezentarea pe scurt a proiectului vostru:
Folosind senzori de proximitate si de greutate, tot ce trebuie sa faca utilizatorul este sa puna paharul in zona indicata si dozatorul se va ocupa de umplerea lui fara sa trebuiasca orice alta interactiune cu aparatul. Desi dozatorul va avea un ecran LCD si butoane pentru a putea modifca setarile predefinite, odata alese utilizatorul nu mai trebuie sa interactioneze cu aceasta interfata, totul fiind automat. Folosind senzorii de proximitate, aparatul va aproxima inaltimea paharului, astfel incat pahare de diferite marimi pot fi folosite fara a fi nevoie ca setarile sa fie schimbate.
Ideea acestui proiect a pornit de la dozatoarele comerciale pentru bauturi. M-am gandit ca ar fi interesant sa realizez un aparat care in loc sa umple un pahar cu o cantitate finita de lichid, cantitatea lichidului sa fie proportionala cu marimea paharului (Ex. vreau un pahar pe jumatate plin) iar aceasta actiune sa fie realizata indiferent de cat de mare este paharul.
Descriere generală
Lista pieselor:
Microcontroller Robotlinking Uno 3 (Cardituino)
Ecran (LCD1602) - Pe ecran se vor afisa mesaje legate de starea actuala a dispozitivului sau setarile selectate.
Butoane - Impreuna cu ecranul vor forma interfata prin care utilizatorul schimba setarile dispozitivului.
Senzor ultrasonic (HC-SR04) - Va fi atasat deasupra zonei unde se pune paharul, pentru a putea masura nivelul lichidului.
Celula de sarcina de 1 kg + modul ADC (HX711) - Masoara greutatea paharului pentru a ne asigura ca este plasat corespunzator.
Bara senzori IR (QTR-MD-16A) + Multiplexor Analogic - Vom masura inaltimea paharului dupa cat de multi senzori IR sunt activati.
Pompa pentru lichid
Adaptor alimentare 12V
Hardware Design
Aici puneţi tot ce ţine de hardware design:
-
diagrame de semnal
rezultatele simulării
Schema electrica:
proiect_pm_v15.pdf
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: Arduino Uno R3
Componentele sunt conectate intre ele in modul urmator:
Senzorul ultrasonic este conectat la pinii PD3 si PB0, acesta avand nevoie doar de un pin de trigger si un pin care sa astepte semnalul de echo pentru a calcula diferenta de timp. Motivul pentru care folosesc PB0 pentru echo este ca acesta este pinul ICP1 (input capture pin), asa pot calcula cu acuratete mai mare distanta. Acesta este amplasat fix deasupra zonei unde va sta paharul pentru a putea masura nivelul lichidului din pahar.
Senzorul de greutate (celula de sarcina) este conectat mai intai la un ADC HX711 care transforma tensiunea foarte mica generata de celula intr-un semnal digital care este transmis intr-un mod serial pe pinul PD5 (PD4 va fi pinul care genereaza semnalul de ceas). Desi protoclul de comunicare este similar cu un fel de I2C, nu este la fel deoarece nu foloseste adresare…
Motorul este alimentat direct de la sursa de 12V. Pinul PD6 are rolul de a produce semnalul PWM care trece printr-un tranzistor N-MOS pentru a comanda motorul.
Bara de 16 senzori IR are toate iesirile conectate la un multiplexor analogic, iar pinii de CTRL EVEN/ODD sunt ambii conectati la pinul PB5 al microcontrolerului, astfel toti senzorii sunt activati si dezactivati simultan. Pinii PB[1:4] sunt folositi pentru a selecta ce senzor intra in multiplexor, iar semnalul analogic este transmis catre pinul PC0 pentru a fi convertit in ADC-ul intern.
Ecranul LCD1602 este conectat direct cu un modul care face conversia intre comunicarea paralela pe care o accepta ecranul ecranul in protocol I2C, acest modul este conectat la pinii PC4/PC5 care sunt designati pe microcontroler drept pinii SDA/SCL.
Cele 4 butoane sunt legate fiecare la un circuit RC separat cu scopul de a filtra bouncing-ul. Aici este list cu ce reprezinta fiecare buton:
Stop/Setting (conectat la pinul PD7) - are scopul general de a deschide meniul de setari pentru dozator, insa in timp ce un pahar este umplut, el poate fi folosit pentru a opri pompa.
Select (conectat la pinul PC1) - acest buton este folosit pentru a selecta valoarea curenta pentru a o putea modifica (de exemplu sa schimbi cat de plin vrei sa fie paharul).
Down/Up (conectati la pinul PC2 respectiv PC3) - folosite pentru a schimba valoarea curenta din setari.
Software Design
Descrierea codului aplicaţiei (firmware):
mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR)
librării şi surse 3rd-party (e.g. Procyon AVRlib)
algoritmi şi structuri pe care plănuiţi să le implementaţi
(etapa 3) surse şi funcţii implementate
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:
LiquidCrystal_I2C librarie folosita in arduino pentru a transmite comenzile LCD catre adaptorul I2C, desigur am modificat libraria ca sa functioneze pe AVR.
HX711 librarie pur AVR pentru comunicarea cu modulul ADC HX711.
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
Download
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.
proiectpm.zip
Jurnal
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
Am inceput proiectul cu aceste piese si cu un plan de atac pe jumatate gandit (dovada ca a trebuit sa schimb tranzistorul acela si rezistorii pentru ca nu incapeau pe pcb-ul final…).
Drept carcasa am gasit o cafetiera pe Altex si am distrus-o complet ca sa imi incapa toate componentele in ea. Am inceput cu partea de sus unde trebuiau puse butoanele si displayul LCD. am desprins capsula unde intra displayul original, au fost necesare modificari grele asupra ei intrucat displayul meu este dublu fata de cel gandit pentru aceasta cafetiera. Am scos toata electronica de era inauntru si am adaugat butoanele, lipite impreuna cu filtrele RC pe o placuta PCB de dezvoltare (pe care am luat-o la bomfaier ca sa incapa).
Apoi am inceput sa fac circuitul pentru pompa, care si acela a durat mai mult sa il fac decat as vrea sa recunosc…
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 asta m-am apucat sa lipesc totul inauntru carcasei… asa arata pe interior aparatul:
Bibliografie/Resurse
Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.
Pentru sursele bibliotecilor folosite, sunt trecute la rubrica Software.
Dataheeturi componente