Programar fácil con Arduino

Programar fácil con Arduino, entiende cómo funciona el mundo.

  • Inicio
  • Cursos
  • Blog
  • Podcast
  • ¿Quién soy?
  • Contactar
  • Acceder
Usted está aquí: Inicio / Blog / Random en Arduino: como usar números aleatorios

Random en Arduino: como usar números aleatorios

Comentarios(2)
Luis del Valle Hernández

Llega un momento en la vida de un maker en la que quiere emular el azar en un programa, como por ejemplo, obtener resultados aleatorios de un dado para un juego. Para ello existe la función Random en Arduino y está presente en todos los lenguajes de programación de alto nivel, pero en cada uno de ellos tiene sus particularidades.

random en arduino

Y Arduino no iba a ser menos, 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.

Indice de contenidos

  • 1 La función Random en Arduino
  • 2 La función randomSeed en Arduino
  • 3 La solución en Arduino

La función Random en Arduino

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):

Arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
 
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);
}
Números aleatorios monitor serie

Reseteamos y volvemos a lanzar el programa y nos fijamos en la salida del monitor serie:

Números aleatorios monitor serie

Como veis en las dos imágenes, la secuencia es la misma y no nos valdría para realizar un juego de azar. Siempre sabríamos que iba a salir.

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

Con esta función ya obtendremos una secuencia distinta a la anterior. Veamos el ejemplo pasándole una semilla con valor 39 y fijémonos en el monitor serie.

Arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
 
Obtiene un numero aleatorio con semilla fija 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 fija
  randomSeed(39);        
}
//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);
}
Números aleatorios monitor serie

Como ves, se diferencia de la secuencia anterior. Pero paramos, reseteamos y volvemos a ver el resultado.

Números aleatorios monitor serie

Se vuelve a repetir la secuencia? Si!, a misma semilla mismo resultado. Como os contaba al principio lenguajes como PL SQL de Oracle lo solucionan muy eficazmente, tienen una semilla por defecto que se compone con la fecha del sistema y el identificador del usuario haciendo casi imposible que la secuencia se repita.

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í:

Arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 
Obtiene un numero aleatorio con semilla variable y lo muestra en monitor serie
Creado por Alfonso Contreras López [email protected]
www.programarfacil.com
*/
//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);
}

Y vamos a hacer nuestra comprobaciones con el monitor serie reseteando el proceso

Números aleatorios 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.

Circuito LEDs aleatorio

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

Arduino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
 
Obtiene un numero aleatorio con semilla variable y enciende el LED correspondiente utilizando random en Arduino
*/
//Declaramos los pins de los LEDs
int LED_1 = 2;
int LED_2 = 3;
int LED_3 = 4;
int LED_4 = 5;
//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(2,6);
  
  //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 1 segundo para repetir
  delay(1000);
}

Gracias a Shutterstock por ceder los derechos de la imagen

curso programacion de arduino desde cero

Tutoriales de Arduino


Curso de Arduino
Proyectos con Arduino
Arduino UNO R3
Arduino MEGA 2560
Servomotor con Arduino
Sensor de temperatura DHT11
Sensor temperatura Arduino
Tutorial pulsadores
Tutorial RTC reloj Arduino
Tutorial potenciómetro Arduino
Tutorial display 7 Arduino
Tutorial motor paso a paso Arduino
Tutorial librerías Arduino
Tutorial ultrasonidos Arduino
Tutorial I2C Arduino
Tutorial consumo Arduino
Tutorial weareable Arduino
Tutorial interrupciones Arduino
Tutorial ADS1115 ADC Arduino
Tutorial pilas Arduino
Tutorial riego Arduino
Arduino Shield EchidnaShield
Tutorial if else Arduino

Tutoriales ESP8266


Introducción ESP8266
Tutorial NodeMCU
IDE Arduino NodeMCU
Tutorial ESP-01
Relé WiFi Sonoff

Tutoriales IoT


Proyectos IoT con Arduino
MQTT ESP8266 Raspberry Pi
Redes LPWAN Arduino
IFTTT Arduino
Geolocalización Arduino
Arduino MKRFOX1200 Sigfox
Tutorial Node-RED

Tutoriales Visión Artificial


Instalación OpenCV y Python
Introducción Vision Artificial
Detección movimiento OpenCV
Introducción OpenCV
Qué es Machine Learning
Sensor Kinect
Realidad Aumentada
Detector Canny OpenCV
Big Data Visión Artificial
Kinect y Processing
Deep Learning

Tutoriales Raspberry Pi


Tutorial Raspberry Pi
Proyectos Raspberry Pi
Vídeo Raspberry Pi
Servidor web Raspberry Pi
Servidor Raspberry Pi
Flask Raspberry Pi
Monitor bebé Raspberry Pi

Podcast


Entrevista Obijuan
Entrevista BricoGeek
Entrevista David Cuartielles
Entrevista Rinconingenieril
Entrevista Staticboards
Entrevista La Hora Maker
Entrevista OSHWDem
Entrevista Colepower
Entrevista Aprendiendoarduino
Entrevista BitFab
tertulia-maker-invierno-2021

Los Amazon Echo tendrán comunicación LoRa integrado

Hola a todos, una vez más nos encontramos por estos lados, en el inicio de la sexta temporada del podcast La Tecnología Para Todos, con muchas … [+ info...]

Protocolo i2c imagen destacada

Comunicación I2C con Arduino lo mejor de dos mundos

El protocolo de comunicación I2C con Arduino es ampliamente utilizado en multitud de sensores y actuadores. Esto se debe principalmente a dos … [+ info...]

Introducion-a-git-y-git-hub-github tutorial paso a paso

Git y GitHub tutorial paso a paso

¿Qué es Git y GitHub? En este artículo vas a entender cómo utilizar Git y GitHub, la famosa red social del código basada en Git, orientada a … [+ info...]

Copyright © 2021 · Programar Fácil · Aviso legal

Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos que acepta su uso.Aceptar Política de privacidad y cookies
Política de cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necesarias
Siempre activado

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

No necesarias

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.

close

Te ayudo a dar los primeros pasos con Arduino

Si quieres aprender programación de electrónica con Arduino utilizando un método serio, prueba el curso que te ofrezco.


Es muy sencillo, te apuntas en este formulario y accedes a los 3 primeros módulos.


Que te gusta, sigues con el curso completo.


Que no te gusta, sin problema, te das de baja y tan amigos.


Solo para gente seria que esté cansada de copiar y pegar código sin saber lo que hace.

x