Go Down

Topic: Construcción maleta bomba Airsoft (Read 10650 times) previous topic - next topic

efect2000

#15
Aug 17, 2016, 08:31 am Last Edit: Aug 17, 2016, 08:31 am by efect2000
si bien sigo opinando que no veo necesario simular una bomba, (podria simularse tipo master-mind) no sé porqué tantos cables, si al final siempre hay que escoger entre el rojo o el verde :smiley-mr-green:
sin tema de precio, un mega y fuera problemas en el futuro

leitronik

#16
Aug 17, 2016, 12:29 pm Last Edit: Aug 19, 2016, 02:14 am by Hector_A
Cosme_Fulanito te ha dado buenos consejos.
Lo primero es ver que elementos incorpora, cuantos pines, DE QUE TIPO Y DONDE CONECTAN
Así a ojo va a usar MEGA para no complicarte demasiado, el precio de una placa MEGA compatible es pequeño en comparación al original.
El problema te va a llegar cuando empieces a sincronizar el funcionamiento de la cuenta atras de la LCD con los sensores y el teclado para que vaya fluido.
La programación te va a requerir una cantidad de horas respetable ya que tendrás que repartir el tiempo de proceso entre todos los elementos, crear los menus.

Otra parte interesante a la hora de montar un prototipo son los cables, o bien utilizar una protoboard en la que los cables no están fijos, o soldaduras en una PCB perforada pero para eso vas a necesitar paciencia, un buen soldador y practica. O realizar una pcb donde conectar todo, pero eso requiere conocimientos. Y luego tendrías que encajarlo y fijarlo en la maleta.

La alimentación no supondría gran problema, hay baterías de cargar gigantescas y este aparato no debería tener un consumo grande. Dependiendo de los voltajes de trabajo y consumo de los elementos, altavoz sobre todo. El resto funcionaria horas con pilas y el altavoz probablemente también.

También me gustaría sugerirte otro tipo de "detonación", he visto que ponen algún gas inflamable en una bolsa de platico, y algún polvo "harina" al hacer un cortocircuito inflama el gas y dispara el polvo. Pero es un método muy sucio y mas complicado.

En Leitronik nos dedicamos al ...


Editado por mi, esto puede considerarse como spam oculto.



Cosme_Fulanito

También me gustaría sugerirte otro tipo de "detonación", he visto que ponen algún gas inflamable en una bolsa de platico, y algún polvo "harina" al hacer un cortocircuito inflama el gas y dispara el polvo. Pero es un método muy sucio y mas complicado.
Las bombas de humo caceras son muy populares también. El problema es que hay campos en los que no se puede usar pirotecnia por el riesgo de incendio.

En mi caso uso una alarma de bicicleta que usa una batería de 9v, la más grande que pude conseguir dentro de ese tamaño / voltaje... No es la gran cosa. Parece que sí porque cuando uno la prueba en su case le perfora los oídos, pero en un campo abierto, con máscaras puestas... la escucha solamente al que le explota y los que están al lado (idealmente los del otro equipo :) ).

Es mejor que nada, de todos modos.

Neutrik

Muchas gracias a todos!

Pedazo maleta te hiciste Cosme_Fulanito!!!no compartirás ese código???? Jajajajaa porque me está dando miedo la programación!!! Jajajajaja

Por el momento he pillado un MEGA y ya tengo el teclado, un LCD 20x4, tres cerraduras para desconectar por llaves, los cables para desactivar cortando, leds para indicar Estados y un par de zumbadores.

Tengo que resolver que sirena uso, que baterías y seleccionar una maleta en la que encaje todo bien...

A ver si saco un rato y ya me dibujo el esquema preliminar y contabilizo señales y demás... Que con el trabajo voy justo de tiempo!!

Un saludo!

Cosme_Fulanito

Adjuntado el código.

Fue mi primer proyecto con Arduino así que no me hago responsable por su calidad. :D

Mirando el código así por arriba, he aquí algunas notas que me parecen oportunas:

- El LCD usa un backpack I2C (no tiene conexión paralela).

- El display de segmentos también, es de Adafruit y usa una librería de ellos.

- Cuando el código menciona el seguro, es un simple botón on/off.

- El teclado es un matricial como éste:
Aunque no estoy usando esa librería.

- El PinDetonador está conectado a un relé que activa una batería de 9v que activa una bocina de alarma.

- El tiempo se cuenta usando la función millis(), y su duración varía (almacenada en la variable DuracionDelSegundo) debido a que los juegos pueden acelerar el reloj cuando uno erra el código de desactivación. :D

- Hay tres variables que son punteros a función:

Code: ("archivo Bomba.ino") [Select]

void (*Iniciar)(); //juego_step, se llama cuando arranca a correr el tiempo.
void (*VerificarDesactivacion)(); //Función para verificar si la bomba debe desactivarse. A setear por cada juego_setup().
void (*JuegoLoop)();//Llamada en cada ciclo del loop principal.


El menú principal (función Configurar()) llama a Juego1_Setup() o 2 o 3, quienes setean esas variables con valores a sus propias funciones (en los archivos Juego#.ino)

Que es lo que hace después el código en Bomba.ino e Input.ino se limiten a llamar a esas funciones sin saber qué juego se está jugando; que es lo que hace que agregar más juegos de manera "sencilla".

Tema medio "espinudo" el de los punteros a función... Si son novatos, pues... suerte! :D Conceptualmente puede decirse que es como guardar el nombre de una función en una variable, y llamar después a la función cuyo nombre no se sabe cuál es pero está guardado en la variable.


Espero sirva aunque sea para sacar ideas.

Cosme_Fulanito

#20
Aug 19, 2016, 03:32 am Last Edit: Aug 19, 2016, 03:39 am by Cosme_Fulanito
Edit: bueno, me dieron ganas de abrirla para ver cómo estaba hecha por dentro... ¡Menudo nido de cables!




(sirena fuera de la imagen)

Hector_A


Neutrik

Hola Cosme_Fulanito:

Disculpa no haber escrito antes pero por el trabajo y otras cosas he parado un poco esto! Pero ya lo retomó!

Puf menudo currazo tiene tu maleta! Este fin de semana y la semana que viene le echaré un vistazo a ese fantástico código que seguro nos ayudará muchísimo! Gracias infinitas!

Os iré contando cómo progresamos! Por ahora ya tengo un LCD de 20x4, un panel de teclas igual que el tuyo pero que por fuera es metálico (lo vi y no pude coger otro! Aunque costo más dinero...), El arduino mega, tres cerraduras, y las clemas para poner 6 cables para desconectar cortándolos. Me falta la bocina, las baterias, la maleta y alguna cosillas más que iré mañana a comprarlo!

Imagino que me surgirán mil dudas con tu programa... Jajajajaja.

Un abrazo y muchas gracias!

shawe

Interesante proyecto! La vez que jugué a Paintball con los amigos hubiera molado este extra.

shawe

Edit: bueno, me dieron ganas de abrirla para ver cómo estaba hecha por dentro... ¡Menudo nido de cables!




(sirena fuera de la imagen)
Me he bajado tu código para curiosear y veo que incluye 3 modos de juegos lo que lo hace más interesante, pero como montamos los novatos el juego sin saber como conectarlo todo con un diagrama o esquema?

surbyte

Es que asi pasa en este foro, alguien viene y dice tener esto y lo otro pero en realidad plagia y cuando le pides mas datos no responde y se va. 

Cosme_Fulanito

Qué postura más inapropiada la tuya.

Hoy cuando llegue a casa busco, es probable que tenga algo pero no puedo estar seguro.

surbyte

Bueno contigo me disculpo Cosme porque te confundí con otro caso similar. 
Respecto de mi postura y con las disculpas del caso, sostengo lo dicho, porque lo veo a diario.

Muchos afirman algo y luego lo encuentras en internet. En todo caso., eres la excepción que confirma la regla!!! 




Cosme_Fulanito

"Tamo'"

¡De todas formas una demora de un día en contestar! No era para tanto. :D

Cosme_Fulanito

Bueno... existía un boceto de cuando la empecé a hacer... se ve que después me ganó el apuro de terminarla y lo dejé incompleto.

De todas formas he aquí uno nuevo... primera vez que uso Fritzing, y se nota. :D

http://imgur.com/BQrXozo (3900 x 3738)

Sobre el funcionamiento... hay tres juegos, oportunamente denominados 1, 2 y 3.

Juego 1.

Se selecciona una longitud de clave, digamos 3. La bomba elige un número al azar de esa longitud.

Para desactivar la bomba se debe ingresar el código correcto. En cada intento, la bomba despliega la cantidad de dígitos que se adivinaron correctamente.

Por ejemplo, si el código es 123, y el usuario ingresa 333, la bomba dirá "bien: 1", por el último dígito que es 3.

Juego 2.

Se selecciona una clave específica y debe ser ingresada correctamente para desactivar (3 reintentos).

Juego 3.

Se selecciona al menos 1 cable que desactiva la bomba y al menos 1 que la hace explotar. El resto puede no hacer nada o acelerar el tiempo.

Para desactivarla lógicamente hay que cortar el/los cables correctos.

Al cortar un cable la bomba muestra "TIBIO", "FRIO" o "CALIENTE" en el LCD, según qué tan lejos esté el cable que uno cortó del que desactiva.



Después de configurar correctamente cualquiera de los juegos, la bomba queda armada, pero no cuenta el tiempo. El tiempo empieza a correr sólo cuando se saca el seguro, que es un simple botón que se detecta en on u off.

Lamentablemente no entiendo cómo hacer que la cámara tome la pantalla correctamente (por el brillo), pero el menú principal pide que se elija un juego en Bomba.ino::Configurar(), quien llama a la función configurar de cada juego con las funciones JuegoX.ino::JuegoX_Setup(), donde X lógicamente es 1, 2 o 3.

Cada juego en su setup(), setea tres variables que son punteros a función (o sea, contienen la dirección de memoria donde existe el código de una función particular), que son:

Code: [Select]

void (*Iniciar)(); //juego_step, se llama cuando arranca a correr el tiempo.
void (*VerificarDesactivacion)(); //Función para verificar si la bomba debe desactivarse. A setear por cada juego_setup().
void (*JuegoLoop)();//Llamada en cada ciclo del loop principal.


La bomba mantiene un estado (Bomba.ino::typedef enum Estados). Ese estado es modificado por los diferentes juegos / checkeos, y el loop() llama a las funciones que corresponda según el estado.

Puede verse, en el loop():

Code: [Select]

void loop(){
  CheckTapa();
  if (Estado == mDETONAR){
    Detonar();
  }else if (Estado == mELEGIRJUEGO){
    Configurar();
    char aux[4];
    TiempoAChar(aux);
    SPrint(aux);
    Segmentado.drawColon(true);
    Segmentado.writeDisplay();
    Estado = mLISTA;
  } else if (Estado == mLISTA){
    CheckSeguro();
  } else if (Estado == mACTIVADA){
    (*JuegoLoop)();
  };
}



Se revisa si la tapa está abierta o cerrada (para prender o apagar los LCD así se conserva la carga). Después, según el estado, se llama a detonar (activar el relé para hacer sonar la alarma), mostrar el menú de elección de juego, verificar el seguro (para empezar a contar el tiempo cuando corresponda), o llamar al loop del juego (el puntero a función), que hará lo que sea que haga dependiendo del juego.

El tiempo se cuenta con un timer interno, la función Bomba.ino::SetTimer()... no tengo ni idea qué hace, la copié de algún lado. :D Lo que sí se es que el tiempo se contabiliza con:

Code: [Select]

//Controles de tiempo
int TiempoRestante; //En segundos
int DuracionDelSegundo = 1000; //En milisegundos, para poder acelerar el tiempo si el juego lo requiere


La primera mantiene la cuenta de cuánto queda para llegar a 0. La segunda mantiene la cantidad de mili segundos que se consideran 1 segundo. Esto es para que los juegos puedan acelerar el paso del tiempo.

Por ejemplo puede observarse en Juego_1.ino::Juego1_Verificacion(), que si los intentos de desactivación sobrepasan cierta cantidad, DuracionDelSegundo pasa a ser 800 milis, y luego 500, o sea el doble de rápido de lo normal.

Por cierto:

La bocina que usé para la alarma Simplemente corté el cable del botón de encendido y lo contecté al relé.

El backpack I2C para el LCD 20x4

El display de segmentos también I2C


Ya que estamos, para certificar aunque no le vea la necesidad. http://imgur.com/wOpr9rE





Go Up