Automat de gustari

Introducere

Proiectul constă într-un automat de gustări interactiv, care permite utilizatorului să aleagă una dintre cele trei gustări disponibile, folosind un sistem cu butoane, LED-uri, servomotoare și un buzzer. Utilizatorul poate naviga manual prin opțiuni cu ajutorul unui buton de selecție, iar LED-urile indică vizual poziția curentă (albastru, verde sau roșu). La confirmarea comenzii, se declanșează o animație luminoasă, un semnal sonor din buzzer, iar servomotorul corespunzător deschide trapa pentru livrarea gustării.

Pe lângă selecția manuală, dispozitivul include și un al treilea buton pentru selecție aleatorie, care adaugă o componentă ludică sistemului. La apăsarea acestuia, una dintre gustări este aleasă în mod aleator și livrată instant, oferind un element de surpriză și amuzament.

Scopul proiectului este de a crea un sistem simplu, funcțional și intuitiv, care să ofere o experiență interactivă și plăcută în distribuirea gustărilor. Automatizarea parțială prin servomotoare adaugă un element practic și vizual, transformând un proces banal într-o activitate distractivă.

Proiectul poate fi utilizat în mediul casnic, la birou sau la evenimente, oferind o metodă inedită și simpatică de servire a gustărilor. Alegerea gustării devine astfel nu doar o acțiune utilitară, ci și un moment de interacțiune și divertisment.

Descriere generală

Dispozitivul este alcătuit din următoarele componente principale:

  • Arduino UNO: Reprezintă unitatea centrală de control a sistemului. Gestionează logica de selecție a gustării, controlează LED-urile, buzzerul și acționează servomotoarele pentru deschiderea trapei.
  • Servomotoare (SG90): Fiecare servomotor controlează o trapă individuală pentru o gustare. La confirmarea selecției, servomotorul se rotește 90°, deschide trapa și revine la poziția inițială.
  • LED-uri: Semnalizează vizual selecția curentă. Fiecare LED corespunde unei gustări, fiind aprins doar unul la un moment dat.
  • Buzzer: Emite semnale sonore pentru interacțiunile utilizatorului — un sunet lung la schimbarea selecției și două bipuri scurte la confirmarea gustării.
  • Butonul de selecție: Permite utilizatorului să navigheze ciclic prin cele trei opțiuni disponibile. La fiecare apăsare, selecția curentă se modifică, iar LED-ul activ se schimbă corespunzător.
  • Butonul de confirmare: Activează procesul de livrare. La apăsare, se redă o animație luminoasă, buzzerul bipăie și se deschide trapa corespunzătoare selecției.
  • Butonul de selecție aleatorie: Oferă utilizatorului opțiunea de a primi o gustare aleatorie. La apăsare, este selectat în mod aleator un servomotor, se execută secvența de deschidere a trapei și se redă animația de confirmare, indiferent de selecția curentă.

📊 Schema bloc a fost realizată în: Draw.io.

Hardware Design

Lista de piese:

Diagrama:

🛠️ Schema circuitului a fost realizată folosind Tinkercad.

Schemă electrică:

Conexiuni pini:

Pin Arduino Tip Conectat la Descriere
D2 Digital / INT0 Buton dreapta Confirmare selecție gustare. Folosește întrerupere externă INT0 cu debounce software.
D3 PWM software Servomotor 3 (SG90) PWM software generat manual. Deschide trapa pentru gustarea 3.
D5 Digital LED albastru Aprins când selecția este pe gustarea 1.
D6 Digital Buton stânga Navighează între cele 3 selecții (gustări). Folosește `INPUT_PULLUP` și polling.
D7 Digital Buzzer activ Bipuri scurte sau lungi în funcție de acțiune (confirmare sau schimbare selecție).
D8 Digital LED roșu Aprins când selecția este pe gustarea 3.
D9 (OC1A) PWM hardware Servomotor 1 (SG90) PWM generat de Timer1. Controlează trapa pentru gustarea 1.
D10 (OC1B) PWM hardware Servomotor 2 (SG90) PWM generat de Timer1. Controlează trapa pentru gustarea 2.
D12 Digital LED verde Aprins când selecția este pe gustarea 2.
D13 Digital Buton random Alege aleator o gustare și activează servomotorul corespunzător.
A0 Analog input Zgomot random (ADC) Valoare citită pentru seed-ul generatorului aleator (`srand(ADC)`).
GND Power Masă comună Conexiune de masă pentru toate componentele.
5V Power Servomotoare, LED-uri, buzzer Tensiune de alimentare distribuită prin breadboard pentru toate componentele de control.

Software Design

Laboratoare folosite

  • Laboratorul 0 – GPIO → Utilizat pentru configurarea LED-urilor ca ieșiri, butoanelor ca intrări cu pull-up intern, controlul buzzerului și generarea manuală de semnal PWM pentru servomotorul 3 (D3).
  • Laboratorul 1 – UART → Folosit pentru transmiterea mesajelor de debug prin printf() la 28800 baud.
  • Laboratorul 2 – Întreruperi → INT0 configurată pentru butonul dreapta, cu debounce software folosind systicks
  • Laboratorul 3 – Timere / PWM
    • Timer0 în mod CTC pentru incrementarea variabilei systicks la fiecare 1 ms.
    • Timer1 în mod Fast PWM – pentru control hardware al servomotorului 1 (D9 – OC1A) și servomotorului 2 (D10 – OC1B).

Implementarea logicii

Dispozitivul este alcătuit din următoarele componente principale:

Arduino UNO (ATmega328P): Reprezintă unitatea centrală de control. Gestionează stările de selecție, controlează LED-urile și buzzerul, și acționează cele 3 servomotoare pentru eliberarea gustărilor.

Servomotoare (SG90):

  • Servo 1 (D9) – este controlat prin PWM hardware (OC1A). La confirmarea selecției, se rotește pentru a deschide trapa 1 și apoi revine la poziția inițială.
  • Servo 2 (D10) – este controlat prin PWM hardware (OC1B).
  • Servo 3 (D3) - controlat software, cu semnal PWM generat manual prin PORTD și delay-uri precise.

LED-uri: Trei LED-uri semnalizează vizual selecția curentă. Fiecare LED corespunde unei gustări:

  • LED albastru – gustarea 1
  • LED verde – gustarea 2
  • LED roșu – gustarea 3

Doar un LED este activ la un moment dat, în funcție de selecție.

Buzzer: Emite semnale sonore pentru a confirma interacțiunile:

  • Două bipuri scurte – la confirmarea livrării unei gustări
  • Un bip lung – la schimbarea selecției

Butonul de selecție (D6): Permite navigarea ciclică prin cele trei gustări. La fiecare apăsare, starea curentă este incrementată, iar LED-ul activ se actualizează în consecință.

Butonul de confirmare (D2): Activează procesul de livrare. Este tratat printr-o întrerupere externă (INT0) cu debounce software. La apăsare, se declanșează:

  • semnal sonor
  • animație LED
  • acționarea servomotorului asociat gustării selectate

Butonul de selecție aleatorie (D13): Permite alegerea aleatorie a unei gustări. La apăsare, se generează un număr aleator între 0 și 2 și se acționează servomotorul corespunzător, fără a modifica selecția curentă sau LED-ul activ.

Funcții auxiliare:

  • `update_leds(state)` – aprinde LED-ul corespunzător stării active
  • `led_animation()` – animă LED-urile secvențial timp de 2 secunde
  • `beep_buzzer_short()` / `beep_buzzer_long()` – emit semnale sonore pentru confirmare sau notificare
  • `servo_set_angle(id, angle)` – controlează poziția fiecărui servomotor (0–180°)

Securitate software: Pentru a preveni declanșarea multiplă accidentală:

  • Se folosește debounce software în întreruperea de la butonul de confirmare (`INT0_vect`) cu ajutorul variabilei globale `systicks`.
  • Butoanele în polling (stânga și random) sunt verificate doar la apăsare nouă (rising edge logic), memorând starea anterioară.

Rezultate Obţinute

• Sistemul permite selecția clară a uneia dintre cele 3 gustări, semnalizată prin LED-uri colorate.

• Confirmarea comenzii declanșează animația LED, bipuri din buzzer și acționarea servomotorului.

• Selecția aleatorie funcționează corect, fără a afecta selecția curentă.

• Servomotoarele sunt controlate eficient: 2 prin PWM hardware, 1 prin PWM software.

• Interacțiunile sunt însoțite de feedback sonor și vizual.

• Sistemul este stabil și responsiv, cu debounce software și mesaje UART de debug.

Concluzii

Proiectul a reușit să integreze cu succes conceptele studiate în cadrul laboratoarelor, precum GPIO, PWM, întreruperi, UART și ADC, într-un sistem embedded funcțional, intuitiv și bine structurat. Programarea low-level, realizată fără librării externe, mi-a oferit control total asupra componentelor hardware și o înțelegere clară a modului în care acestea colaborează în timp real.

Sunt mulțumit că am reușit să implementez de la zero un automat de gustări complet funcțional, parcurgând toate etapele dezvoltării — de la schițarea logicii și testarea componentelor pe breadboard, până la integrarea finală, debugging și realizarea unei interfețe simple și prietenoase pentru utilizator.

A fost o experiență practică și formativă, care m-a ajutat să înțeleg mai profund modul în care se proiectează și se implementează un sistem embedded complet, cu aplicabilitate reală.

Bibliografie/Resurse

pm/prj2025/ajipa/teodor.lavric.txt · Last modified: 2025/05/29 23:02 by teodor.lavric
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