This shows you the differences between two versions of the page.
|
pm:prj2026:jan.vaduva:liviu.stoica0709 [2026/05/18 14:42] 127.0.0.1 external edit |
pm:prj2026:jan.vaduva:liviu.stoica0709 [2026/05/24 20:36] (current) liviu.stoica0709 [Rezultate obținute] |
||
|---|---|---|---|
| Line 2: | Line 2: | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| Proiectul constă într-un joc de tip space shooter destul de clasic, în care utilizatorul controlează o navă spațială și trebuie să distrugă/ocolească asteroizii generați aleatoriu. Un element de noutate notabil este reprezentat de utilizarea unui generator de numere pseudo-aleatoare bazat pe entropie hardware. Datele de la senzorul MPU6050 (temperatură, accelerație, viteză unghiulară) și zgomotul analogic obținut din ADC (de la o antenă) sunt utilizate ca surse de entropie. Acestea sunt combinate pentru a obține niște valori cât mai aleatoare. | Proiectul constă într-un joc de tip space shooter destul de clasic, în care utilizatorul controlează o navă spațială și trebuie să distrugă/ocolească asteroizii generați aleatoriu. Un element de noutate notabil este reprezentat de utilizarea unui generator de numere pseudo-aleatoare bazat pe entropie hardware. Datele de la senzorul MPU6050 (temperatură, accelerație, viteză unghiulară) și zgomotul analogic obținut din ADC (de la o antenă) sunt utilizate ca surse de entropie. Acestea sunt combinate pentru a obține niște valori cât mai aleatoare. | ||
| + | |||
| + | <note tip> | ||
| + | **Ipoteză** | ||
| + | |||
| + | Consider că RNG-ul hardware este inferior RNG-ului software bazat strict pe algoritmi matematici, deoarece nu are o garanție teoretică. | ||
| + | </note> | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| Line 8: | Line 14: | ||
| În schema de mai sus, se observă destul de ușor componentele principale ale proiectului. | În schema de mai sus, se observă destul de ușor componentele principale ale proiectului. | ||
| + | |||
| ===== RNG ===== | ===== RNG ===== | ||
| Line 101: | Line 108: | ||
| Schemă circuit: | Schemă circuit: | ||
| - | {{pm:prj2026:jan.vaduva:schematic_liviu_stoica_v3.png?700}} | + | {{pm:prj2026:jan.vaduva:pm_schema_el_liviu_div.png?700}} |
| + | |||
| + | După cum se poate observa din schema de mai sus, divizoarele de tensiune aduc destul de multe rezistențe pe breadboard. Având în vedere că montajul nu ar fi arătat prea curat, m-am hotărât să schimb divizoarele de tensiune cu un convertor de nivel logic. Astfel, am ajuns la schema finală de mai jos: | ||
| + | |||
| + | {{pm:prj2026:jan.vaduva:pm_schema_el_liviu_shift.png?700}} | ||
| Conexiuni: | Conexiuni: | ||
| Line 115: | Line 126: | ||
| | PD7 | ILI9341 | RST | | | 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. | + | 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 exacte 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 ===== | ||
| - | ===== Concluzii ===== | + | Ipoteza formulată în introducere este parțial validă. Comparând pozițiile inamicilor pe ecran, putem evalua vizual distribuția numerelor. Utilizând doar biții de la senzori, pozițiile inamiciilor se suprapun mai des decât în cadrul utilizării directe al unui generator de numere pseudoaleatoare pur software precum rand(). Totuși, combinarea fluxului de biți de la senzori, cu implementarea standard rand() din C rezolvă această problemă. Deci, RNG-ul hardware nu este mai slab comparativ cu RNG-ul software, dacă este combinat cu un strat software bine pus la punct. |
| + | |||
| + | ^ Rng din rand std lib C ^ Rng hardware + strat software ^ Doar rng hardware ^ | ||
| + | | {{pm:prj2026:jan.vaduva:rng_rand.jpeg?275}} | {{pm:prj2026:jan.vaduva:rng_hard_soft_liviu.jpeg?275}} | {{pm:prj2026:jan.vaduva:rng_hard_liviu.jpeg?275}} | | ||
| + | |||
| + | După cum se poate observa din tabelul de de mai sus, locațiile inamicilor generate utilizând rand din std lib C sunt distribuite într-o manieră similară cu locațiile inamicilor obținute din biții de la senzori la care se adaugă și un strat software. Doar biții de la senzori nu sunt suficient pentru niște valori suficient de variate pentru distribuirea //aleatorie// a inamicilor. | ||
| + | ===== Download ===== | ||
| + | Codul sursă se găsește pe [[https://github.com/liviu0709/RngInvaders|GitHub]]. | ||
| + | |||
| + | Același repository conține proiect platformIO utilizat pentru microprocesor, dar și un director entropyTest ce conține scriptul Python utilizat pentru citirea biților de la microprocesor și calcularea metricilor pentru RNG. | ||
| ===== 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 == | == 17 mai 2026 == | ||