This shows you the differences between two versions of the page.
pm:prj2023:drtranca:vending.machine [2023/05/02 18:32] mdumitrascu1902 |
pm:prj2023:drtranca:vending.machine [2023/05/26 13:51] (current) mdumitrascu1902 [Software Design] |
||
---|---|---|---|
Line 1: | Line 1: | ||
======VENDING MACHINE====== | ======VENDING MACHINE====== | ||
===== Introducere ===== | ===== Introducere ===== | ||
- | + | <note tip> | |
- | Proiectul presupune construirea unui automat de vânzare automatizată a băuturilor răcoritoare.\\ Acesta dispune de o interfaţă cu utilizatorul alcătuită dintr-un ecran | + | Nume: Dumitrașcu Mihaela\\ |
+ | Grupa: 332AB | ||
+ | </note> | ||
+ | Proiectul presupune construirea unui automat de vânzare automatizată a băuturilor răcoritoare. Acesta dispune de o interfaţă cu utilizatorul alcătuită dintr-un ecran | ||
pe care sunt afişate opţiunile de produse. Selectarea băuturii dorite se face prin intermediul unei tastaturi. Plata va putea fi făcută asemănător plăţii cu cardul contactless. | pe care sunt afişate opţiunile de produse. Selectarea băuturii dorite se face prin intermediul unei tastaturi. Plata va putea fi făcută asemănător plăţii cu cardul contactless. | ||
+ | \\ | ||
+ | \\ | ||
Utilizatorul selectează băutura pe care o doreşte conform informaţiilor de pe ecran, după care efectuează plata cu cardul. În urma aprobării plăţii se activează | Utilizatorul selectează băutura pe care o doreşte conform informaţiilor de pe ecran, după care efectuează plata cu cardul. În urma aprobării plăţii se activează | ||
motorul corespunzător băuturii selectate; astfel, aceasta este împinsă spre tava de la baza automatului. În cazul în care clientul selectează o băutură care nu este în stoc | motorul corespunzător băuturii selectate; astfel, aceasta este împinsă spre tava de la baza automatului. În cazul în care clientul selectează o băutură care nu este în stoc | ||
- | sau are fonduri insuficiente pe card, este anunţat printr-un mesaj afişat pe LCD.\\ Pentru aprovizionarea automatului se apasă pe tasta 0, apoi se selectează băutura ce urmează | + | sau are fonduri insuficiente pe card, este anunţat printr-un mesaj afişat pe LCD.\\ |
+ | \\ | ||
+ | Pentru aprovizionarea automatului se apasă pe tasta 0, apoi se selectează băutura ce urmează | ||
a fi adăugată, iar motorul corespunzător se va roti în sens invers. La finalizarea aprovizionării se apasă din nou tasta 0 şi automatul este pregătit pentru un nou utilizator.\\ | a fi adăugată, iar motorul corespunzător se va roti în sens invers. La finalizarea aprovizionării se apasă din nou tasta 0 şi automatul este pregătit pentru un nou utilizator.\\ | ||
+ | \\ | ||
Am ales acest proiect deoarece am căutat o provocare în ceea ce privește partea hardware, motiv pentru care am folosit 2 microcontrollere ce comunică prin UART și am renunțat la | Am ales acest proiect deoarece am căutat o provocare în ceea ce privește partea hardware, motiv pentru care am folosit 2 microcontrollere ce comunică prin UART și am renunțat la | ||
- | placa Arduino Uno, realizând montajul pe o placuță de prototipare. În plus, având în vedere numărul mare de automate de acest tip care nu funcționează corect, mi s-a părut un | + | placa Arduino Uno, realizând montajul pe o plăcuță de prototipare. În plus, având în vedere numărul mare de automate de acest tip care nu funcționează corect, mi s-a părut un |
- | experiment bun să testez dacă pot face unul în care nu se blochează produsele și care nu generează eroare din cauza cititorului de carduri, deși cardul este valid. | + | experiment bun să testez dacă pot face unul în care nu se blochează produsele. |
===== Descriere generală ===== | ===== Descriere generală ===== | ||
Line 25: | Line 33: | ||
Listă de componente: | Listă de componente: | ||
- | * 4 motoare de curent continuu, cu reductor 1:70 care pun în mişcare 4 spirale ce au rolul de a împinge dozele de suc spre tava de unde clientul le poate ridica; de asemenea, când sensul de rotaţie al motoarelor se schimbă, acestea faciltează aprovizionarea tonomatului | + | * 4 motoare de curent continuu, cu reductor 1:70 care pun în mişcare 4 spirale ce au rolul de a împinge dozele de suc spre tava de unde clientul le poate ridica; de asemenea, când sensul de rotaţie al motoarelor se schimbă, acestea faciltează aprovizionarea automatului |
* o tastatură 4x4 pentru selectarea uneia din cele 4 băuturi, dar şi pentru activarea opţiunii de aprovizionare | * o tastatură 4x4 pentru selectarea uneia din cele 4 băuturi, dar şi pentru activarea opţiunii de aprovizionare | ||
- | * un LCD pe care sunt afişate opţiunile alături de numerele corepunzătoare (voi utiliza protocolul I2C pentru limita numărul de pini utilizaţi) | + | * un LCD pe care sunt afişate opţiunile alături de numerele corespunzătoare (voi utiliza protocolul I2C pentru a limita numărul de pini utilizați) |
- | * un RFID reader împreună cu un card pentru simularea plăţii contactless – posibil şi varianta de reîncărcare a cardului | + | * un RFID reader împreună cu un card pentru simularea plăţii contactless |
* 2 microcontrollere ATmega328P (varianta through-hole), întrucât unul singur nu ar fi avut suficienţi pini pentru a suporta toate componentele utilizate | * 2 microcontrollere ATmega328P (varianta through-hole), întrucât unul singur nu ar fi avut suficienţi pini pentru a suporta toate componentele utilizate | ||
* 2 cristale de cuarţ | * 2 cristale de cuarţ | ||
- | * plăci OSB/plexiglas | + | * polistiren + plexiglas + plăci de lemn pentru susținere |
* alimentator 12V ce se poate conecta la priză pentru alimentarea driverelor şi a microcontrollerelor | * alimentator 12V ce se poate conecta la priză pentru alimentarea driverelor şi a microcontrollerelor | ||
* 2 drivere pentru controlul motoarelor | * 2 drivere pentru controlul motoarelor | ||
* un level shifter pentru tastatură | * un level shifter pentru tastatură | ||
* componente adiţionale de protecţie: rezistenţe, diode, siguranţe (250mA, 1A) | * componente adiţionale de protecţie: rezistenţe, diode, siguranţe (250mA, 1A) | ||
- | * stabilizatoare de tensiune de 7V, 5V | + | * stabilizatoare de tensiune de 5V, 3V3 |
- | * amplificator operaţional în montaj de comparator | + | * sursă în comutație 12V -> 7V |
+ | * amplificator operațional în montaj de comparator | ||
Schema electrică\\ | Schema electrică\\ | ||
- | {{:pm:prj2023:drtranca:schema_electrica.pdf|}} | + | {{:pm:prj2023:drtranca:schema_electrica_vending_machine.pdf|}} |
Line 55: | Line 64: | ||
* Keypad.h - pentru tastatura | * Keypad.h - pentru tastatura | ||
Surse şi funcţii implementate:\\ | Surse şi funcţii implementate:\\ | ||
- | La unul dintre microcontrollere sunt conectate LCD-ul, RFID Reader-ul și tastatura. Logica este implementată într-un switch case în funcție de tasta apăsată, deoarece fiecare determină altă acțiune în continuare. Mesajele ce sunt afișate pe LCD sunt structurate în funcții, apelându-se cea potrivită pentru fiecare scenariu de funcționare în parte. | + | La unul dintre microcontrollere sunt conectate LCD-ul, RFID Reader-ul și tastatura. Logica este implementată într-un switch case în funcție de tasta apăsată, deoarece fiecare determină altă acțiune în continuare.\\ |
- | Pentru microcontroller-ul ce controlează motoarele, întreaga logică este bazată pe un switch case bazat pe mesajul primit prin UART de la celălalt microcontroller. Din mesajele transmise se poate determina atât motorul ce trebuie acționat, cât și sensul lui de rotație. Tot aici am implementat rutinele de tratare ale întreruperilor provenite de la buton și de la senzorul (fotorezistența) care semnalează căderea dozei. | + | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:switch_case_uc1.png?nolink&800x400 |}} |
+ | * Mesajele ce sunt afișate pe LCD sunt structurate în funcții, apelându-se cea potrivită pentru fiecare scenariu de funcționare în parte (void LCDPrintChoices(), void LCDPrintChoiceError(), void LCDReset(), void LCDPrintNotEnoughMoney()).\\ | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_functie_afisare.png?nolink&600x300 |}}\\ | ||
+ | Instrucțiunile afișate sunt diferite în funcție de scenariul de funcționare (de exemplu, refill activat sau nu ^) | ||
+ | * Citirea și verificarea cardului prin modulul RFID se fac într-o funcție separată (bool validateCard()).\\ | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_citire_card.png?nolink&700x300 |}}\\ | ||
+ | Pentru validarea cardului ^ se verifică dacă a fost apropiat în maxim 10 secunde, dacă se poate citi. \\ | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_validare_card.png?nolink&400x100 |}} \\ | ||
+ | Dacă verificările menționate anterior sunt trecute se citește ID-ul și se compară cu singurul ID care permite continuarea funcționării ^. | ||
+ | * Trimiterea informațiilor despre motorul care trebuie să fie pus în mișcare și sensul lui de rotație, cât și actualizarea datelor precum stocul sau soldul de pe card se realizează printr-o funcție dedicată (void chooseAction(byte messageVend, byte messageRefill, int s, int p)) \\ | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_trimitere_mesaj_seriala.png?nolink&700x300 |}} \\ | ||
+ | În funcție de scenariul de funcționare, selectat anterior prin apăsarea sau nu a tastei 0, fie se transmite mesaj de refill, fie de vend către celălalt microcontroller, actualizându-se stocul de fiecare dată. | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_validare_plata.png?nolink&500x300 |}}\\ | ||
+ | Dacă se livrează băutura se verifică soldul și dacă plata a putut fi efectuată ^. | ||
+ | \\ | ||
+ | Pentru microcontroller-ul ce controlează motoarele, întreaga logică este bazată pe un switch case în funcție de mesajul primit prin UART de la celălalt microcontroller (prin funcția chooseAction menționată mai sus). \\ | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:switch_case_uc2.png?nolink&800x400 |}} | ||
+ | Se verifică dacă pe serială s-a primit un mesaj, iar dacă da, în funcție de acesta este apelată funcția void defineRotation(byte highTerminal, byte lowTerminal) cu anumiți parametri astfel încât să se activeze motorul potrivit în sensul de rotație corespunzător. | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_activare_rotatie.png?nolink&700x100 |}} | ||
+ | * Tot aici am implementat rutinele de tratare ale întreruperilor provenite de la buton și de la senzorul (fotorezistența) care semnalează căderea dozei. | ||
+ | {{ :pm:prj2023:drtranca:pm:prj2023:cb:dumitrascu_mihaela:exemplu_rutina_intrerupere.png?nolink&600x200 |}} | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | In episoadele viitoare ;-) | + | Rezultatele obținute sunt foarte bune, întrucât am reușit să implementez toate funcționalitățile enunțate inițial și, în urma testelor făcute, pot spune că cea mai mare provocare, anume să nu se mai blocheze produsele în interior mai ales după ce plata a fost făcută, a fost depășită. |
===== Concluzii ===== | ===== Concluzii ===== | ||
- | In episoadele viitoare ;-) | + | Automatul funcționează conform target-urilor setate inițial. Totuși, există și câteva îmbunătățiri ulterioare pe care le-aș putea aduce, precum:\\ |
+ | * constuirea unei platforme care se deplasează pe 2 axe cu rolul de a ajunge în dreptul produsului selectat pentru a-l aduce la tava de colectare, evitând astfel ca acesta să rămână blocat în produse care se află mai jos | ||
+ | * aprinderea luminii care cade pe fotorezistența ce determină oprirea motoarelor doar după efectuarea plății pentru a reduce din consumul energetic\\ | ||
+ | * implementarea opțiunii de încărcare cu puncte a unui card de fidelitate și achitarea produselor cu acestea | ||
===== Download ===== | ===== Download ===== | ||
- | In episoadele viitoare ;-) | + | {{:pm:prj2023:drtranca:resurse_dumitrascumihaela_332ab.zip|}} |