This is an old revision of the document!
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.
Pentru a stabili ce biți din datele de la senzori/antenă sunt ideale pentru RNG-ul meu, am efectuat niște experimente. Am citit datele de la senzori/antenă de câteva mii de ori și am calculat niște metrici de baza pentru RNG, precum entropie, autocorelație și runs.
Măsoară cât de echilibrat este un bit:
$$ H(X) = -p_0 \log_2(p_0) - p_1 \log_2(p_1), \quad \begin{cases} p_0 = P(X=0) \\ p_1 = P(X=1) \end{cases} $$
Măsoară cât de asemănător este un bit cu următorul bit din secvență.
$$ \mathrm{Autocorr} = \frac{\sum_{i=0}^{N-2} I(x_i = x_{i+1})}{N-1}, \quad I(x_i = x_{i+1}) = \begin{cases} 1, & x_i = x_{i+1} \\ 0, & x_i \neq x_{i+1} \end{cases} $$
Măsoară cât de des se schimbă secvența de 0 și 1.
$$ R = \frac{1 + \sum_{i=1}^{N-1} I(x_i \neq x_{i-1})}{N} $$
După analizarea acestor metrici, am ales să folosesc doar anumiți biți pentru RNG, ținând cont de criteriile de mai jos:
$$ H(X) > 0.98, \quad P(X=1) \in (0.45, 0.55), \quad \mathrm{Autocorr} \in (0.45, 0.55), \quad R \in (0.45, 0.55) $$
Interesant ar fi și faptul că restricția pe runs nu a micșorat și mai mult mulțimea biților cu rng bun, deci se poate considera că runs este redundant față de constrângerile deja impuse.
Biții aleși sunt:
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.
Listă componente principale:
| Componentă | Utilizare |
|---|---|
| AtMega328p Xplained Mini | Microcontroller |
| Buzzer | Feedback audio |
| ILI9341 | Display |
| Potențiometru liniar | Input utilizator |
| MPU6050 | Senzor - RNG |
| Antenă | RNG |
Schemă circuit:
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.
Am finalizat partea introductivă din cadrul documentației, dar și schema circuitului.
Am adăugat teoria de RNG în documentație și am evaluat datele primite de la senzori. Am asamblat piesele, am testat componentele.