This shows you the differences between two versions of the page.
|
pm:prj2026:vlad.radulescu2901:andreea.munteanu05 [2026/05/24 23:07] andreea.munteanu05 |
pm:prj2026:vlad.radulescu2901:andreea.munteanu05 [2026/05/25 20:25] (current) andreea.munteanu05 [Concluzii] |
||
|---|---|---|---|
| Line 86: | Line 86: | ||
| | ”ws2812.h” | adaptat după librăria Adafruit Neopixel| | | ”ws2812.h” | adaptat după librăria Adafruit Neopixel| | ||
| - | <note tip> | + | **Structura proiectului. Algoritmi și structuri folosite. Descrierea codului** |
| - | 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 | + | |
| - | </note> | + | |
| - | + | ||
| - | **Structura proiectului. Algoritmi și structuri folosite** | + | |
| * main.cpp: Conține majoritatea logicii proiectului, și bucla principală: | * main.cpp: Conține majoritatea logicii proiectului, și bucla principală: | ||
| - | * logica pentru pariuri, implementată independent de modalitatea hardware prin care se efectuează aceste pariuri: | + | * logica pentru jocul principal (bila care se rotește): compute_rotations, spin_leds_and_get_winner, etc |
| - | * enum-ul SymbolType (pentru simbolurile pariurilor) și structura BetSymbol (pentru reprezentarea abstractă a unui pariu) | + | * face trecerea între fazele jocului (welcome -> choose bets + insert coins -> spinning -> dispense coins / show failure message) |
| - | * reset_bets: pentru resetarea pariurilor între jocuri | + | * conține funcția pentru interpretarea valorilor citite de la senzorul de îndoire: flex_is_outside_range. Interpretarea este minimală, deoarece nu este nevoie de date foarte concrete în logica legată de senzorul de îndoire (este folosit doar ca modalitate de acționare on / off; cât de îndoit este mai exact e doar ceva orientativ). |
| - | * vector pentru memorearea numerelor pentru care s-a pariat | + | |
| - | * update_number, apply_symbol, is_black_number, count_selected_numbers, symbol_equal, find_symbol_index, etc: funcții ajutătoare pentru implementarea logicii pariurilor | + | |
| - | * adc + senzorul de îndoire | + | |
| - | * conține funcțiile adc pentru comunicarea cu senzorul: adc_init, adc_read | + | |
| - | * conține funcții pentru interpretarea valorilor citite de la senzorul de îndoire: flex_is_outside_range. Interpretarea este minimală, deoarece nu este nevoie de date foarte concrete în logica legată de senzorul de îndoire (este folosit doar ca modalitate de acționare on / off; cât de îndoit este mai exact e doar ceva orientativ). | + | |
| * poll-uri pentru liniile seriale | * poll-uri pentru liniile seriale | ||
| - | * funcții pentru logica lcd-ului: lcd_print_line, build_selection_line (linia cu ”SEL:” de pe ecran), build_line2 (cea cu pariul si banii introduși), update_lcd_selection, etc | ||
| - | * include funcții ajutătoare precum format_money | ||
| * logică de back-up pentru modalitatea de a efectua pariurile: citirea de la tastatură, pentru cazul în care se întâmplă ceva cu touch screen-ul :( | * logică de back-up pentru modalitatea de a efectua pariurile: citirea de la tastatură, pentru cazul în care se întâmplă ceva cu touch screen-ul :( | ||
| - | * funcții precum parse_symbol pentru interpretarea datelor de la tastatură, normalize_token | + | * funcții precum normalize_token pentru parsarea datelor de la tastatură |
| - | * touch screen-ul: funcții pentru pentru interacțiunea cu el: touch_map_symbol (face legatura dintre logica touch-ului și logica pariurilor), touch_in_rect (pentru detectarea zonei în care a fost atins ecranul), touch_poll (pentru detectarea atingerilor) | + | |
| - | * hopper-ul: funcții de bază pentru GPIO. hopper_on, hopper_off (acestea două teoretic interacționează cu releul), wait_for_level (asteapta sa primească de la hopper un semnal de monedă dispensată), dispense_coins | + | |
| - | * melodia: vectorii pentru The Entertainer (melody + note_durations), set_note, set_silence, start_melody, melody_tick, wait_with_melody (pentru sincronizare) | + | |
| - | * logica pentru jocul principal (bila care se rotește): compute_rotations, spin_leds_ang_get_winner, etc | + | |
| - | * acceptorul: logică adaptată după exemplul care a venit cu librăria importată. Conține acceptor_init, acceptor_sync_event_counter, acceptor_poll | + | |
| - | * main: face trecerea între fazele jocului (welcome -> choose bets + insert coins -> spinning -> dispense coins / show failure message) | + | |
| * lcd_i2c.c / lcd_i2c.h: Fișierul conține funcțiile pentru i2c. Tot aici se găsesc funcțiile pentru comunicarea prin i2c cu LCD-ul 16x2. Funcțiile accesibile din acest fișier sunt lcd_init, lcd_backlight_on, lcd_backlight_off, lcd_clear, lcd_set_cursor și lcd_print. Se folosește expander PCF8574. | * lcd_i2c.c / lcd_i2c.h: Fișierul conține funcțiile pentru i2c. Tot aici se găsesc funcțiile pentru comunicarea prin i2c cu LCD-ul 16x2. Funcțiile accesibile din acest fișier sunt lcd_init, lcd_backlight_on, lcd_backlight_off, lcd_clear, lcd_set_cursor și lcd_print. Se folosește expander PCF8574. | ||
| * uart.c / uart.h: Driver UART generic pentru USART0 (tastatură) / USART1 (acceptor) / USART2 (touch screen). Pune la dispoziție funcțiile uart_init, uart_available, uart_read, uart_write, folosite de altfel și în procesul de debugging. Toate primesc drept parametru baudrate-ul. | * uart.c / uart.h: Driver UART generic pentru USART0 (tastatură) / USART1 (acceptor) / USART2 (touch screen). Pune la dispoziție funcțiile uart_init, uart_available, uart_read, uart_write, folosite de altfel și în procesul de debugging. Toate primesc drept parametru baudrate-ul. | ||
| * timebase.c / timebase.h: Pentru funcția millis(). Conține funcțiile apelabile timebase_init si millis. | * timebase.c / timebase.h: Pentru funcția millis(). Conține funcțiile apelabile timebase_init si millis. | ||
| + | * acceptor.c / acceptor.h: Funcții pentru comunicarea cu acceptorul folosind protocolul ccTalk, adaptate din exemplele oferite pe https://cctalktutorial.wordpress.com/ , precum au fost și cctcom.cpp și cctcom.h. Conține acceptor_init, acceptor_sync_event_counter, acceptor_poll, cct_send_and_wait. | ||
| + | * adc.c / adc.h: Conține funcțiile de bază pentru adc: adc_init și adc_read. | ||
| + | * hopper.c / hopper.h: Conține funcții de bază pentru GPIO, și alte funcții legate de logica hopper-ului. hopper_on, hopper_off (acestea două teoretic interacționează cu releul), wait_for_level (asteapta sa primească de la hopper un semnal de monedă dispensată), dispense_coins. Logica dispensării monezilor e în hopper_run_payout + show_out_of_coins (se folosește de LCD). | ||
| + | * melody.c / melody.h: Vectorii pentru The Entertainer (melody + note_durations), set_note, set_silence, melody_start, melody_stop, melody_tick, wait_with_melody (pentru sincronizare), etc. | ||
| * pitches.h: Fișier pentru partea de muzică. Conține frecvențele sunetelor folosite, într-un range de 3 octave. | * pitches.h: Fișier pentru partea de muzică. Conține frecvențele sunetelor folosite, într-un range de 3 octave. | ||
| + | * pixels.c / pixels.h: Are funcțiile care se ocupă de întreg strip-ul de leduri. Funcțiile de aici se folosesc de cele din ws2812.h. Conține clear, init și set (pentru pixeli). | ||
| + | * touch.c / touch.h: Are funcții pentru pentru interacțiunea cu touch screen-ul: touch_map_symbol (face legatura dintre logica touch-ului și logica pariurilor), touch_in_rect (pentru detectarea zonei în care a fost atins ecranul), touch_poll_any și touch_poll_symbol (pentru detectarea atingerilor). Conține și partea de logică legată de detectarea tipului de pariu. | ||
| + | * ui.c: Conține funcțiile ce țin de interacțiunea cu omul prin LCD: lcd_print_line, show_new_bet_message, show_welcome_sequence. | ||
| + | * bets.c / bets.h: logica pentru pariuri, implementată aproximativ independent de modalitatea hardware prin care se efectuează aceste pariuri: | ||
| + | * enum-ul SymbolType (pentru simbolurile pariurilor) și structura BetSymbol (pentru reprezentarea abstractă a unui pariu) | ||
| + | * reset_bets: pentru resetarea pariurilor între jocuri | ||
| + | * vector pentru memorearea numerelor pentru care s-a pariat | ||
| + | * update_number, apply_symbol, is_black_number, count_selected_numbers, symbol_equal, find_symbol_index, etc: funcții ajutătoare pentru parsarea simbolurilor, detectarea numarului de numere pe care s-a pariat și care mai exact sunt acestea (logica principală din partea de pariuri) | ||
| + | * include funcții ajutătoare prentru integrarea LCD-ului, precum format_money, build_selection_line (linia cu ”SEL:” de pe ecran), bets_update_lcd_selection | ||
| + | * logică de back-up pentru modalitatea de a efectua pariurile de la tastatură: funcții precum parse_symbol pentru interpretarea datelor de la tastatură | ||
| + | |||
| + | Detalii suplimentare: Funcționalitatea proiectului a fost validată prin testări succesive pe parcursul implementării, și realizarea separată a codului pentru fiecare modul hardware în parte, urmată de testarea interacțiunii cu acesta înainte de integrarea codului în proiectul mare. Singurul senzor este cel de îndoire, și valorile între care operează acesta au fost detectate la începutul implementării printr-o bucată de cod separată (program individual) și apoi integrate în restul proiectului. Link video: https://drive.google.com/file/d/1YxeMvDDyLzt8izYvN4p_wdTzLu7mX2mg/view?usp=drive_link | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | + | Rezultatele obținute: o ruletă funcțională, poate puțin instabilă structural (din cauza touch screen-ului care trebuie proptit vertical), ce poate fi folosită pentru a juca codul de acasă. Nu e nevoie să fie conectată la laptop pentru a juca jocul, are sursă de alimentare externă așa că poate fi pur și simplu băgată în priză și folosită. |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | |
| - | ===== Concluzii ===== | + | Rezultat final: |
| - | ===== Download ===== | + | {{:pm:prj2026:vlad.radulescu2901:munteanu_andreea_fin1.jpeg?400|}} |
| - | <note warning> | + | Acceptor + dispensor: |
| - | 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**. | + | {{:pm:prj2026:vlad.radulescu2901:munteanu_andreea_fin3.jpeg?400|}} |
| - | </note> | + | |
| - | ===== Jurnal ===== | + | Senzor de îndoire: |
| - | <note tip> | + | {{:pm:prj2026:vlad.radulescu2901:munteanu_andreea_fin2.jpeg?400|}} |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | + | ===== Concluzii ===== |
| - | <note> | + | În concluzie, acest proiect a fost mult mai complicat decât mă așteptam să fie, în principal din punctul de vedere al codului (dar nici hardware-ul nu se lasă mult mai prejos). Altă concluzie ar fi că este o diferență foarte mare între ceva funcțional, ceva utilizabil și un joc care îți face plăcere să îl folosești. Aș spune că în momentul de față proiectul este funcțional, dar sunt multe alte feature-uri care mi-ar fi făcut plăcere să am timp să le adaug, precum mai multe sunete (melodie pentru lose, sunet de ping atunci cand se rotește luminița), o stare de idle în care să treacă aparatul atunci când nu e folosit mai mult timp la rând (cu o melodie de idle și eventual un dans pe care să îl facă ledurile), o modalitate de a forța norocul numerelor într-o direcție sau alta (cu mare părere de rău, nu am avut timp să fac asta, așa că aceasta este o ruletă onestă). Cu toate acestea, mi-a făcut plăcere să am în față un produs finit, funcțional. |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | ===== Download ===== |
| + | Codul: {{:pm:prj2026:vlad.radulescu2901:munteanu_andreea.zip|}} | ||
| + | |||
| + | |||
| + | ===== Bibliografie/Resurse ===== | ||
| + | Resurse Hardware: datasheet-urile componentelor folosite | ||
| + | * [[https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf | ATmega2560]] | ||
| + | * [[https://alberici.pl/wp-content/uploads/2022/06/Manual-ENG-AL55-66-coin-selectors.pdf | acceptor]] | ||
| + | * [[https://oem.suzohapp.com/wp-content/uploads/2019/07/10-18XX-XX_Manual_EN.pdf | dispensor]] | ||
| + | * [[https://www.mouser.in/datasheet/3/784/1/Flex_Sensor_Datasheet_v2019a.pdf | senzor de îndoire]] | ||
| + | Resurse Software: | ||
| + | * [[https://cctalktutorial.wordpress.com/ | CCTalkTutorial ]] | ||
| + | * librăria [[https://github.com/adafruit/Adafruit_NeoPixel/tree/master | AdafruitNeopixel]] pentru informații legate de modul de comunicare cu ledurile | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||