Dado electrónico

Prácticas Módulo 7-segmentos

Título de la práctica:Dado electrónico
Objetivo:El alumno codificará un programa en Arduino que genere números pseudoaleatorios para simular el lanzamiento de un dado.
Tiempo estimado:100 minutos
Nivel de dificultad:Intermedio

Introducción

¿Te gusta escuchar música? ¿Alguna vez has configurado tu aplicación de música favorita para escuchar una lista de reproducción aleatoria? ¿Te has preguntado cómo es que tu aplicación selecciona la siguiente canción?

Sabemos que las computadoras son capaces de recibir datos de entrada, procesarlos y generar información de salida. Este proceso es determinístico, esto es, dado un conjunto de datos de entrada, las salidas siempre van a ser las mismas, es decir, los resultados de una computadora siempre son predecibles. Entonces, surge la pregunta: ¿una computadora puede generar números aleatorios?

Uno de los eventos aleatorios con el que estás más familiarizado es con el lanzamiento de un dado. En esta práctica, programarás un display de 7 segmentos que simule el lanzamiento de un dado y te permita verificar si tu respuesta a la pregunta anterior es correcta.

Materiales

Programas

Arduino IDE. Disponible en: https://www.arduino.cc/en/software

Desarrollo

Vamos a iniciar analizando qué se debe hacer para resolver el problema. Un dado está compuesto de 6 caras. Cada cara tiene un valor distinto (un número entero entre 1 y 6). El resultado del lanzamiento del dado es un valor aleatorio entre 1 y 6. Con esta información se pueden identificar las entradas, los procesos y las salidas del programa los cuales se muestran en la Tabla 1.

EntradasProcesosSalidas
NingunaGeneración de un número aleatorio entre 1 y 6Número aleatorio
Mostrar el número aleatorio en el display de 7 segmentos
Tabla 1 Especificación de datos de entrada, procesos y datos de salida del programa dado electrónico

Para la programación del dado se usará el display de 7 segmentos que se encuentra integrado en el módulo 7-segmentos. Este módulo está diseñado para conectarse a la tarjeta Arduino UNO como un shield.

Conexión del Módulo 7-segmentos

Conecta el módulo 7-segmentos a la tarjeta Arduino UNO como se muestra en la Figura 1. Observa que el lado del módulo que tiene 18 pines debe ser insertado en la línea de pines digitales de la tarjeta Arduino y el lado que tiene 8 pines se conecta a los pines de alimentación.

Figura 1 Conexión del módulo 7-segmentos a la tarjeta Arduino UNO

Nota: si no tienes un módulo de 7-segmentos, puedes construir el circuito electrónico mostrado en la Figura 2. Toma en cuenta que se está utilizando un display de 7 segmentos de cátodo común.

display_7seg_conexion
Figura 2 Diagrama de conexiones del Módulo 7-segmentos

Configuración de los pines de conexión del display de 7 segmentos

Vamos a identificar a qué pines de la tarjeta Arduino UNO está conectado el display de 7 segmentos.

Ejercicio 1 Identificación de los pines de conexión de los segmentos del display

Observa el diagrama de conexiones de la Figura 2 y llena la siguiente tabla arrastrando el número de pin al cuadro del segmento del display al que está conectado.

Ejercicio 2 Declaración del arreglo PINES

Analiza las características de los datos de la tabla anterior y piensa cómo puedes representarlos y almacenarlos en un arreglo unidimensional al que llamaremos PINES. Responde las siguientes preguntas que te ayudarán a declarar el arreglo PINES.

Ejercicio 3 Configuración de los pines de conexión del display de 7 segmentos

Ahora procederemos a configurar el modo de comportamiento de los pines. Responde las siguientes preguntas que te orientarán para codificar las instrucciones de Arduino correspondientes.

Ejercicio 4 Activación del display de 7 segmentos

El módulo 7-segmentos tiene integrado un transistor NPN que te permite activar o desactivar el display de 7 segmentos. Vamos a codificar las instrucciones para configurar el pin al cual está conectado el transistor para que se comporte como una salida y posteriormente activar el display. Observa la Figura 2 y responde las siguientes preguntas:

Generación del número aleatorio

Para programar la generación del número aleatorio que resulte del lanzamiento del dado, primero declararemos una variable a la cual llamaremos numAleatorio. Los valores que puede almacenar esta variable son los números de las caras del dado (1-6), por lo tanto, su tipo de datos será int. De esta forma, la instrucción de Arduino para declarar la variable es:

int numAleatorio;

El número aleatorio lo vamos a generar con la función random de Arduino. Su sintaxis es:

Sintaxis de la función random

random(min, max);

Parámetros

min – límite inferior del valor aleatorio (inclusivo)

max – límite superior del valor aleatorio (exclusivo)

Valor de retorno

                Un número aleatorio entre min y max-1

Entonces, la instrucción para generar un número aleatorio entre 1 y 6 que necesitamos para programar nuestro dado es:

random(1,7);

El valor de retorno de la función lo almacenaremos en la variable numAleatorio que definimos previamente. La codificación de la instrucción de asignación es:

numAleatorio = random(1,7);

Visualización del número aleatorio en el display

A continuación, vamos a programar las instrucciones para que podamos visualizar el número aleatorio en el display de 7 segmentos. Como ya sabes, esta acción se basa en el encendido y apagado de sus segmentos. Para recordar los segmentos que debes encender o apagar te sugerimos realizar el siguiente ejercicio:

Ejercicio 5 Identificación del estado de los segmentos del display para representar un dígito

Arrastra la etiqueta 0 a las casillas de los segmentos que deben estar apagados (LOW) y la etiqueta 1 a las casillas de los segmentos que deben estar encendidos (HIGH) para que se pueda visualizar el número correspondiente:

Ejercicio 6 Declaración del arreglo DIGITOS

Analiza las características de los datos de la tabla anterior y piensa cómo podrías representarlos y almacenarlos en un arreglo bidimensional al que llamaremos DIGITOS. Las siguientes preguntas te ayudarán a identificar los elementos necesarios para declarar el arreglo:

Una vez declarado e inicializado el arreglo DIGITOS, el siguiente paso es codificar las instrucciones que permitan la visualización del número aleatorio en el display de 7 segmentos. Esta acción la realizaremos con el siguiente ciclo for.

for (int col=0; col<8; col++) {
 digitalWrite(PINES[col],DIGITOS[numAleatorio][col]);
}

Te invitamos a revisar el siguiente video para que comprendas cómo funciona el for anterior:

Visualización de dígitos en el Módulo 7-segmentos

Codificación del programa de Arduino

Es el momento de unir todas las instrucciones de Arduino que hemos identificado para la solución del problema en un solo programa. Para ello, sustituye el texto <<bloque de instrucciones Ejercicio n>> con las instrucciones que codificaste en el ejercicio de la práctica indicado.

/*  Práctica Dado electrónico
*   Programa que genera un número aleatorio y lo
*   muestra en un display de 7 segmentos
*/

/*  Declaración e inicialización del arreglo unidimensional PINES
*   que almacena los números de pines conectados a
*   cada segmento del display
*/
<<bloque de instrucciones Ejercicio 2>>

/*  Declaración e inicialización del arreglo bidimensional DIGITOS
*   que almacena el valor del estado de los segmentos
*   (1-encendido, 0-apagado)
*   para representar los dígitos del 0 al 9
*/
<<bloque de instrucciones Ejercicio 6>>

/*  Declaración de la variable numAleatorio que almacena
*   el número aleatorio generado por el programa
*/
int numAleatorio;

void setup(){

  // Configuración de los pines de conexión de los segmentos del display de salida
<<bloque de instrucciones Ejercicio 3>>

  //Configuración del pin de conexión del transistor de salida
<<bloque de instrucciones Ejercicio 4.2>>

  //Activación del display de 7 segmentos
<<bloque de instrucciones Ejercicio 4.3>>

}

void loop(){

  //Generación de un número aleatorio entre 1 y 6
numAleatorio = random(1,7);

  //Visualización del número aleatorio en el display
<<Escribe la estructura for que permite visualizar el número aleatorio en el display >>
delay(1500);
}


Captura, compila y ejecuta tu programa. Para ello, realiza las siguientes acciones:

  1. Abre el IDE de Arduino.
  2. Crea un nuevo sketch.
  3. Captura las instrucciones del programa.
  4. Guarda tu programa.
  5. Compila tu programa. En caso necesario, depúralo hasta que no tenga ningún error.
  6. Conecta la tarjeta Arduino a tu computadora.
  7. Selecciona el puerto serial (COM) de la computadora asociado a la tarjeta.
  8. Sube el programa a la memoria de la tarjeta Arduino UNO.
  9. Ejecuta tu programa.

El resultado de la ejecución de tu programa deberá ser la que se muestra en la Figura 3.

Figura 3 Resultado de la ejecución del programa dado electrónico

Resultados

Vamos a analizar los resultados de tu programa. Para ello, dibuja en una hoja la siguiente tabla:

No. de pruebaNúmero 1Número 2Número 3Número 4Número 5
1
2
3
4
n
Tabla 2 Registro de los datos obtenidos en la ejecución del programa Dado electrónico

En esta tabla registrarás los valores obtenidos en las pruebas del lanzamiento del dado que muestre tu programa en el display de 7 segmentos de acuerdo con las siguientes acciones:

  • Oprime el botón de reinicio de la tarjeta Arduino UNO (Figura 4). Esta acción generará que el microcontrolador detenga el programa que actualmente se está ejecutando y lo ejecute nuevamente desde su inicio.
boton-reinicio
Figura 4 Ubicación del botón de reinicio de la tarjeta Arduino UNO
  • Registra en tu tabla, en la prueba 1, los primeros 5 números que se visualizaron en el display.
  • Vuelve a oprimir el botón de reinicio de la tarjeta Arduino UNO.
  • Ahora registra en la prueba 2  los primeros 5 números que se visualizaron en el display.
  • Prueba varias veces el mismo procedimiento y registra los resultados en el número de prueba correspondiente.

Como te habrás dado cuenta, la secuencia de números generados en todos los casos es la misma. Entonces, ¿el programa realmente genera números aleatorios?

Vamos a probar lo siguiente:

  • Modifica tu programa agregando la siguiente línea de código dentro de la función setup. Recuerda que cada vez que modifiques tu programa debes compilarlo y subirlo nuevamente a la memoria de la tarjeta Arduino. 
randomSeed(30);
  • Oprime el botón de reinicio de la tarjeta Arduino UNO.
  • Registra en tu tabla los primeros 5 números que se visualicen en el display.

¿Los números que acabas de registrar son iguales a los anteriores? ¿Hemos logrado generar números aleatorios con la modificación hecha al programa? Verifiquemos si tu respuesta es correcta.

  • Repite al menos 3 veces el proceso de reinicio del programa y registra los valores de cada prueba en tu tabla.
  • Modifica el parámetro de la función randomSeed, en lugar de 30 coloca cualquier otro número.
  • Vuelve a repetir al menos 3 veces el proceso de reinicio del programa y nuevamente registra los valores de cada prueba en la tabla.

¿Qué pasó cuando cambiaste el valor del parámetro de la función randomSeed por otro número? ¿Los números obtenidos en cualquiera de los casos de prueba son aleatorios?

De los resultados obtenidos, podemos concluir que el programa NO genera números aleatorios, lo que genera son números pseudoaleatorios.

Los números pseudoaleatorios, como su nombre lo indica, realmente no son números aleatorios, aunque lo parecen. Estos números siguen un patrón, son periódicos y son generados a partir de algoritmos.

En muchas ocasiones, la generación de números pseudoaleatorios inicia a partir de un valor arbitrario conocido con el nombre de semilla.  Con la función randomSeed se puede definir esta semilla.

Sintaxis de la función randomSeed

randomSeed(valor);

Parámetros

valor – número con el que se inicializa la secuencia pseudoaleatoria

La función randomSeed inicializa el generador de números pseudoaleatorios de Arduino, haciendo que comience en un punto específico de la secuencia. De esta forma, la función randomSeed puede ser útil para generar secuencias de números pseudoaleatorios exactamente iguales en repetidas ocasiones.

Ahora bien, si lo que se requiere es generar secuencias de números pseudoaleatorios distintas, como es el caso de nuestro programa del dado electrónico, en lugar de definir la semilla a partir de un valor constante, la vamos a obtener de la lectura de un pin analógico de la tarjeta Arduino que no se esté utilizando.

Vamos a probar este último método en nuestro programa. Para ello, modifica la función randomSeed de tu programa como se indica a continuación:

randomSeed(analogRead(A0));

Repite el proceso de reiniciar la tarjeta Arduino varias veces y registra los números obtenidos en tu tabla. ¿Son aleatorios estos números?

Conclusiones

Un número aleatorio «es aquel número que se obtiene netamente al azar, es decir, es todo número que pertenezca a un rango de valores o a un conjunto infinito de valores y que tenga la misma probabilidad de ser elegido, además de que la elección no dependa de la elección de otro número” (FES Cuautitlán, 2018).

Los números pseudoaleatorios son aquellos que siguen un patrón, son periódicos y son generados a partir de algoritmos. De esta forma, si se analiza una serie de números pseudoaleatorios suficientemente grande, es posible predecir con certeza el siguiente número de la secuencia.

Con estos conceptos en mente, es momento de responder a las preguntas iniciales de la práctica:

  1. ¿Una computadora puede generar números aleatorios? Justifica tu respuesta.
  2. ¿Cómo selecciona las canciones una aplicación de música para generar una lista de reproducción aleatoria?

Finalmente, comenta ¿qué aprendiste con la elaboración de esta práctica?

Reto Arduino

Modifica el programa del dado electrónico para que el lanzamiento del dado no se realice automáticamente, sino que esté controlado por el botón B1 del módulo 7-segmentos, con las siguientes consideraciones:

  • Cuando inicie el programa ninguno de los segmentos del display debe estar encendido.
  • Cuando el usuario presione el botón B1 se visualizará en el display un número al azar entre 1 y 6.
  • El número deberá permanecer visible en el display hasta que se vuelva a presionar el botón B1, en cuyo caso aparecerá el valor del nuevo lanzamiento.

Referencias

Arduino. (2021). Language Reference. https://www.arduino.cc/reference/en/

Corrales, R. (2018). ¿Por qué las computadoras no pueden generar números aleatorios? http://revistavacio.com/ciencia-y-tecnologia/computadoras-vs-numeros-aleatorios/

GISI-UNAM Cuautitlán. (2018). Números aleatorios. http://virtual.cuautitlan.unam.mx/intar/?page_id=379

Haahr, M. (2021). Introduction to Randomness and Random Numbers. https://www.random.org/randomness/