Coneccion Arduino Mega con Sistema de Pago

Hola amigos, hace poco me inicie en el mundo de arduino y mis conocimientos de electronica son demasiado basico asi que agradeceria mucho si me pueden ayudar con este proyecto, tengo una maquina expendedora a la cual tengo conectada 2 sistemas de pago, un lector de monedas (conectada a traves de un cable de 10 pines) y un lector de billetes(conectado a traves de un cable de 16 pines), al aceptar un billete o moneda envia un pulso LOW de 100ms por el pin correspondiente dependiendo de la moneda o billete aceptado y es reconocido por la expendedora.
Ahora lo que yo quiero hacer es conectar el Arduino Mega entre la maquina expendedora y los sistemas de pago sin afectar el funcionamiento normal de estos equipos, con la intencion de reconocer y reproducir los pulsos con el Arduino.
Es decir, quiero que el Arduino pueda reconocer que billetes o monedas que se ingresaron y tambien poder enviar un pulso a la expendedora simulando que se ingreso un billete o moneda.
Por las dudas aclaro que mi duda va solo por la parte de las conecciones electronicas ya que tengo muy pocos conocimientos.

Leer el ancho de un pulso... pulseIn()

Recrearlo... sería con un juego de delay y digitalWrite. En caso de que el tiempo sea demasiado específico, habría que "subir de nivel".

Lucario448
Hola, Muchas gracias por responder, el pulso tiene que ser de 100 ± 3 ms asi que no tiene mucho rango de error.
Disculpa mi ignorancia pero a que te refieres con "subir de nivel".
Las conecciones serian directas o a traves de algun componente electronico?

Cual es la intención de lo que quieres hacer?
Luce como una forma de estafa.
Si tu quieres leer lo que se esta contando y luego enviar, también puedes enviar otra cosa, mas o menos.

Se claro en las razones de este proyecto por favor y observa que lo destaco!

surbyte
Hace poco me inicie en el mundo del vending y me esta yendo bien, tengo varias maquinas expendedoras, y en mi tiempo libre estudio un poco de electronica y programacion, el problema es que de a poco estoy creciendo y no tengo control sobre las maquinas, me cuesta llevar una contabilidad, si se traba un billete o moneda (que suele suceder) tengo quejas de las personas y como estoy algo lejos no me esperan hasta que llegue y les solucione el problema, mi idea era poder tener la contabilidad de las maquinas a traves del arduino y si se traba un billete poder marcarle el dinero que se trabo desde mi casa para evitar los problemas.
Nose si queres alguna prueba, tambien tengo maquinas, lectores de billetes y monedas en mi casa si queres publico las fotos.
Edit: una cosa importante que me olvide mencionar es que aveces se traba un billete y moneda y nadie lo reclama y puede pasar un tiempo hasta que voy a ver la maquina y como no funcionaba nadie pudo poner dinero y perdi el dinero de ese tiempo, el billetero y monedero tambien envia una señal uno del los pines cuando se traba para avisarme con el arduino.

Evidentemente no lees los privados!
No hagas reply de cada respuesta que se te da por favor. Solo agregas basura al foro.
La respuesta de lucario se lee y luego tu la repites.
Mi comentario se lee arriba del tuyo y uego lo repites, qué sentido tiene repetir cada respueta, si se comprende a quien le respondes, sino simplemente pones : Lucario tal cosa, Surbyte tal cosa y ya.
Edita ambos comentarios y retíralos por favor

Bien, me queda mas claro que tu tarea es de monitoreo.
Lo que no me queda claro es si estas esperando pulsos en un cable de ese cable plano o en varios porque luce como que cada cable lleva la información de un billete distinto o no te comprendí bien?

Sin son varios cables a monitorear, olvidate del pulsein().

Nachtmotte:
el pulso tiene que ser de 100 ± 3 ms asi que no tiene mucho rango de error.

Entonces es fácil de hacer.

Nachtmotte:
Disculpa mi ignorancia pero a que te refieres con "subir de nivel".

A técnicas que en código parecen ofuscadas; y que para un principiante suene demasiado. Hablo a lo referente a timers, registros y todo eso...

Nachtmotte:
Las conecciones serian directas o a traves de algun componente electronico?

Oh sí, lo había olvidado...

Si tan solo pudiera saber más sobre esos lectores; digo, hablas de medir ancho de pulsos, ¿pero es solo eso?.
Hay 5 líneas en cada conexión, lo que me hace pensar en SPI o un puerto paralelo de 4 bits.

Desconozco la interfaz de esos lectores; por lo tanto tampoco sabría decir si requiere componentes extra o no.
Es evidente que son señales pulsantes o posiblemente codificadas en binario; así que quizá una resistencia "pull-up" o "pull-down".

Pero reitero: sin información, todo es especulación...

surbyte
Perdon por lo del Quote, estaba acostumbrado a otro foro que me decia que tenia que poner Quote para saber a quien le estoy hablando.
No entiendo bien tu pregunta, el lector de billetes esta conectado por un cable plano de 16 pines y el lector de monedas por uno de 10 pines, en ambos sistemas tienen dedicado 4 pines para enviar el pulso del dinero, por ejemplo, lector de billetes: pin1:$2, pin2:$5, pin3:$10, pin4:$20, los 4 pines envian constantemente 5v, si se acepta un billete de $2 envia una señal de 0V por 100ms, solo acepta un billete a la vez y solo envia una señal por canal, pero durante el dia van a ingresar varios billetes y necesito que el arduino cuente cada uno que ingreso.

Lucario448
Por lo que se, tanto el lector de billetes como el de monedas trabaja en Paralelo.
En el manual dice "Outputs with 2K2Ω pull up".
Por si te interesa te dejo el Manual PDF del Billetero

O sea que tienes 4 bits para billetes y 4 bits para monedas. Son 8 bits que hay que vigilar.
8 bits es un puerto del Arduino, pero estar atento a 8bits que pueden cambiar sin saber cual exige que pensemos creativamente.

Yo me inclino ahora por un timer digamos a 1mseg o 100 useg x tick que vigile todo el puerto de 8 bits
Cuando detecte cambio cuenta ticks, con precisión. El bit indicará el billete o moneda. Muy fácil.
Ya lo hicimos antes y funciona perfecto.

Otra alternativa es con interrupciones de pin.

surbyte
Muchas gracias por la respuesta, la verdad aun se muy poco, no sabia nada de los timer, ahora que estuve leyendo un poco ya tengo una idea y entiendo lo que me dices.
Si hicieron algo parecido antes y tenes la informacion agradeceria mucho que me le pases para ayudarme a entenderlo mejor y poder hacerlo.

Si. Lo se… pero por mas que te la de… si eres nuevo en el tema no será fácil interpretarla.
Además me tengo que acordar como buscarla.
Ya cuando me venga el recuerdo lo hago.

Respecto del timer no te compliques hay librerías que te ayudan a hacerlo en forma mas entendible.
Solo imagina que le dices a un dispositivo presente en el Arduino, genera una señal a una frecuenca de 1000 hz o sea 1 mseg.
Entonces cada mseg se activa la interrupcion de tiempo.
La rutina de timer, entonces mira el puerto, en sus 8 bists y ve que estan todos en 1… entonces no hace nada
Pero en algun momento encuentra un bit en 0… y entonces activará un contador que se supene llegue a 100 con algun margen ± algo.
Cuando cuente 100 tu diras… ahh tengo un billete o moneda según corresponda.
y asi sucesivamente.

Se comprende?

surbyte
si lo comprendo, muchas gracias por la ayuda.

Este es el hilo Contador multiple.

Acá la historia era diferente. Era contar pulsos que podían llegar en cualquier entrada (4 máximo).

Pero el enfoque sirve.

Tampoco usa una rutina TIMER sino interrupciones.

Nachtmotte:
En el manual dice "Outputs with 2K2Ω pull up".

Había leído que la interfaz trabaja en colector abierto; por lo tanto el "estado activo" es bajo (como I2C).
Eso quiere decir que las salidas ya traen un "pull-up" de 2.2k ohm; aunque creo que es un valor bastante bajo pero más seguro.

Ahora mi pregunta es: ¿los pulsos pueden llegar al mismo tiempo, o sólo es uno a la vez pero en diferentes líneas?
Como en el hilo mencionando por surbyte; para responder inmediatamente al cambio de estado en un grupo de pines, retomo la idea de la interrupción de cambio de estado de pin (PCINT).

surbyte
Gracias por la informacion lo leero con detenimiento hasta poder entenderlo.

Lucario448
Los pulsos llegan solo una la vez en diferentes lineas.

Nachtmotte:
Los pulsos llegan solo una la vez en diferentes lineas.

Veo que ahora sí vamos progresando.

Ahora la siguiente pregunta: ¿Lo único que tiene que hacer el Arduino es validar el ancho del pulso? ¿Ese es todo el dilema?

Que hay que monitorear varias líneas está más que claro, pero ahora confírmame lo anterior para ahora sí proceder con más seguridad.

Dos enfoques: usar PCINT o sea interrupciones para cada pin o usar un TIMER y leer un puerto de 8 bits completo y ver su estado a una frecuencia que asegure que no perdemos nada.

Ambas funcionarán perfectamente.

Perdon por la demora en responder, no queria volver hasta tener aunque sea un pequeño avance.

Lucario448, si yo creo que para mi caso valdria solo con validar el ancho del pulso de cada canal para saber cuando ingreso un billete o moneda.

surbyte estuve leyendo un poco y buscando informacion respecto a lo que me comentaste y llegue hasta un video de una persona que mostraba como armo un analizador logico con un arduino mega asi que estuve buscando informacion sobre este y tratar de armarlo para ver si podria reutilizar el codigo y las conecciones.
Se me complico porque no explica las conecciones y el codigo es de otra persona a la cual le borraron la pagina donde lo publico.

Te dejo unas imagines de lo que intente, como dije al principio del post no se casi nada de electronica asi que lo conecte con lo poco que se de arduino y el lector de billetes para ver que lograba, por suerte nada se quemo, si quieres te paso el video o hago las conecciones en el Fritzing para que lo veas mejor.

El inconveniente que tengo es que solo reconoce el pulso de un solo tipo de billete, osea que es como si solo leyera un canal pero me muestra como si hubiera ingresado un billete por los 4 canales a la vez.


Vamos a ver si es que el analizador no nos está mintiendo. Prueba el siguiente código:

// Conectar los canales a los pines analógicos del 8 al 11

volatile byte pinState;
volatile boolean newState;

void setup() {
 DDRK = 0; // Pines analógicos del 8 al 11 como entradas
 PORTK = 15; // Pines analógicos del 8 al 11 en estado alto para coincidir con la interfaz
 Serial.begin(9600);
 PCMSK2 = 15; // Pines analógicos del 8 al 11 son los que van a desencadenar la interrupción
 PCICR = 4; // 
}

void loop() {
 if (newState) {
 unsigned long t = millis();
 Serial.print(pinState, BIN);
 Serial.print(" - ");
 Serial.println(t);
 newState = false;
 }
}

ISR(PCINT2_vect) {
 pinState = ~PINK; // Invertir los bits para que aparezca con 1 los canales activos
 newState = true;
}

OJO A LO QUE DICE AL PRINCIPIO:

// Conectar los canales a los pines analógicos del 8 al 11

Esto se debe a que no todos los pines funcionan para la interrupción de cambio de estado; pero los indicados sí.

Voy a explicar cómo funciona: conectas los canales a los pines antes indicados, sube el programa y abre el monitor serial que debe estar a 9600 baudios.

Cuando el estado de algún canal cambie, deberá aparecer algo como lo siguiente:

100 - 2364

Permíteme explicar cómo se lee eso:

100: es el estado de los canales representado en el sistema binario. Se lee de derecha a izquierda cuál texto árabe. El bit más a la derecha representa el estado del canal conectado al pin 8 analógico; y el bit más a la izquierda representa al pin 9, 10 u 11 analógicos, dependiendo de cuantos aparezcan.
Los bits/pines que no aparezcan, se sobreentiende que están en cero; por ende, son canales capturados como inactivos en el momento.
Si solo aparece un 0, todos los canales están inactivos; si solo aparece un 1, solo el conectado al pin 8 analógico está activo.

2364: momento (en milisegundos) en que ocurrió la interrupción. Por sí solo podría ser últil para validar el ancho del pulso.

Si al momento de las interrupciones se captura que más de un canal a la vez se activa, pues se evidenciaría que el modo de operar de la interfaz no es el esperado...