Schema con Microcontrollore per Generare Numeri Random Casuali e non Pseudo Random come quelli Generati dalle librerie…
INTRO
Il seguente schema sfrutta un microcontrollore PIC18 per illustrare come è possibile generare numeri random, però lo stesso principio usato in questo schema può essere usato per altri microcontrollori sempre della famiglia PIC oppure Arduino e ATMEGA o altri.
Per la generazione di numeri random esistono molte librerie, ma se ci fate caso i numeri generati da queste librerie sono chiamati pseudo random, ovvero sembrano casuali ma non lo sono, vengono generati da una lista di numeri o con un algoritmo, quindi può succedere che vi siano sequenze simili di numeri o che si ripetano intere sequenze ad ogni accensione.
In elettronica un segnale random, non prevedibile è il rumore; il rumore può essere di vari tipi (rumore bianco, rumore rosa, rumore termico oppure gaussiano) è ha come caratteristica quella di avere una banda ben definita (ovvero vi saranno un certo numero di componenti frequenziali note a priori) però ha un andamento nel tempo imprevedibile.
Questo schema sfrutta un generatore di rumore rosa e il convertitore ADC del microcontrollore per generare numeri realmente random, questo perché vado a campionare ad istanti prefissati o no un segnale che è casuale, quindi acquisisco valori che non seguono una legge precisa e cambiano o no in continuazione.
CODICE
Il codice è molto semplice ed è il seguente:
short random1; //Variabile che contiene il valore
int random(){ //Sottofunzione creazione numero random
int random; //Inizializza una variabile
random = ADC_Read(1); //Leggi ADC
random -= 1024; //porta a 0 il livello medio
random = random & 0x0000011111; //Mantieni solo 5 bit
random = abs(random); //numero random tt positivi
return random; //ritorna il valore random
}
void main() { //Programma principale
ADC_Init(); //Inizializza ADC
TRISB = 0; //Portb uscite
while(1){ //Ciclo infinito
random1 = random(); //Richiama la funzione random
PORTB = random1; //valore random in uscita
Delay_ms(1000);
}
}
Si inizializza prima di tutto una variabile per contenere il valore random, poi una funzione che lo genera. Questa funzione legge il valore dall’ADC, quindi legge il valore del segnale di rumore e poi sottrae metà valore massimo dell’ADC per una questione che illustrerò nello schema. Infine viene trasformato il risultato da un numero a 10bit ad un numero a 5bit e vengono resi positivi tutti i valori (visto che il -1024 potrebbe aver creato valori negativi).
Nel programma principale si va a porre in uscita il numero random sulle PORTB e poi si attente 1 secondo in modo tale da avere un numero random ogni secondo.
SCHEMA
Lo schema del generatore di rumore rosa con componente DC di valore VCC/2 (ovvero 2.5v se l’alimentazione è 5V) è il seguente:
Il circuito è composto da Q1, Q2, R1, R2 e C1 che generano un rumore bianco, ovvero un segnale sempre casuale ma con una banda maggiore, ovvero a frequenza maggiore. C2 ed R4 formano un filtro passa alto che blocca la componente Dc del primo stadio.
Il resto del circuito è un filtro passa basso ed è composto da R5 che in realtà è un resistore di polarizzazione, R6, R7, R8, R3, C3, C4, C5 e Q3 formano invece un filtro attivo a transistor in modo tale da ridurre la banda del rumore bianco e trasformarlo in rumore rosa. Infine C6 blocca la componente continua ed R9 e R10 aggiungono una componente continua perfettamente a VCC/2 ovvero 2.5V.
Considerando che il convertitore convertirà il valore VCC/2 con il valore 1024 ecco spiegata la sottrazione di questo valore nel codice.
Lo schema del microcontrollore è il seguente:
Il microcontrollore è alimentato a 5V con il positivo sul pin 20 e il negativo sui pin 19 e 8. Il circuito di oscillazione è formato da un quarzo a 4MHz, C1 e C2. I LED in uscita sono messi per visualizzare il numero random, in particolare i primi 4 bit anche se il numero è a 5 bit. Il numero casuale va quindi da 0 a 31.
Il rumore rosa entra nell’ADC che lo converte attraverso il canale 1 ovvero RA1.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e il codice compilato con MIKROC al seguente LINK!!!