Zar Electronic

Introducere

Proiectul are funcționalitățile unui zar cu un număr configurabil de fețe (4, 6, 8, 10, 12, 20). Random seed-ul este generat de un accelerometru, care măsoară deplasarea fizică a plăcuței.
Pentru afișarea numărului final, microprocesorul preia la un anumit moment de timp valoarea dată de accelerometru, iar pe baza acesteia calculează numărul care va fi afișat.

Ideea a pornit din necesitatea de a avea mai multe zaruri cu un număr variabil de fețe, pentru jocuri de tabletop RPG (Dungeons & Dragons, Starfinder, etc.). Astfel, acest zar oferă un element aleator aproape perfect, fără riscul unui “loaded die” (un zar care are centrul de greutate deplasat către o anumită fața, oferind probabilități inegale pentru fețe).

In plus, fiind de 20 de ori mai mare decât un zar normal, sunt șanse mult mai mici să-l pierd (ceea ce reprezintă, în opinia mea, principalul avantaj).

Descriere Generală

Microcontroller-ul va avea câteva butoane pentru selectarea numărului de fețe ale zarului N (4, 6, 8, 10, 12, 20) și încă o intrare pentru accelerometru. Ca ieșire, va afișa pe ecran un număr între 1 și N.

Modulele vor funcționa conform schemei:

Schema bloc

Din punct de vedere software, programul va funcționa ca un FSM, asemănător schemei următoare:

FSM Algoritm

Hardware Design

Lista de piese:

  • ATMEGA324
  • Modul Display Nokia 5110
  • Accelerometru ADXL345 (sau un modul asemănător)
  • Piese de bază, push-buttons, rezistențe, plăcuța PM 2019

Schema electrica (microcontroller & accelerometru):

Schema electrica

Software Design

1. Biblioteci

Am folosit 3 biblioteci:

  • nokia5110.h pentru interfațarea cu ecranul
  • adxl345.h pentru a culege date de la accelerometru
  • i2cmaster.h în mod indirect, folosită de adxl345.h pentru a comunica cu microcontrollerul

Acestea oferă funcții intuitive pentru inițializarea și transmisia/recepția de date:

  1. Ecranul Nokia:
    • nokia_lcd_init(void) - setări inițiale ale ecranului
    • nokia_lcd_set_cursor(int x, int y) - modifică cursorul pe ecran, unde va fi scris text
    • nokia_lcd_clear(void) - șterge bufferul ecranului și resetează cursorul
    • nokia_lcd_write_string(char* text, int size) - scrie în buffer-ul ecranului un string
    • nokia_lcd_write_char(char c, int size) - scrie în buffer-ul ecranului un caracter
    • nokia_lcd_render() - afișează bufferul ecranului
  2. Accelerometru ADXL345
    • adxl345_init(void) - setări inițiale ale accelerometrului
    • adxl345_getdata(int *ax, int *ay, int *az) - intoarce accelerația pe cele 3 axe

2. Workflow cod

În principal, folosesc următoarele notații:

  • _L, _C, _R cele 3 butoane de pe breadboard
  • modulo: numărul de fețe ale zarului
  • roll_time: câte secunde să dureze până se afișează rezultatul
  • state_list: starea în care se afla automatul

Programul are 3 părti esențiale:

  1. Interpret state: Se execută bucata de cod corespunzătoare stării curente
  switch(state) {
		case MENU: execute_menu();
		case ROLL: execute_roll();
		case FINAL: execute_final();
		case INIT: execute_init();
		case CHOOSE_DIE: execute_choose_die();
		case CHOOSE_TIME: execute_choose_time();
  }
  
  1. Execute_<state>: Funcția de execute a fiecărei stări
  2. switch_state: Logica de tranziție a stărilor. În principal, o stare se schimbă la apăsarea de buton. Singura excepție este trecerea din starea ROLL în starea FINAL. Exemplu pentru tranzițiile din starea MENU:
   if (state == MENU) {
	if (is_pressed(_C) && !button[_C]) {
		button[_C] = 1;
		state = ROLL;
	}
	if (is_pressed(_L) && !button[_L]) {
		button[_L] = 1;
		state = CHOOSE_TIME;
	}
	if (is_pressed(_R) && !button[_R]) {
		button[_R] = 1;
		state = CHOOSE_DIE;
	}
   }
   

Rezultate Obținute

În final, am obținut un prototip funcțional pentru un zar electronic, având numărul de fețe și timpul de așteptare configurabile. Există următoarele meniuri/stări:

  • Ecranul de început (cu nume, grupă)
  • Meniu principal
  • Meniu de configurare a timpului de așteptare a rezultatului
  • Meniu de configurare a numărului de fețe
  • Ecran final, cu rezultatul

Prin cele 3 butoane de pe breadboard se poate naviga între aceste meniuri.

Poze cu rezultatul final:

First screen Menu

Critical HIT Top view

Concluzii

All in all, am reușit să duc la bun sfârșit un proiect amuzant, la care mi-a făcut plăcere să lucrez. Am avut lucruri de învățat din el și mă bucur că l-am ales, iar acum mai rămâne doar să-l testez la D&D.

  • 5/7 Recomand
  • + 0.0 readme ok.

Download

Jurnal

Bibliografie/Resurse

pm/prj2019/amocanu/electr_die.txt · Last modified: 2021/04/14 17:07 (external edit)
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