Dardo electrónico con arduino

Publicado el: 8 de mayo de 2020
Principiante
Acerca de este proyecto
Tablero de diana que contiene dos displays de 7 segmentos donde se muestra el puntaje obtenido cuando se inserta el dardo en ella.
arduino juegos
Publicidad
DETALLES

Diana


No hay mejor manera que pasar un rato entre amigos que jugar al lanzamiento de dardos, al lanzar un dardo hay que revisar en qué zona cayó para así interpretar el puntaje. Los juegos de dardos electrónicos muestran de manera visual el puntaje obtenido por cada lanzamiento acertado, pero son un poco costosos. Nosotros somos makers, así que porqué mejor no lo construimos nosotros mismos?

Hay que aclarar que los tableros electrónicos de dardos profesionales funcionan de una manera diferente a la que vamos a utilizar aca, el que construiremos será solo para disfrutar de nosotros de forma amateur.


LISTA DE MATERIALES

  • Arduino Uno o equivalente (nano, micro, mega, etc)
  • (1) CI 74LS47 - decodificador BCD - 7 segmentos.
  • (2) Displays 7 segmentos ánodo común.
  • (2) Transistores NPN 2N3904 o equivalente.
  • (2) resistores de 1k ohm.
  • (7) resistores de 100 ohms.
  • Lámina de poliestireno expandido (icopor).
  • Papel aluminio.
  • Agujas de jeringa.
  • Pistola de dardos de juguete.
  • Cables de conexión
  • Fuente de alimentación de 5V @ 1A.

ARMADO

Se realizan dos circunferencias iguales con  las láminas de poliestireno expandido (yo construí los círculos de 17 cms de diámetro).

Se hacen 5 círculos concéntricos dejando una estrecha zona entre cada círculo. Luego se pega el papel aluminio en cada sector, cuidando que no haya contacto entre cada sector, como se muestra en la imagen:

Diana de icopor sectorizada

Luego, insertamos cuidadosamente un alambre #22 (de los usados en los protoboards) en cada zona de manera que la punta del alambre quede haciendo buen contacto con cada sector. Hacemos lo mismo con la otra lámina.

En una de las capas o láminas coloreamos los sectores con los colores deseados.


Posteriormente realizamos las conexiones como se muestra en el diagrama esquemático.

Diagrama


Se debe insertar la agua en la punta de cada dardo.


Como vemos, cada sector de una lámina están conectados a los pines 8,9,10,11 y 12 respectivamente; mientras que los sectores de la otra capa o lámina van conectados a GND. Esto permite que inicialmente cada sector se comporte como un interruptor abierto. Cuando la aguja del dardo hace contacto en uno de los sectores (atravesando las 2 láminas), la aguja por ser de material conductor, cierra el circuito o se comporta como un interruptor cerrado, de esta manera cambia el estado lógico de esa entrada, es  decir, de estado ALTO pasa a estado BAJO, haciendo que se sume el puntaje correspondiente al sector donde ingresó el dardo.

En este proyecto, se asignaron los siguientes puntajes para cada sector:

  • Sector 1 (más alejado del centro) : 1 punto.
  • Sector 2: 3 puntos
  • Sector 3: 5 puntos
  • Sector 4: 7 puntos
  • Sector 5 (Centro del tablero): 10 puntos.

VIDEO DE FUNCIONAMIENTO Y EXPLICACIÓN


CODIFICACIÓN
Código arduino dardo electrónico-

//Programa de dardo digital de 5 zonas
const int A = 1;
const int B = 2;
const int C = 3;
const int D = 4;

const int zona1 = 8;
const int zona2 = 9;
const int zona3 = 10;
const int zona4 =11;
const int zona5 = 12;

const  int displayUnidades = 5;
const  int displayDecenas = 6;

int estadoZona1;
int estadoBotonAnteriorZona1;

int estadoZona2;
int estadoBotonAnteriorZona2;

int estadoZona3;
int estadoBotonAnteriorZona3;

int estadoZona4;
int estadoBotonAnteriorZona4;

int estadoZona5;
int estadoBotonAnteriorZona5;

const int tiempo = 6; //  Tiempo de multiplexado
const int tiempoAntirebote =10;

int score = 0;
int unidades = 0;
int decenas = 0;

int conta = 0;  // Variable para el contador
boolean estadoAnterior = LOW;    // Estado anterior del botòn
boolean estadoActual = LOW; // Estado actual del botòn


void escribirBcd(byte num){
  digitalWrite(A, (num&1)==1);
  digitalWrite(B, (num&2)==2);
  digitalWrite(C, (num&4)==4);
  digitalWrite(D, (num&8)==8);
}

void setup() {
  pinMode(A,OUTPUT);
  pinMode(B,OUTPUT);
  pinMode(C,OUTPUT);
  pinMode(D,OUTPUT);
  pinMode(displayUnidades,OUTPUT);
  pinMode(displayDecenas,OUTPUT);
  
  pinMode(zona1,INPUT_PULLUP);
  pinMode(zona2,INPUT_PULLUP);
  pinMode(zona3,INPUT_PULLUP);
  pinMode(zona4,INPUT_PULLUP);
  pinMode(zona5,INPUT_PULLUP);
  
  digitalWrite(displayUnidades,HIGH);
  digitalWrite(displayDecenas,HIGH);
  
  score = 0;
 }
 
 //*******RUTINA ANTIREBOTE *********************************************************
boolean antiRebote  (int pin ) {
  int  contador =0;
  boolean estado;            // guarda el estado del boton 
  boolean estadoAnterior;    // guarda el ultimo estado del boton 

  do {
    estado = digitalRead (pin);
    if (estado != estadoAnterior ){  // comparamos el estado actual 
      contador = 0;
      estadoAnterior = estado;
    }
    else{
      contador = contador + 1;       // aumentamos el contador en 1
    }
    delay (1);
  }
  while (contador < tiempoAntirebote);
  return estado;
}

//************************************************************************

void habilitarUnidades(){
  escribirBcd(unidades);
  digitalWrite(displayUnidades,HIGH);
  digitalWrite(displayDecenas,LOW);
  delay(tiempo);
}  

void habilitarDecenas(){
  escribirBcd(decenas);
  digitalWrite(displayUnidades,LOW);
  digitalWrite(displayDecenas,HIGH);
  delay(tiempo);
}

void loop() {
 
 estadoZona1 = !digitalRead(zona1);
 estadoZona2 = !digitalRead(zona2);
 estadoZona3 = !digitalRead(zona3);
 estadoZona4 = !digitalRead(zona4);
 estadoZona5 = !digitalRead(zona5);

//*******************  ZONA 1 ******************************************************************
  if (estadoZona1  != estadoBotonAnteriorZona1)   {     
    //si hay cambio con respeto al estado 
    if (antiRebote (zona1))    { 
      //checamos  si esta presionado y si lo esta
      score = score + 1;
    }
  }
  
  estadoBotonAnteriorZona1 = estadoZona1;      // guardamos el estado del boton
//*******************************************************************************************

//******************** ZONA 2 ***************************************************************
  if (estadoZona2  != estadoBotonAnteriorZona2)   {     
    //si hay cambio con respeto al estado 
    if (antiRebote (zona2))    { 
      //checamos  si esta presionado y si lo esta
      score = score + 3;
    }
  }
  
  estadoBotonAnteriorZona2 = estadoZona2;      // guardamos el estado del boton
//*******************************************************************************************

//********************** ZONA 3 *************************************************************
  if (estadoZona3  != estadoBotonAnteriorZona3)   {     
    //si hay cambio con respeto al estado 
    if (antiRebote (zona3))    { 
      //checamos  si esta presionado y si lo esta
      score = score + 5;
    }
  }
  
  estadoBotonAnteriorZona3 = estadoZona3;      // guardamos el estado del boton
//*******************************************************************************************

//********************** ZONA4 **************************************************************
  if (estadoZona4  != estadoBotonAnteriorZona4)   {     
    //si hay cambio con respeto al estado 
    if (antiRebote (zona4))    { 
      //checamos  si esta presionado y si lo esta
      score = score + 7;
    }
  }
  
  estadoBotonAnteriorZona4 = estadoZona4;      // guardamos el estado del boton
//*******************************************************************************************

//************************* ZONA 5 **********************************************************
  if (estadoZona5  != estadoBotonAnteriorZona5)   {     
    //si hay cambio con respeto al estado 
    if (antiRebote (zona5))    { 
      //checamos  si esta presionado y si lo esta
      score = score + 10;
    }
  }
  
  estadoBotonAnteriorZona5 = estadoZona5;      // guardamos el estado del boton
//*******************************************************************************************
  
  decenas = score/10;  //Extraigo el dìgito de las unidades
       
  unidades=  score-( decenas*10);  //Extraigo el dìgito de las decenas
        
  
  habilitarUnidades();
  habilitarDecenas();
 
}

Autor: sistemasymicros
31 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.

PROYECTOS RELACIONADOS
COMENTARIOS
Para publicar un comentario debes