“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.



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

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)

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

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

 

42 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
  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
    • 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
  2. 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
  3. 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
    • 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
  4. 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

Responder a jury Cancelar la respuesta

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

A %d blogueros les gusta esto: