Control de créditos máquina recreativa

Hola muy buenas soy nuevo en este foro y en este mundillo (aunque tengo una ligera idea) tengo un problema … necesito hacer un sistema de “creditos” para mi maquina recreativa y no se como hacerlo …
Explico: Echamos una moneda, esta da en un final de carrera del monedero y envia una señal al arduino y mete 4 créditos ahora tenemos otro boton el que hará de “start” al darle te mete en el juego y te baja 1 crédito, cuando los créditos estén a 0 si le damos al boton no tiene que hacer nada (no da señal y no entra al juego) El conjunto tiene que tener 2 pulsadores (switch) un arduino uno (lo tengo ya en casa) y dos displays de 7 segmentos.

Edito:

Simplifico un poco el sistema … me olvido de “la señal” hacia la maquina y pongo un relé que este sea activado por el arduino cuando llege a 0 y se desactive cuando no sea 0 mas facil creo que imposible.

Solo quedaria editar el codigo para subir 4 creditos y no pasar del 0 al 9 o del 9 al 0 cuando subamos y lo del relé.

Muchas gracias de adelanto a ver si salgo de este problemón! Un saludo.

Añado una cosa mas ... cuando el contador llega a 0 que no cambie a 0 si le damos al boton de "start" hice un montaje algo parecido (solo contador) pero al bajar a 0 si le volvia a dar bajaba a 9 (estaba probando solo con 1 display)

te doy alguna orientacion de como haria yo algunas cosas pero tendras que currarte tu el codigo... el tema de los creditos lo haria con una interrupcion para evitar perder monedas,si miras en la referencia veras en que pines estan las dos del arduino y como funcionan.el cableado ,si en el monedero tienes un contacto na o normalmente abierto pasas un cable desde 5v del arduino pasando por el contacto y lo metes en el pin que corresponda a la interrupcion con una resistencia pulldown o pullup segun disparador de interrupcion.declaras una variable global del tipo volatile y en la funcion que llamas le añades los creditos.el boton de start idem pero aqui no es necesaria la interrupcion y puedes usar cualquier pin digital como entrada y preguntar con un if en cada loop si se ha pulsado el boton y credito es mayor que 0 ,pues se resta un credito . Interrupciones resistencias pullup resistencias pulldown

También haría falta alguna forma de decirle al arduino, que el juego está en marcha, y que no descuente creditos al volver a pulsar start, mientras esté en marcha.

Otra movida es ya detectar el valor de la moneda...

carmeloco:
También haría falta alguna forma de decirle al arduino, que el juego está en marcha, y que no descuente creditos al volver a pulsar start, mientras esté en marcha.

Otra movida es ya detectar el valor de la moneda…

Cuando estemos dentro del juego tambien podremos gastar creditos (game over xD) sobre el valor de la moneda … olvidalo xD

Gracias por responder.

jose: te doy alguna orientacion de como haria yo algunas cosas pero tendras que currarte tu el codigo... el tema de los creditos lo haria con una interrupcion para evitar perder monedas,si miras en la referencia veras en que pines estan las dos del arduino y como funcionan.el cableado ,si en el monedero tienes un contacto na o normalmente abierto pasas un cable desde 5v del arduino pasando por el contacto y lo metes en el pin que corresponda a la interrupcion con una resistencia pulldown o pullup segun disparador de interrupcion.declaras una variable global del tipo volatile y en la funcion que llamas le añades los creditos.el boton de start idem pero aqui no es necesaria la interrupcion y puedes usar cualquier pin digital como entrada y preguntar con un if en cada loop si se ha pulsado el boton y credito es mayor que 0 ,pues se resta un credito . Interrupciones resistencias pullup resistencias pulldown

Perdoname jose pero me quedé igual o peor ._. la moneda no se pierde y si no cuenta cae por la rendija de devolución. Ahora pondré una imagen de lo que hice en un principio.

Aqui tengo la idea inicial, por un lado funciona cumple la funcion de subir y bajar pero no la de tope, subir de 4 en 4 y la señal. Esta sacado de esta web http://panamahitek.com/control-de-display-7-segmentos-mediante-pulsadores/

Me refiero a perder el pulso de la moneda ,no la moneda en si ,no se que tipo de micro tienes para controlar la moneda ,pero si es de esos que al pasar la moneda activa un micro-interruptor seria muy dificil captar el pulso justo en el momento que pasa la moneda sin usar interrupcion. por cierto si puedes pon el codigo tambien (usa los tags para codigo)

jose: Me refiero a perder el pulso de la moneda ,no la moneda en si ,no se que tipo de micro tienes para controlar la moneda ,pero si es de esos que al pasar la moneda activa un micro-interruptor seria muy dificil captar el pulso justo en el momento que pasa la moneda sin usar interrupcion.

Al caer la moneda esta baja la patilla hasta el final ya esta probado además es bastante sensible.

Esta mañana e montado el circuito con el código que viene en la web y va bien solo tengo que añadirle que al llegar a 0 no baje mas, al llegar a 9 no suba mas (solo con 1 display) y tengo que hacer que sume 4 no de 1 en 1.

Aqui dejo el codigo del boton de incremento y el de decremento

void loop()
{
//Botón de Incremento.
EstadoBotonIncremento=digitalRead(BotonIncremento);
if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento)))
{
cuenta++;
if(cuenta>9)
{
cuenta=0;
}
}
EstadoBotonAnteriorIncremento = EstadoBotonIncremento;

//Botón de Decremento.
EstadoBotonDecremento=digitalRead(BotonDecremento);
if((EstadoBotonDecremento != EstadoBotonAnteriorDecremento)&&(antirebote(BotonDecremento)))
{
cuenta–;
if(cuenta<0)
{
cuenta=9;
}
}
EstadoBotonAnteriorDecremento = EstadoBotonDecremento;
actualizarNumero(cuenta);
}

Que parte del código o que tendria que añadir para poder hacer eso?

Pd. Jose e conectado el switch del monedero y no da problemas.

A ver si lo entiendo ,los creditos van de 0 a 9 ,se gastan de 1 en 1 y no pueden bajar de 0 ,pero si se introduce una moneda aumenta en 4 pero no pueden ser mas de 9 ,es asi?

9 es el maximo de 1 display me gustaria ponerle aunque sea otro mas (no se como) para tener un poco mas de margen y si es asi es como las tragaperras metes 1 euro te dan unos 6 juegos (creo xd) vas tirando y te va descontando cuando llegas a 0 se rie en tu cara asi de facil xD

Con el esquema que has puesto, te vas a cargar el arduino. Estás metiendo 9 v a los pines 9 y 10, cada vez que le das a uno de los pulsadores.

Yo metería los 9 v para alimentar el arduino, y la salida de 5 v del arduino para los pulsadores.

A lo que yo me refería con el pulsador, es que si alguien pulsa antes del “game over”, si el juego no le dice que está en marcha, se descuentan créditos igualmente.

Otro problema que encuentro en el esquema, es que se usa el pin 1 para el display, de forma que puedes tener problemas en el momento de cargar el sketch por usb, ya que ese es uno de los pins de la puerta serie.

Respecto al código que has puesto, está incompleto. Por favor, ponlo entero, usando el icono de la hoja con los símbolos <>

Estoy alimentando el arduino con la pila de 9 voltios desde el conector jack 2.1 y uso la salida de 5v.
Sobre el pulsador … eso es lo que tiene que hacer consumir creditos para tener mas juegos (el contador del arduino iria independiente al del juego es decir en el arduino tendrias 4 creditos le das al start y te suma un credito al juego)

int BotonIncremento=9;//botón de incremento 
int BotonDecremento=10;//botón de decremento
int timeAntirebote=15;//un valor entre 10 y 15 nos da una lectura correcta del estado del botón.

int cuenta=0;//lleva la cuenta
int EstadoBotonIncremento;
int EstadoBotonDecremento;
int EstadoBotonAnteriorIncremento;
int EstadoBotonAnteriorDecremento;

//Función Antirebote
boolean antirebote(int pin){//esta función nos va a devolver un valor booleano.
  int contador=0;
  boolean estado; //guarda el estado del botón
  boolean estadoAnterior;//guarda el último estado del botón

 do {
   estado=digitalRead(pin);
   if (estado != estadoAnterior){
     contador=0;
     estadoAnterior = estado;
   }
  else{
    contador = contador + 1;
  }
  delay(1);
 }
 while(contador < timeAntirebote);
 return estado;
}

void setup(){
   pinMode(BotonIncremento,INPUT);//los botones los declaramos como entradas
   pinMode(BotonDecremento,INPUT);
  DDRD=B11111110;
 }  

void actualizarNumero(int valor){
  //puerto 0 libre
//puerto 1 al 7 display
  byte numero[10]={B11111100,B00011000,B01101110,B00111110,B10011010,B10110110,B11110110,B00011100,B11111110,B10011110};
  PORTD=numero[valor];
}

 void loop()  {
   //Botón de Incremento.
   EstadoBotonIncremento=digitalRead(BotonIncremento);//leemos el botón
   if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento))){//preguntamos si hay cambio respecto al estado anterior y vemos si esta presionado
       cuenta++;//aumentamos la cuenta
       if(cuenta>9){//aquí establecí un parámetro para respetar a la cuenta por asi llamarlo.
         cuenta=0;//en este caso si es mayor que 9 se vaya a cero (0).
       }
   }
   EstadoBotonAnteriorIncremento = EstadoBotonIncremento;//guardamos el estado del botón

   //Botón de Decremento.
   EstadoBotonDecremento=digitalRead(BotonDecremento);//leemos el estado del botón
   if((EstadoBotonDecremento != EstadoBotonAnteriorDecremento)&&(antirebote(BotonDecremento))){
       cuenta--;//disminuimos la cuenta
       if(cuenta<0){
         cuenta=9;
       }
   }
   EstadoBotonAnteriorDecremento = EstadoBotonDecremento;
   actualizarNumero(cuenta);
 }

Este es el código que uso (es el mismo de la web de donde lo saqué)

y la recreativa es comercial,te las estas haciendo con mame o similar ?? hay que sacarte los datos con cuentagotas......

Jajajajaja la maquina era una que compre comercial la restauré le cambie unas cuantas cosas y ahi esta ... casi le e cambiado todo lo que tiene en su interior hace poco le tocó a la fuente y no le falta mucho para cambiar la pantalla.

Edito y simplifico un poco el sistema ... me olvido de "la señal" hacia la maquina y pongo un relé que este sea activado por el arduino cuando llege a 0 y se desactive cuando no sea 0 mas facil creo que imposible.

Solo quedaria editar el codigo para subir 4 creditos y no pasar del 0 al 9 o del 9 al 0 cuando subamos y lo del relé.

Cambié el codigo y ya e resuelto uno de los problemas … que al llegar a 0 no haga nada y al 9 lo mismo

/* se declaran las contantes para identificar cada led*/
const int a = 2;
const int b = 3;
const int c = 4;
const int d = 5;
const int e = 6;
const int f = 7;
const int g = 8;
const int BtnIncremento = 9; // boton de incremento conectadoa al pin 9
const int BtnDecremento = 10; // boton de decremento conectadoa al pin 10

const int tiempoAntirebote =10;
int cuenta =0; //lleva la cuenta
int estadoBtnIncremento;
int estadoBtnIncrementoAnterior;
int estadoBtnDecremento;
int estadoBtnDecrementoAnterior;

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;                    // reiniciamos el contador 
     estadoAnterior= estado;
   }
   else{
     contador = contador +1;          // aumentamos el contador en 1
   }
   delay (1);
 }
 while (contador < tiempoAntirebote);
 return estado;
}
/* Metodo para elegir que numero mostrar en el display*/
void actualizarNumero(){
 switch (cuenta) {
 case 0:
   /*Bloque para mostrar un 0*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, HIGH);
   digitalWrite(f, HIGH);
   digitalWrite(g, LOW);
   break;
 case 1:
   /*Bloque para mostrar un 1*/
   digitalWrite(a, LOW);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, LOW);
   digitalWrite(e, LOW);
   digitalWrite(f, LOW);
   digitalWrite(g, LOW);
   break;
 case 2:
   /*Bloque para mostrar un 2*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, LOW);
   digitalWrite(d, HIGH);
   digitalWrite(e, HIGH);
   digitalWrite(f, LOW);
   digitalWrite(g, HIGH);
   break;
 case 3:
   /*Bloque para mostrar un 3*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, LOW);
   digitalWrite(f, LOW);
   digitalWrite(g, HIGH);
   break;
 case 4:
   /*Bloque para mostrar un 4*/
   digitalWrite(a, LOW);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, LOW);
   digitalWrite(e, LOW);
   digitalWrite(f, HIGH);
   digitalWrite(g, HIGH);
   break;
 case 5:
   /*Bloque para mostrar un 5*/
   digitalWrite(a, HIGH);
   digitalWrite(b, LOW);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, LOW);
   digitalWrite(f, HIGH);
   digitalWrite(g, HIGH);
   break;
 case 6:
   /*Bloque para mostrar un 6*/
   digitalWrite(a, HIGH);
   digitalWrite(b, LOW);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, HIGH);
   digitalWrite(f, HIGH);
   digitalWrite(g, HIGH);
   break;
 case 7:
   /*Bloque para mostrar un 7*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, LOW);
   digitalWrite(e, LOW);
   digitalWrite(f, LOW);
   digitalWrite(g, LOW);
   break;
 case 8:
   /*Bloque para mostrar un 8*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, HIGH);
   digitalWrite(f, HIGH);
   digitalWrite(g, HIGH);
   break;
 case 9:
   /*Bloque para mostrar un 9*/
   digitalWrite(a, HIGH);
   digitalWrite(b, HIGH);
   digitalWrite(c, HIGH);
   digitalWrite(d, HIGH);
   digitalWrite(e, LOW);
   digitalWrite(f, HIGH);
   digitalWrite(g, HIGH);

 }
}

void setup(){
 /*Declaramos los segmetos del display como salidas*/
 pinMode(a, OUTPUT);
 pinMode(b, OUTPUT);
 pinMode(c, OUTPUT);
 pinMode(d, OUTPUT);
 pinMode(e, OUTPUT);
 pinMode(f, OUTPUT);
 pinMode(g, OUTPUT);
 /*Declaramos los botones como entradas*/
 pinMode(BtnIncremento, INPUT);
 pinMode(BtnDecremento, INPUT);

}

void loop() {
 estadoBtnIncremento = digitalRead(BtnIncremento);
 if (estadoBtnIncremento  != estadoBtnIncrementoAnterior) {     // si hay cambio con respeto al estado 
   if (antirebote (BtnIncremento)){ //checamos  si esta preionado y si lo esta 
     cuenta++;                                //aumentamos la cuenta
     if (cuenta > 9){ 
       cuenta = 9;
     }
   }
 }
 estadoBtnIncrementoAnterior = estadoBtnIncremento;              // guardamos el estado del boton

 estadoBtnDecremento = digitalRead(BtnDecremento); //leemos el estado del boton
 if (estadoBtnDecremento  != estadoBtnDecrementoAnterior) {     // si hay cambio con respeto al estado anterior
   if (antirebote (BtnDecremento)){ //si el boton esta presionado disminuimos la cuenta
     cuenta--;                              
     if (cuenta<0){

       cuenta = 0;
     }
   }
 }
 estadoBtnDecrementoAnterior = estadoBtnDecremento;  //guardamos el estado del boton 

 actualizarNumero(); //desplegamos la cuenta en el display
}

Solo queda aumentar la cuenta a 4 es decir que en vez de sumar 1 sume 4 y lo del relé.

En vez de cuenta ++ pon cuenta = cuenta + 4

jose: En vez de cuenta ++ pon cuenta = cuenta + 4

Algo de eso tenia que ser xD yo estaba toqueteandolo poniendo cuenta +4 o cosas de ese estilo xD pues ya lo tengo todo también puse el relé añadiendo

const int r = 11;

En el bloque del 0

digitalWrite(r, HIGH)

y en los demás donde tiene que estar apagado

digitalWrite(r, LOW);

y el pin como salida

pinMode(r, OUTPUT);