This shows you the differences between two versions of the page.
|
pm:prj2026:jan.vaduva:liviu.stoica0709 [2026/05/07 22:21] liviu.stoica0709 rng |
pm:prj2026:jan.vaduva:liviu.stoica0709 [2026/05/21 21:35] (current) liviu.stoica0709 |
||
|---|---|---|---|
| Line 76: | Line 76: | ||
| După cum se observa din rezultatele de mai sus, niciun bit din cadrul senzorului de temperatură nu întrunește condițiile impuse. Datele acestuia vor fi utilizate ulterior, în cadrul formulei ce generează biți în mod aleator. În plus, se remarcă faptul că antena nu contribuie semnificativ. | După cum se observa din rezultatele de mai sus, niciun bit din cadrul senzorului de temperatură nu întrunește condițiile impuse. Datele acestuia vor fi utilizate ulterior, în cadrul formulei ce generează biți în mod aleator. În plus, se remarcă faptul că antena nu contribuie semnificativ. | ||
| + | |||
| + | === Formulă finală === | ||
| + | |||
| + | Pentru a avea niște biți și mai amestecați, aplic o transformare finala biților de la senzori. Aceasta se face în blocuri de câte 32 de biți și implică amestecarea cu o stare internă folosind XOR și rotirea biților obținuți. Seed-ul de la care pornește starea internă este obținut din datele senzorului de temperatură. | ||
| + | |||
| + | <code c> | ||
| + | more_rng = (rng_state * 1103515245UL + 12345UL); | ||
| + | rng_state ^= more_rng; | ||
| + | rng_state = (rng_state << 7) | (rng_state >> 25); | ||
| + | rng_state ^= sample; | ||
| + | </code> | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 88: | Line 99: | ||
| | Antenă | RNG | | | Antenă | RNG | | ||
| + | Schemă circuit: | ||
| + | |||
| + | {{pm:prj2026:jan.vaduva:schematic_liviu_stoica_v3.png?700}} | ||
| + | |||
| + | Conexiuni: | ||
| + | ^ Pin Placă ^ Componentă ^ Pin Componentă ^ | ||
| + | | PC0 (ADC0) | Potențiometru liniar | OTB | | ||
| + | | PC1 (ADC1) | Antenă | - | | ||
| + | | PC4 (SDA) | MPU6050 | SDA | | ||
| + | | PC5 (SCL) | MPU6050 | SCL | | ||
| + | | PB0 | ILI9341 | D/C | | ||
| + | | PB1 (OC1A) | Buzzer | - | | ||
| + | | PB3 (MOSI) | ILI9341 | MOSI | | ||
| + | | PB5 (SCK) | ILI9341 | SCK | | ||
| + | | PD7 | ILI9341 | RST | | ||
| + | |||
| + | Important de menționat este și faptul că au fost utilizate divizoare de tensiune pentru a lega display-ul de placă, deoarece display-ul are logică de 3,3V, iar placa de 5V. Ulterior, divizoarele de tensiune au fost înlocuite cu un convertor de nivel logic, pentru a evita aglomerarea inutilă a breadboard-ului cu componente. | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | |||
| + | Mediu de dezvoltare utilizat: PlatformIO | ||
| + | |||
| + | La pornire, software-ul populează buffer-ul circular cu biți de la senzori. În acest timp, pe ecran este afișat o bară de încărcare. După ce buffer-ul circular este plin, programul intră în bucla principală, unde citește inputul utilizatorului (de la potențiometrul liniar) și actualizează ecranul pentru joc. Jucătorul primește feedback audio de la buzzer când distruge inamici, când îi ratează și când pierde. În cazul în care jucătorul pierde, jocul revine la starea inițială. | ||
| + | |||
| + | ==== Biblioteci folosite ==== | ||
| + | |||
| + | În cadrul proiectului, am utilizat următoarele biblioteci: | ||
| + | * Adafruit GFX Library - funcții primitive pentru desenare | ||
| + | * Adafruit ILI9341 - driver specific necesar pentru controlarea display-ului | ||
| + | |||
| + | ==== Funcționalități din laborator ==== | ||
| + | * Timere, PWN pentru controlul buzzer-ului | ||
| + | * ADC pentru citirea inputului utilizatorului de la potențiometrul liniar, dar și pentru antenă | ||
| + | * I2C pentru interacțiunea cu MPU6050 | ||
| + | * SPI pentru interacțiunea cu Display-ul ILI9341 | ||
| + | |||
| + | ==== Calibrarea senzorilor ==== | ||
| + | Senzorii nu au necesitat calibrare, întrucât scopul proiectului nu era să obțină date exact de la senzori. Mult mai semnificativă este partea ce implică citirea repetată a senzorilor, pentru a obține niște biți cu valori pseudoaleatorii. | ||
| + | |||
| + | ==== Optimizări ==== | ||
| + | |||
| + | O optimizare făcută a constat în adăugarea unui strat suplimentar de RNG valorilor senzorilor. Am considerat că doar biții care se schimbă cel mai des de la senzori nu erau suficient pentru niște numere pseudoaleatoare. Astfel, peste biții de la senzori, am adăugat un generator liniar congruențial, inspirat din implementarea clasică a funcției rand() din biblioteca standard C. Valoarea generată de LCG este combinată prin XOR cu starea internă a generatorului, urmată de o rotație de biți, după care rezultatul este din nou mixat cu biți de la senzori. Acest proces ajută la producerea unui output mai impredictibil. | ||
| + | |||
| + | |||
| ===== Rezultate obținute ===== | ===== Rezultate obținute ===== | ||
| Line 97: | Line 150: | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| + | == 21 mai 2026 == | ||
| + | * am implementat jocul în sine | ||
| + | * am adăugat feedback audio de la buzzer | ||
| + | Demonstrație video: [[https://youtube.com/shorts/2qLgcASBYdY|Link YouTube]] | ||
| + | |||
| + | == 17 mai 2026 == | ||
| + | * am implementat formula finală pentru RNG | ||
| + | * am adăugat un loading bar pentru citirea senzorilor RNG | ||
| + | |||
| + | == 11 mai 2026 == | ||
| + | * am implementat citirea senzorilor pentru RNG | ||
| + | * am utilizat un buffer circular pentru salvarea biților buni de la senzori | ||
| + | * am ales o formulă finală pentru RNG | ||
| + | |||
| + | {{pm:prj2026:jan.vaduva:jurnal_1_liviu.jpeg?700}} | ||
| + | |||
| + | == 9 mai 2026 == | ||
| + | Am finalizat partea introductivă din cadrul documentației, dar și schema circuitului. | ||
| + | == 8 mai == | ||
| + | Am adăugat teoria de RNG în documentație și am evaluat datele primite de la senzori. | ||
| + | Am asamblat piesele, am testat componentele. | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| + | [[https://stackoverflow.com/questions/4768180/rand-implementation|Implementare rand]] | ||
| + | |||
| + | [[https://en.wikipedia.org/wiki/Linear_congruential_generator|LCG]] | ||
| + | [[https://filterpaper.github.io/prng.html|PRNG]] | ||