Generación de números aleatorios con Arduino: técnicas y ejemplos

  • Arduino genera números pseudoaleatorios, no aleatorios verdaderos.
  • Usar randomSeed y una semilla variable es clave para evitar secuencias repetitivas.
  • Las funciones millis() y analogRead() pueden simular aleatoriedad al variar la semilla.

números aleatorios arduino

Cuando trabajas con proyectos en Arduino, es común encontrarse con la necesidad de generar números aleatorios. Quizás estés construyendo un juego, un dispositivo interactivo o simplemente necesitas eventos que no sigan un patrón predecible. Pero, ¿realmente los números que genera un Arduino son completamente aleatorios? La respuesta corta es no, y de ahí surge la necesidad de comprender el concepto de números pseudoaleatorios y cómo implementarlos eficazmente.

En este artículo, te enseñaremos cómo generar números aleatorios en Arduino, cómo utilizar las funciones random y randomSeed, y por qué estas son claves para asegurarnos de que nuestras secuencias de números sean tan aleatorias como sea posible. Verás que, aunque los números generados no son completamente aleatorios, podemos conseguir un grado mucho más alto de aleatoriedad manipulando adecuadamente las semillas (seed) que emplea Arduino.

¿Cómo genera Arduino números aleatorios?

En principio, un microcontrolador como Arduino no es capaz de generar números aleatorios verdaderos, ya que es un dispositivo diseñado para ser predecible y preciso. Lo que hace Arduino es ejecutar cálculos matemáticos con una semilla (un número base) para generar una secuencia de números pseudoaleatorios. Esto significa que, a partir de una misma semilla, siempre obtendrás la misma secuencia de números.

Para evitar que los números se repitan muchas veces, se puede variar la semilla con la función randomSeed(). Esta permite cambiar el punto de inicio para generar la secuencia de números. Usando esta herramienta junto con algunas técnicas ingeniosas para obtener semillas impredecibles, como leer un pin analógico no conectado o medir el tiempo de ejecución del programa, podemos lograr que los números varíen en cada ejecución del código.

Uso de la función random

Arduino nos proporciona dos formas básicas de invocar la función random: una para generar un número aleatorio entre 0 y un número máximo (max – 1), y otra para generar un número aleatorio entre un valor mínimo y un valor máximo (min y max).

La sintaxis básica es la siguiente:

  • random(max); genera un número entre 0 y max – 1.
  • random(min, max); genera un número entre min y max – 1.

Por ejemplo, si llamamos a random(250), obtendremos un número entre 0 y 249. De igual forma, si ejecutamos random(100,200), obtendremos un número aleatorio entre 100 y 199.

Importancia de la función randomSeed

Como ya hemos mencionado, para evitar que Arduino genere siempre la misma secuencia de números en cada ejecución del programa, debemos asegurarnos de variar la semilla que utilizamos en randomSeed(). El truco está en elegir una semilla impredecible cada vez que se ejecute el código.

Una de las formas más comunes de generar una semilla aleatoria es leer un pin analógico no conectado. En este caso, ese pin se comporta de manera impredecible, captando ruido eléctrico, lo que garantiza que el valor leído variará constantemente. La semilla se puede establecer de la siguiente manera:

randomSeed(analogRead(0));

Alternativamente, podemos usar la función millis() para obtener el tiempo transcurrido desde que se inició el programa y utilizarlo como semilla. Esto es especialmente útil en proyectos interactivos donde el usuario puede presionar un botón en diferentes momentos del tiempo, lo que generará un inicio diferente para cada secuencia de números.

Por ejemplo, podemos usar randomSeed(millis()); para que la semilla varíe según el tiempo de ejecución.

Ejemplo práctico: Dado electrónico

Arduino IDE, tipos de datos, programación

Una aplicación clásica del uso de números aleatorios en Arduino es la creación de un dado electrónico. En este caso, cada vez que presionamos un botón, se genera un número entre 1 y 6, y se encienden leds para representar la cara del dado correspondiente.

Este es un ejemplo de cómo podría estructurarse el código:

pulsador = 8; // Pin del botón
numAleatorio = random(1, 7); // Genera un número aleatorio entre 1 y 6

Al presionar el pulsador, Arduino genera el número aleatorio y automáticamente activa los leds correspondientes durante 1,5 segundos para que el usuario pueda visualizar el resultado final. Después de un corto tiempo, los leds se apagan hasta que el botón se vuelve a presionar.

Generar números pseudoaleatorios mejorados

Para mejorar aún más la aleatoriedad, algunos usuarios prefieren centrarse en los primeros bits de ruido aleatorio que puede captar el pin analógico. Esto es porque los primeros bits contienen una mayor cantidad de variabilidad, lo cual se puede aprovechar en proyectos que requieran una aleatoriedad mayor. Una forma interesante de hacerlo sería utilizar la operación bit a bit:

randomSeed(analogRead(A0) & 3);

Este método permite extraer los primeros bits del ruido captado por el pin analógico A0, lo que mejora la aleatoriedad de los números generados. Arduino tiene la capacidad de generar hasta 4.294.967.295 números pseudoaleatorios diferentes, lo cual es más que suficiente para la mayoría de los proyectos caseros.

Finalmente, una vez que establezcas adecuadamente la semilla y el rango, podrás disfrutar de una mayor variabilidad en los números generados por Arduino, lo cual es ideal para una gran variedad de proyectos como juegos, sistemas interactivos y simulaciones. Por ejemplo:

void setup() {
  Serial.begin(9600); // Inicializamos la comunicación serial
  randomSeed(analogRead(0)); // Semilla para generar números más aleatorios
}

void loop() {
  int numeroAleatorio = random(1, 11); // Genera un número aleatorio entre 1 y 10
  Serial.println(numeroAleatorio);
  delay(1000); // Esperamos 1 segundo
}

No olvides que, aunque Arduino no es capaz de generar números verdaderamente aleatorios, aplicar técnicas como las mencionadas aquí mejorará significativamente los resultados y te permitirá simular aleatoriedad en la mayoría de los casos.


Comienza la conversación

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.