Función random


Llega un momento en la que se quiere emular el azar en un programa, como por ejemplo, encender varios leds de forma aleatoria. Para ello existe la función Random en Arduino.

Utilizando esta función obtendremos números aleatorios para nuestro sketch. Pero estos números aleatorios en realidad no lo son. Como ocurre en la mayoría de estos lenguajes, incluyendo Arduino, son números seudoaleatorios, es decir, si se inicia la función random con los mismos parámetros se obtiene la misma secuencia de números.

La sintaxis de esta función es la siguiente:
  •     Random(max): Se obtiene un numero “aleatorio” desde 0 hasta max.
  •     Random(min, max): Se obtiene un numero “aleatorio” desde min hasta max

 Veamos cómo se comporta esta función escribiendo el resultado en el monitor serie con los parámetros random(1,100):

/*

Obtiene un numero aleatorio y lo muestra en monitor serie
*/

//Variable donde almacenaremos el numero aleatorio
long randomNumber;

//Función de inicialización
void setup() {
 
  //Inicializamos la comunicación serial
  Serial.begin(9600);
 
  //Escribimos por el puerto serie mensaje de inicio
  Serial.println("Inicio de sketch - secuencia de numeros aleatorios");
     
}

//Bucle principal
void loop() {

  //Genera un numero aleatorio entre 1 y 100
  randomNumber = random(1,100);
 
  //Escribimos el numero aleatorio por el puerto serie
  Serial.print("El numero aleatorio es = ");
  Serial.println(randomNumber);

  //Esperamos 1 segundo para repetir
  delay(1000);
}
Valores que se mostrarán en el monitor serie:


 Si reseteamos el programa vuelve a salir la misma secuencia. 

Pero hay una solución llamada semilla y que existe en todos los lenguajes que implementan la función random. La semilla es un valor por defecto que coge la función random para inicializarse, si cambiamos esta semilla la secuencia de datos cambiara.

La función randomSeed en Arduino

La sintaxis de esta función es la siguiente:

    randomSeed(semilla): Incializa la función random con el valor semilla pasado por parámetro. Esta función se incluirá dentro de la función setup de nuestro skecth.

La solución en Arduino

Para conseguir que cada vez que iniciemos el skecth tengamos secuencias diferentes tenemos que pasarle cada vez una semilla diferente. Esto lo conseguimos si como semilla le pasamos el valor de una entrada analógica que no utilicemos en nuestro sketch mediante la función analogRead(). Estos pin analógicos cuando no son utilizados no tienen ninguna tensión de referencia y devolverá un valor de ruido que será diferente cada vez que preguntemos por su valor.

Así es que el código nos quedara así:

/*
Obtiene un numero aleatorio con semilla variable y lo muestra en monitor serie
*/

//Variable donde almacenaremos el numero aleatorio
long randomNumber;

//Función de inicialización
void setup() {
 
  //Inicializamos la comunicación serial
  Serial.begin(9600);
 
  //Escribimos por el puerto serie mensaje de inicio
  Serial.println("Inicio de sketch - secuencia de numeros aleatorios");
     
  //Establecemos la semilla en un pin analogico
  randomSeed(analogRead(A0)); 
     
}

//Bucle principal
void loop() {
 
  //Genera un numero aleatorio entre 1 y 100
  randomNumber = random(1,100);
 
  //Escribimos el numero aleatorio por el puerto serie
  Serial.print("El numero aleatorio es = ");
  Serial.println(randomNumber);

  //Esperamos 1 segundo para repetir
  delay(1000);
}

 Valores que se mostrarán en el monitor serie:



Ya tenemos la forma correcta de emular el azar con Random en Arduino ahora solo nos queda ver que podemos hacer. Os pongo un ejemplo sencillo con LEDs: En este ejemplo tenemos 4 LEDs y encendemos uno de ellos aleatoriamente según nos devuelva la función random.

Monta el esquema que te muestro a continuación.



Este es el código que debes utilizar para seleccionar los LEDs al azar con random en Arduino.

/*

Obtiene un numero aleatorio con semilla variable y enciende el LED correspondiente utilizando random en Arduino
*/

//Declaramos los pins de los LEDs
#define LED_1  3
#define LED_2  4
#define LED_3  5
#define LED_4  6

//Variable donde almacenaremos el numero aleatorio
long randomNumber;

//Función de inicialización
void setup() {
 
  //Inicializamos la comunicación serial
  Serial.begin(9600);
 
  //Escribimos por el puerto serie mensaje de inicio
  Serial.println("Inicio de sketch - secuencia de numeros aleatorios");

  //Establecemos los pin en modo salida
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_4, OUTPUT);
     
  //Establecemos la semilla en un pin analogico
  randomSeed(analogRead(A0)); 
     
}

//Bucle principal
void loop() {

  //Apagamos todos los LEDs
  digitalWrite(LED_1, LOW);
  digitalWrite(LED_2, LOW);
  digitalWrite(LED_3, LOW);
  digitalWrite(LED_4, LOW);
 
  //Genera un numero aleatorio entre 2 y 6
  randomNumber = random(3,7);
 
  //Escribimos el numero aleatorio por el puerto serie
  Serial.print("El numero aleatorio es = ");
  Serial.println(randomNumber);

  //Encendemos el pin aleatorio
  digitalWrite(randomNumber, HIGH);

  //Esperamos 300 milisegundos para repetir
  delay(300);
}




 Fuente: https://programarfacil.com/


No hay comentarios: