Go Down

Topic: Proyecto Monedero (Read 3281 times) previous topic - next topic

_jose_

#15
Jan 20, 2018, 02:53 pm Last Edit: Jan 20, 2018, 03:04 pm by _jose_
Vigila con las salidas de J1 ,si son a 12v no las puedes meter directamente a las entradas de arduino...

TELO2254

Gracias , te cuento
El 1 es 12v
2 y 6 gnd
Cada salida sale por gnd más su salida, no sé si me explico bien.
Gnd usa en común el Arduino y el monedero
A parte de esto en el último post  suprimo los de los led pero que lo veo que no tiene para esto mucho sentido encender un led y que al mismo tiempo en el lcd me diga que salida es, solo con indicarme en el lcd que salida es me vale

TELO2254

La j1 del monedero va con fuente de alimentación a parte

_jose_

Tendras que intercalar algo entre el conector J1 y las entradas del arduino que funcionan con 5v.Suponiendo que ese conector J1 esta en el monedero de la maquina que quieres verificar,y que esta alimentado por la propia fuente de la maquina ,quizas lo mas adecuado serian optoacopladores.Tal vez pudieras hacerlo con divisores de tension,los mas expertos en electronica te diran si en esas condiciones es lo mas adecuado.Si aun no has comprado el lcd ,te recomiendo uno para conexion I2C ,ahorraras cableado ,aunque veo que usas un mega y vas sobrado de pines. 

surbyte

Mejor que divisores sería usar optoacopladores. Y garantizas 0 problemas entre entrada y salida.

Algo asi solo para entender la idea



los 12V de tu salida monedero solo accionan los leds del optoacoplador. Digamos a 10mA o menos por led. Algo que debe poder entregar asi que una R de 120 ohms para 10 o mas para tener menos corriente irá bien.

Del lado del transistor optoacoplado una R de 4k7 o 10k y de la salida olvida el esquema que es para un PIC y es lo mismo para Arduino, a tus entradas

Eso lo repites por cada entrada.

noter

#20
Jan 20, 2018, 06:00 pm Last Edit: Jan 20, 2018, 06:07 pm by noter
Bueno. Como suponía, el resto de pines no tienen (y lo más importante, no tendrán) influencia en los valores. Se podría haber simplificado más aún, utilizando los pines de un puerto determinado y leyendo el puerto directamente, pero como no tenía seguro el extremo anterior, lo hice un poco más abierto. Más sencillo, incluso, si estuvieras dispuesto a cambiar la nomenclatura de tus leds para quitar los huecos.
Prueba a ver este código. Compila, aunque está sin probar; pero debería hacer algo.
Code: [Select]

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// ESTADO DE LOS LED. SI NECESITAMOS MÁS DE 8 HAY QUE CAMBIAR TIPO A INT
byte estaoLeds=0;

struct {
      byte numeroLed;
      int pin;
} leds [] = {
      {3, 41}, {4, 43}, {5, 45}, {7, 47}, {8, 49}, {9, 51}, {10, 53}
};

const byte totalLeds = sizeof(leds)/sizeof(leds[0]);

void setup()
{
      lcd.begin(16, 2);           // Fijamos el numero de caracteres y filas
      lcd.clear();
      lcd.print("    PROBADOR ");  // Aqui va la primera linea con mensaje en espera
      lcd.setCursor(0, 1);    // Ponte en la linea de abajo 1, posicion 5
      lcd.print("   DE MONEDAS "); // Aqui va la segunda linea con mensaje en espera
      delay(2000);
      lcd.clear();

      for(int i=0; i<totalLeds; i++){
            pinMode(leds[i].pin, INPUT);   
      }
}

void loop()
{
      byte nuevoEstadoLeds=0;
      for(int i=0; i<totalLeds; i++){
            // Si el led está en HIGH, establecemos el bit correspondiente en nuevoEstado
            if (digitalRead(leds[i].pin)) {
                  bitSet(nuevoEstadoLeds, i);
            }
      }

      // Si ha cambiado algún bit, refrescamos la pantalla
      if (estaoLeds != nuevoEstadoLeds) {
            estaoLeds = nuevoEstadoLeds;
            refrescaPantalla();
      }
}

void refrescaPantalla(void)
{
      lcd.setCursor(0, 0);
      lcd.print(" SALIDAS ");
      for(int i=0; i<totalLeds; i++){
            if(bitRead(estaoLeds, i))
                  lcd.print( leds[i].numeroLed);
            else
                  lcd.print(" ");
      }
      lcd.setCursor(0, 1);
      lcd.print("    VALOR ");
      lcd.print(estaoLeds);
      delay(1000);
}


Prueba y comenta.
Saludos.

TELO2254

#21
Jan 20, 2018, 06:48 pm Last Edit: Jan 20, 2018, 07:04 pm by surbyte
Surbyte, creo que no habéis entendido que el monedero coge los 12v para su funcionamiento aparte y solo para eso una vez funciona no actúa para nada esos 12v con el Arduino , para dar señales usa los pines  gnd y salida que son unos 2 o 3 v

TELO2254

#22
Jan 20, 2018, 06:56 pm Last Edit: Jan 20, 2018, 07:30 pm by TELO2254
Noter: Luego lo pruebo ahora no tengo PC estoy con móvil , creo que me estás entendiendo perfectamente, donde pongo texto VALOR es para poder poner valor de la moneda según combinación de salidas , en el primer post pongo la combinación que existe .
Al encender el aparato:
    " PROBADOR "
  " DE MONEDEROS "
Mientras no se introduzcan monedas:
    " INSERTE "
   " MONEDAS "
Si se introduce una moneda 0,05
      " SALIDAS 3  4  7 "
     " VALOR  0,05 ctm "
Así me gustaría quedarlo

surbyte

A ver.. llevamos 21 post intentando entenderte!! Entonces el que no sabe explicarse eres tu.

Dime donde dices que la salida entrega 2 a 3V?

Aun ahi no hay drama en usar los optos, mejor aun ya que con 2V no podras accionar la entrada del arduino. Con 3 vaya y pase, estas en el limite de lo que se llama tensión de entrada minima nivel Alto.

Con 2 o 3 V en las salidas de tu monedor a probar, usas una R de

R = (2-1.5)/10mA = 50 ohms o sea 47 ohms e irá bien.

El resto como ya te indiqué.

TELO2254

Perdónarme por no explicarme bien y sobre todo por no saber nada de nada , llevo unos 7 días con el tema Arduino , antes ni sabia ni que era y me cuesta entender y explicar lo que quiero por mí más alta torpeza.
El código que puse que después borré y el que tengo ahora en el hilo es de mucho ver vídeos y sacar pequeños conceptos , algunos de ellos los entiendo y otros no.
Gracias por la ayuda y gracias por la paciencia

TELO2254

#25
Jan 20, 2018, 10:31 pm Last Edit: Jan 22, 2018, 09:47 pm by surbyte
Quote from: noter
Prueba y comenta.
NO ME FUNCIONA, al iniciar me da el mensaje de bienvenida y despues me sale :
salidas 3457891
valor 127
si introduzco una moneda  me borra las salidas correspondientes bien menos la 3 que no hace nada y en la fila de abajo en valor me pone valor y unos  datos que no comprendo segun moneda pone de menos a mas 101,111,117,119

noter

¿Quieres decir que las salidas están invertidas? ¿Que en lugar de encender el número correspondiente se apaga?
En cuanto a lo del led3, revisa la definición a ver si lo tienes conectado al pin correspondiente. Cada una de las parejas indica el nombre (número) de led y el pin al que va conectado:
      {3, 41}, {4, 43}, {5, 45}, {7, 47}, {8, 49}, {9, 51}, {10, 53}

así que el led3 irá en pin 41, el led 4 en 43, etc.
El número que aparece en valor, no te preocupes. Una vez que se representen los pines correctamente en la línea superior, te contaré cómo trabajar con ese valor.

TELO2254

¿Quieres decir que las salidas están invertidas?
Eso es he cambiado esto y ya funciona menos el 3 que no se que pasa, estan bien la salida a su sitio
  if(bitRead(estaoLeds, i))
 lcd.print( " ")
else
   lcd.print( leds.numeroLed);
     

noter

#28
Jan 20, 2018, 11:20 pm Last Edit: Jan 20, 2018, 11:21 pm by noter
Prueba a ver de esta otra forma. He cambiado tres cosas:
- He invertido la lógica (como has hecho tú, pero en la lectura, en lugar de en la impresión).
- He agregado un espacio más si el número a tapar es el 10 (son dos cifras a borrar).
- He quitado la pausa, a ver si es la causa de que no aparezca el 3.
Code: [Select]

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// ESTADO DE LOS LED. SI NECESITAMOS MÁS DE 8 HAY QUE CAMBIAR TIPO A INT
byte estaoLeds=0;

struct {
      byte numeroLed;
      int pin;
} leds [] = {
      {3, 41}, {4, 43}, {5, 45}, {7, 47}, {8, 49}, {9, 51}, {10, 53}
};

const byte totalLeds = sizeof(leds)/sizeof(leds[0]);

void setup()
{
      lcd.begin(16, 2);           // Fijamos el numero de caracteres y filas
      lcd.clear();
      lcd.print("    PROBADOR ");  // Aqui va la primera linea con mensaje en espera
      lcd.setCursor(0, 1);    // Ponte en la linea de abajo 1, posicion 5
      lcd.print("   DE MONEDAS "); // Aqui va la segunda linea con mensaje en espera
      delay(2000);
      lcd.clear();

      for(int i=0; i<totalLeds; i++){
            pinMode(leds[i].pin, INPUT);   
      }
}

void loop()
{
      byte nuevoEstadoLeds=0;
      for(int i=0; i<totalLeds; i++){
            // Si el led está en LOW, establecemos el bit correspondiente en nuevoEstado
            if (!digitalRead(leds[i].pin)) {
                  bitSet(nuevoEstadoLeds, i);
            }
      }

      // Si ha cambiado algún bit, refrescamos la pantalla
      if (estaoLeds != nuevoEstadoLeds) {
            estaoLeds = nuevoEstadoLeds;
            refrescaPantalla();
      }
}

void refrescaPantalla(void)
{
      lcd.setCursor(0, 0);
      lcd.print("SALIDAS ");
      for(int i=0; i<totalLeds; i++){
            if(bitRead(estaoLeds, i)) {
                  lcd.print( leds[i].numeroLed);
            }
            else {
                  lcd.print(" ");
                  // otro espacio para tapar el 10
                  if (leds[i].numeroLed>=10)
                        lcd.print(" ");
            }
      }
      lcd.setCursor(0, 1);
      lcd.print("VALOR: ");
      lcd.print(estaoLeds);
}

Prueba y cuenta.

TELO2254

Prueba a ver de esta otra forma. He cambiado tres cosas:
- He invertido la lógica (como has hecho tú, pero en la lectura, en lugar de en la impresión).
- He agregado un espacio más si el número a tapar es el 10 (son dos cifras a borrar).
- He quitado la pausa, a ver si es la causa de que no aparezca el 3.
nada incluso peor, por quitar la pausa, la salida 10 me da igual que sea 0 si es mas facil, mejor sin pausa

Go Up