“Dado electrónico” con Arduino UNO

Este proyecto, realizado con una placa Arduino UNO, implementa un dado a base de leds que nos puede ser de utilidad para nuestro juego preferido de mesa o simplemente para divertirnos y aprender un poco mas sobre el desarrollo y programación con Arduino

Descripción

Nuestro “dado electrónico” está formado por un conjunto de siete leds dispuestos como se en la Fig. 1, capaz de representar los números del 1 al 6 como en un dado convencional según sean los leds que encendamos bajo control de nuestro software, tal como se vé en la Fig. 2.

Leds en el dado

Fig. 1. Disposición de los siete leds

Numeros del dado

Fig. 2. Números del 1 al 6 formados con los leds del dado

Circuito

El circuito puede verse en la Fig. 3. Los 7 leds (LED1 a LED7) están controlados por la placa Arduino, mas precisamente por los pines 2 a 8 a través de otras tantas resistencias limitadoras de corriente (R1 a R7).

Completan el circuito un pulsador normal abierto (S1) con su resistencia de pull-down (R8) conectado al pin 9 de la placa y el buzzer o zumbador (B1) controlado por el pin 10. La resistencia de pull-down del pulsador se emplea para que, cuando el pulsador está abierto (no se acciona), la placa lea un valor logico “0” (o “LOW”) en el pin 9. De otro modo, si ese pin quedara “flotante” cuando el pulsador está abierto se podrían tener lecturas falsas.

Fig. 3. Esquemático del dado electrónico (click para agrandar)

Programa

El programa se lista a continuación y básicamente consiste en una función que configura las condiciones iniciales (setup) y un bucle sin fin (loop).

También hay dos funciones auxiliares: beep para producir un corto sonido por el buzzer y escribe_dado que se encarga de prender los leds para hacer aparecer un número en el dado.

En el bucle principal (loop) primero se espera a que se apriete el pulsador y luego a que se lo suelte, una técnica rudimentaria para evitar múltiples lecturas debido al rebote mecánico. Luego se hace un “bip” para realimentar la pulsación, se genera un número al azar entre 1 y 6 y se lo muestra en el dado, volviendo a repetir el ciclo.

void setup () {

   //Configurar salidas de los leds
   pinMode (2, OUTPUT);
   pinMode (3, OUTPUT);
   pinMode (4, OUTPUT);
   pinMode (5, OUTPUT);
   pinMode (6, OUTPUT);
   pinMode (7, OUTPUT);
   pinMode (8, OUTPUT);    
      
   //Configurar la salida del buzzer
   pinMode (10, OUTPUT);  
   
   //Configurar el pin de entrada del pulsador
   pinMode (9, INPUT);
    
   //Inicializa el generador de numeros aleatorios
   randomSeed(analogRead(0));   
    
   //Apaga todos los leds
   digitalWrite (2, LOW);
   digitalWrite (3, LOW);
   digitalWrite (4, LOW);
   digitalWrite (5, LOW);
   digitalWrite (6, LOW);
   digitalWrite (7, LOW);
   digitalWrite (8, LOW);  
   
   //Buzzer a 0
   digitalWrite (10, LOW);

}

void beep () {

    digitalWrite (10, HIGH);
    delay (20);
    digitalWrite (10, LOW);

}


void escribe_dado (unsigned char num) {
  //Escribe numero en el dado
  switch (num) {
            
    case 1: //Prender el numero 1
            digitalWrite (2, LOW);
            digitalWrite (3, LOW);
            digitalWrite (4, LOW);
            digitalWrite (5, HIGH);
            digitalWrite (6, LOW);
            digitalWrite (7, LOW);
            digitalWrite (8, LOW);           
            break;
            
    case 2: //Prender el numero 2
            digitalWrite (2, LOW);
            digitalWrite (3, HIGH);
            digitalWrite (4, LOW);
            digitalWrite (5, LOW);
            digitalWrite (6, LOW);
            digitalWrite (7, HIGH);
            digitalWrite (8, LOW);              
            break;
            
    case 3: //Prender el numero 3
            digitalWrite (2, HIGH);
            digitalWrite (3, LOW);
            digitalWrite (4, LOW);
            digitalWrite (5, HIGH);
            digitalWrite (6, LOW);
            digitalWrite (7, LOW);
            digitalWrite (8, HIGH);  
            break;
            
    case 4: //Prender el numero 4
            digitalWrite (2, HIGH);
            digitalWrite (3, LOW);
            digitalWrite (4, HIGH);
            digitalWrite (5, LOW);
            digitalWrite (6, HIGH);
            digitalWrite (7, LOW);
            digitalWrite (8, HIGH);  
            break;
            
    case 5: //Prender el numero 5
            digitalWrite (2, HIGH);
            digitalWrite (3, LOW);
            digitalWrite (4, HIGH);
            digitalWrite (5, HIGH);
            digitalWrite (6, HIGH);
            digitalWrite (7, LOW);
            digitalWrite (8, HIGH);  
            break;
            
    case 6: //Prender el numero 6
            digitalWrite (2, HIGH);
            digitalWrite (3, HIGH);
            digitalWrite (4, HIGH);
            digitalWrite (5, LOW);
            digitalWrite (6, HIGH);
            digitalWrite (7, HIGH);
            digitalWrite (8, HIGH); 
            break;
        
    default:
    case 0:  //Apagar todos los leds
            digitalWrite (2, LOW);
            digitalWrite (3, LOW);
            digitalWrite (4, LOW);
            digitalWrite (5, LOW);
            digitalWrite (6, LOW);
            digitalWrite (7, LOW);
            digitalWrite (8, LOW); 
            break;
            
  }
  

}


void loop () {
  
  unsigned int numero;
  
  while (!digitalRead (9));     //Espera a que aprieten pulsador

  escribe_dado (0);              //Apaga todos los leds
  
  while (digitalRead (9));      //Espera a que suelten pulsador
  
  beep ();
  
  numero = random(1, 7);        //Genera un numero al azar entre 1 y 6
  
  escribe_dado (numero);        //Mostrar el numero en el dado
 

}

En el video se puede ver el “dado” en funcionamiento

El dado en funcionamiento

Conclusión

Vimos un sencillo proyecto que implementa un dado electrónico formado con leds construido y programado con un Arduino UNO. Analizamos el circuito y el funcionamiento del programa.

Desde luego, y como sucede con cualquier proyecto, hay un sinnúmero de variaciones y mejoras posibles. ¿Cuáles se les ocurren? Pueden compartir sus ideas en los comentarios a este artículo.

46 comentarios en «“Dado electrónico” con Arduino UNO»

    • Hola!
      La instrucción while repite algo mientras se cumpla una condición. Generalmente se escribe así:
      while (condicion) {
      //Lo que se repite
      }
      En el programa del dado no hay un bloque a repetir, y la condición es !digitalRead (9) que es una forma abreviada de escribir digitalRead (9)==0.
      En definitiva, esa instrucción hace “nada” mientras la entrada 9 está en 0, es decir, sin apretar el pulsador y pasa a la siguiente instrucción cuando se lo aprieta

      Responder
    • Hola Rono, perdón por la demora. La verdad es que no he probado el código en un simulador, sólo lo he armado y comprobé que funciona sin errores.

      Responder
  1. hola alo mejor va a ser un pregunta tonta pero yo acabo de comprar un arduino mega 2560 no se si se configura igual que el arduino uno y que el programa lo detecte bien

    Responder
  2. Podrias pasar como se monta el circuito? Es que no se ve en el video muy bien porque la resolucion no es muy buena. Responde a este comentario que asi me llega al email xD

    Responder
    • Hola Antonio, en la Fig. 3 del artículo puedes ver el circuito para montarlo. Lo que se ve en el video es como la monté usando una placa protoboard

      Responder
  3. Hola, lo podría poner en un esquema de tinkercad o en algo más que no entiendo el de fritzing. Perdona mi ignorancia, pero… Las resistencias son de 1k ohm?

    Responder
  4. Estoy haciendo ese proyecto pero en tabla fenolica pero no me funciona solo encienden los leds y no hace la secuencia de encender los leds

    Responder
  5. Hola Profe, voy a empezar a trabajr con robotica y quiero hacer este ejercicio en varios pasos, em primera medida voy a trabajar sin el buzzer para luego agregarlo junto con mis estudiantes, pero tengo varias dudas sobre el programa. Dado que no soy ducho en el tema. Soy profe de geografia.
    El Bucle “void escribe_dado (unsigned char num)” estiendo que crea una funcion llamada escribe_dado y que tiene distintos casos a elegir que luego se configuran en random. Pero en definitica que significa el entre parentesis en ingles, porque veo que luego se repite con alguna variacion en el “Void Loop” (unsigned int numero) cual es la coneccion dicho en criollo entre uno y otro. Luego tenia otras dudas que se me fueron despejando al leer los otros comentarios. Otra cosa, ud creo una variable “numero” en el LOOP que luego es tomada por escribe_dado, ¿pero podria haberla creado antes en el SETUP? en ese caso me podria decir porque en el loop y no en el setup. Mil Gracias

    Responder
    • Hola Rodrigo. El formato mas o menos general para definir una función es “tipo_de_dato_devuelto nombre (tipo_de_dato parámetro)”. tipo_de_dato_devuelto es el tipo que devuelve la función, que podría ser cualquiera de los tipos reconocidos en el lenguaje (char, int, float, etc). En el caso de la función escribe_dado, esta no devuelve nada y por eso se pone “void”. Siguiendo con esta función, le entra un parámetro (num) que es del tipo caracter sin signo (unsigned char). A la función beep en cambio no le ingresa ningún parámetro (y por eso no tiene nada entre paréntesis) y tampoco devuelve nada (y por eso se le antepone void).
      Sobre la variable, cuando se define una variable dentro de una función, sólo es reconocida dentro de esa función. Es lo que se llama “alcance” de la variable (scope). numero se usa sólo dentro de loop y por eso está definida allí. Si la hubiera definido en Setup y la hubiera usado en loop, obtendría un error de que esa variable es desconocida. (Si se declaran variables fuera de las funciones estas pueden ser reconocidas desde cualquier parte del programa y por eso se llaman “globales”, pero mientras menos se usen mejor)

      Espero que la explicación te haya servido, suerte!

      Responder
  6. Saludos, Como puedo implementar para que se refleje dos dados con un solo arduino y esperar que en un caso puedan salir dobles en los dados.

    Responder
    • Hola Edwin. Para manejar los 14 leds necesarios para dos dados deberías emplear todos los pines de E/S digitales, del 0 al 13 y leer el pulsador con una entrada analógica (y te quedaría sin conexión el zumbador) o emplear otro circuito integrado adicional para agregar salidas o usar una placa como el Arduino MEGA que tenga mas pines de salida. En el software, debes modificarlo para que genere dos numeros al azar, por ejemplo “numero1” y “numero2” en vez de unos solo (“numero”) y prender los leds empleando la misma función “escribe_dado” con cada uno de ellos. Si debes hacer algo particular cuando los dos numeros son iguales, puedes hacerlo en el programa preguntando si “numero1 == numero2”. Espero haberte sido de utilidad.

      Responder
        • Hola Marifer, los leds se conectan, resistencia mediante, a los pines D2 a D10 del Arduino. Si te fijas en el circuito de la Fig. 3 puedes ir viendo con detenimiento como son las conexiones.
          Avisa si sigues con dudas

          Responder
    • Hola, lo siento, pero no hice una captura de como se conectan sobre la proto, pero el esquemático que se muestra en el artículo es sencillo, si lo sigues con cuidado podrás armar el circuito. Suerte!

      Responder
  7. Hola, tengo un problemita. Me funciona todo muy bien excepto el zumbador.
    Cunado presiono el pulsador no hace ruido, y si volteo las polaridades del zumbador si suena pero ya no prenden los leds.

    Responder
    • Hola Jordi. No es lo mismo. Si pones una sola resistencia limitadora de corriente, ese valor de corriente luego se divide entre los leds que estén encendidos, por lo que mientras mas leds encendidos haya, menor va a ser su brillo. Recuerda que las salidas del Arduino son como interruptores que se conectan a Vcc o GND según el nivel de salida sea ALTO o BAJO. Con dos leds encendidos, mira en la imagen la diferencia en las corrientes. Con una sola R, la corriente por la R es la misma pero en cada led es la mitad. En cambio con una R por cada led, la corriente en cada led es la misma, sin importar la cantidad que estén encendidos.

      leds-dado

      Responder
    • Hola Pedro! Los numeros aleatorios a veces se repiten..como en un dado común puede suceder que salga el mismo número mas de una vez. De todos modos si quieres evitarlos, puedes guardar el número que acaba de salir en una variable, como por ejemplo numeroAnterior y cuando se genere un numero nuevo, compáralo con ese. Si son iguales, ignoras el numero y lo generas de nuevo…

      Responder

Responder a luis Cancelar la respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias