Generación de números aleatorios
En la clase de hoy hemos visto varias cosas, entre ellas la generación de números aleatorios en Arduino; bueno, pseudoaleatorios, ya que es muy importante tener en cuenta que la aleatoriedad no existe realmente en informática. Si tú le pasas las mismas entradas, siempre te dará las mismas salidas.
Pero claro, si yo quiero crear un número aparentemente aleatorio voy a tener que hacer uso de una semilla basada en un valor que cambia constantemente. Una práctica muy usada es utilizar como semilla el tiempo Unix, que es un valor de tiempo que siempre aumenta; este empezó el 1 de enero de 1970.
Aunque, ya que estamos en Arduino, vamos a utilizar para la semilla un cable conectado a un pin analógico que está al aire, ya que si leemos su valor con analogRead() sí podemos ver que es un valor que fluctúa bastante.
La manera en la que podemos establecer esta semilla es con la siguiente función:
| |
Como vemos, a esta función le estamos pasando la lectura del pin analógico que se encuentra conectado a nada.
Muy importante que esto esté situado (la llamada a esta función) en el setup().
Perfecto, una vez ya hemos establecido la semilla, ya podemos generar números aleatorios (bueno, pseudoaleatorios), pero ¿y cómo lo hago? Bueno, pues con la siguiente función:
| |
Ciertas cosas a tener en cuenta sobre esta función es que el primer número que le paso sí lo incluye, pero no el último, ya que es exclusivo. Por ejemplo, si quiero generar números aleatorios del 1 al 6 como un dado, tendría que hacer lo siguiente: random(1, 7).
Luego, otro punto importante es que el valor devuelto hay que guardarlo en una variable de tipo long, ya que es el tipo de dato que devuelve esta función.
El siguiente código es un ejemplo de cómo crear números aleatorios del 1 al 100 (ambos incluidos) e imprimirlos por pantalla:
| |
Uso del visualizador de 7 segmentos
Bien, ahora que ya hemos visto cómo generar números pseudoaleatorios en Arduino, vamos a aprender a utilizar el visualizador de 7 segmentos, que es el componente que tiene pintado como un “0” con rayitas y un punto abajo a la derecha.
Vamos a ver cómo conectar este visualizador:
- Lo primero es que es interesante conectarlo sobre la línea central de la protoboard.
- Luego, como vemos, tiene 5 pines a cada lado corto, de los cuales los centrales de arriba y abajo deben ir a tierra con una resistencia de 330Ω, por ejemplo.
- Solo hace falta utilizar uno a tierra, no los dos, ya que por dentro están interconectados.
También es importante tener en cuenta que existen dos tipos de visualizadores de 7 segmentos:
- Cátodo común: el pin común va a GND y los segmentos se encienden con HIGH.
- Ánodo común: el pin común va a 5V y los segmentos se encienden con LOW.
Ahora vamos a ver qué pines van a cada barra:
| |
| Barra / segmento | Número de pin |
|---|---|
| A | 7 |
| B | 6 |
| C | 4 |
| D | 2 |
| E | 1 |
| F | 9 |
| G | 10 |
| DP | 5 |
| común | 3 y 8 |
Perfecto, pues ya con toda esta información podemos montar el circuito conectando una tierra a GND con una resistencia de 330Ω, y los demás pines de los segmentos a pines digitales.
Puede ser interesante conectar los pines, por ejemplo, del pin 4 al 11 para poder establecer todos como OUTPUT fácilmente o apagarlos todos, etc.
Una vez visto todo esto vamos a entrar ya en el proyecto de hoy, que mezcla la creación de números pseudoaleatorios y el visualizador de 7 segmentos con dos botones: uno para indicar cuándo empezar a crear el número aleatorio y mostrarlo, y otro para resetear.
Antes de nada decir que mi código funciona suponiendo que el display es de cátodo común, por lo que el pin común es a tierra.
Lo que hará el programa es lo siguiente:
- Nada más compilar no hace nada.
- Una vez pulsado el botón trigger, se activará una animación.
- A los segundos (entre 2 y 5) se mostrará un número aleatorio de un dado de 6 caras.
- A partir de ahí lo único que puedo hacer es pulsar el botón de reset para dejar todo como al principio.
El código es el siguiente:
| |
Para detectar cuándo se pulsa un botón he utilizado INPUT_PULLUP, por lo que el pin está normalmente en HIGH gracias a la resistencia interna de Arduino y, cuando pulso el botón, pasa a LOW.
Por eso, en este caso la pulsación realmente se detecta en el cambio de HIGH → LOW.
Además, he implementado un pequeño debouncing por software para evitar lecturas falsas, ya que los botones físicos producen rebotes eléctricos al pulsarse. Durante unos milisegundos el pin puede oscilar entre HIGH y LOW, así que para evitar falsas detecciones se ignoran cambios durante aproximadamente 20 ms.