ARDUINO NANO LEYENDO VALIDADORES DE MONEDAS


Comparto este código para leer validadores de monedas, así que aprovecho para crear una nueva entrada en este blog y de ese modo explicar el código compartido. Explicaré de manera básica como podemos leer las señales de un validador de monedas con una placa arduino, en mi caso una arduino nano. Después cada uno puede usarlo como le parezca, yo por ejemplo he empleado este montaje con un LCD 16x2 y un pulsador en cafeteras LB2500. Esta máquina dispone de una entrada de pulsos para activar créditos, de manera que si pongo un precio en el arduino de 0.50, arduino empieza a leer monedas y acumular sus valores como saldo. Cuando activamos el pulsador, la placa envía a la máquina los pulsos resultantes de dividir el saldo entre el precio: pulsos=saldo/precio. En el caso de acumular 1 euro mandará dos pulsos, la máquina entonces nos da 2 servicios y el saldo se actualiza, restando el importe de los 2 servicios.  

Echemos un vistazo al conector del validador y aclaramos a que corresponde cada pin: 


Los pines 1 y 2 corresponden a la alimentación del validador, pin 1 GND y pin 2 +12v respectivamente. Los pines 7 / 8 / 9 / 10 / 3 / 4  corresponden a los canales CH 1/ CH 2 / CH 3 /CH 4 / CH 5 / CH 6 respectivamente. El pin  6 sirve para inhibir el validador. Si a este pin mandamos una señal de +5v el validador no admite monedas, devolviéndolas por la rampa de devolución. Si por ejemplo tenemos la máquina fuera de servicio, activamos este pin para que no admita monedas.

Una vez aclarado a que corresponde cada pin, decir que en las cafeteras de vending los validadores más usados funcionan como reconocedores paralelo y en algunos casos como binario. El ejemplo corresponde a un RECONOCEDOR PARALELO. Echemos un vistazo a la tabla siguiente:
Las dos primeras columnas se han explicado en el párrafo anterior, correspondiendo al número de pin y canal, las otra paso a explicarlas. La columna BINARIO corresponde a un número binario según el número de canal en el modo paralelo, pero... ¿y la columna ENVÍA? Bueno, llegado a este punto, aclarar que la columna BINARIO corresponde a señales positivas y la columna ENVÍA corresponde a señales negativas. Nos encontramos en electrónica muchos casos donde se trabaja con señales negativas, no pasa nada, es justo lo opuesto a una señal positiva. Si miramos la tabla, podemos observar como donde hay un 1 en BINARIO hay un 0 en ENVÍA y donde hay un 0 en BINARIO hay un 1 en ENVÍA. ¿En qué nos afecta esto? púes que cuando se introduce una moneda en el canal CH 1 en vez de obtener el decimal 1 vamos a comparar con el decimal 62, en el canal CH 2 obtendremos 61, etc. 

Esquema básico:

Es importante consultar el manual del validador para la correspondencia canal/valor moneda y adaptar el código a dichos valores. Este ejemplo está hecho con un Comestero RM5 en modo paralelo. En mi caso además de un display LCD 16x2 he usado un módulo bluetooth HC-05 para comunicarlo con dispositivos móviles y adaptado el código para validadores en modo binario. Desde un dispositivo movil  con conexión bluetooth puedo cambiar los valores de los canales, configurar el modo de trabajo paralelo/binario y cambiar el precio del servicio.



Código ARDUINO NANO OLD BOOTLOADER / ARDUINO DUEMILANOVE BOOOLOADER, no funciona con otros bootloaders ni se ha probado en otras placas:

/*
ARDUINO LEYENDO VALIDADORES DE MONEDAS
PROGRAMADO POR JUAN A. GOMEZ PARA FORO ARDUINO
POR FAVOR, MANTENER ESTAS LINEAS COMO PREMIO AL ESFUERZO DEL AUTOR

ARDUINO READING COINS VALIDATORS
CODE BY JUAN A. GOMEZ / ARDUINO FORUM
PLEASE KEEP THIS LINES AS APPRECIATION TO THE AUTHOR
*/

// ***  MODO PARALELO - PARALLEL MODE  ***
// LOS VALORES DE CANALES, DEBEN COINCIDIR CON LOS DE VALIDADOR DE MONEDAS
// CHANNELS VALUES MUST MATCH WITH COIN VALIDATOR CHANNELS

int canal1=100; // VALOR EN CENTIMOS DEL CANAL 1 - VALUE IN CENTS OF THE CHANNEL 1
int canal2=200; // VALOR EN CENTIMOS DEL CANAL 2 - VALUE IN CENTS OF THE CHANNEL 2
int canal3=5; // VALOR EN CENTIMOS DEL CANAL 3 - VALUE IN CENTS OF THE CHANNEL 3
int canal4=10; // VALOR EN CENTIMOS DEL CANAL 4 - VALUE IN CENTS OF THE CHANNEL 4
int canal5=20; // VALOR EN CENTIMOS DEL CANAL 5 - VALUE IN CENTS OF THE CHANNEL 5
int canal6=50; // VALOR EN CENTIMOS DEL CANAL 6 - VALUE IN CENTS OF THE CHANNEL 6
int lectura=0; // VALOR DE LA LECTURA DE LA MONEDA - COIN PRESENT VALUE
int Acumulado=0; // SUMA ACUMULADA DE LAS MONEDAS - COINS ACCUMULATED VALUE

void setup() {
 Serial.begin(9600);  
 Serial.println("Arduino Forum");
 Serial.println("Reading coins validators ");
 Serial.println("By ELIOMATIC SOLUTIONS 2019 v.1.0 Seville - Spain");
 Serial.println("");  
 DDRB = B000000; // Establece el puerto B como entradas
 PORTB= B111111; // Configura las entradas como Pull-up (se activan con señales negativas)

 /*
 ARDUINO PIN D8 CH1
 ARDUINO PIN D9 CH2
 ARDUINO PIN D10 CH3
 ARDUINO PIN D11 CH4
 ARDUINO PIN D12 CH5
 ARDUINO PIN D13 CH6
 */  
}

/*
https://eliomaticsat.blogspot.com/2019/02/arduino-nano-leyendo-validadores-de.html
EN EL TUTURIAL SE EXPLICA COMO TRADUCIR LOS VALORES BINARIOS LEIDOS AL CANAL CORRESPONDIENTE
TUTORIAL DOCUMENT EXPLAINS HOW TO CONVERT VALUES READ TO THE COIN VALIDATOR CHANNEL
*/

void loop() {
 if(PINB!=63){
   lectura=63-PINB;
   switch (lectura) {
     case 1:
       Acumulado=Acumulado+canal1;
       Serial.println(float(Acumulado)/100);
     break;
     case 2:
       Acumulado=Acumulado+canal2;
       Serial.println(float(Acumulado)/100);
     break;
     case 4:
       Acumulado=Acumulado+canal3;
       Serial.println(float(Acumulado)/100);
     break;
     case 8:
       Acumulado=Acumulado+canal4;
       Serial.println(float(Acumulado)/100);
     break;
     case 16:
       Acumulado=Acumulado+canal5;
       Serial.println(float(Acumulado)/100);
     break;
     case 32:
       Acumulado=Acumulado+canal6;
       Serial.println(float(Acumulado)/100);
     break;      
   }
   delay(100);
 }  
}

Comentarios

  1. Buenas, me interesa mucho este tema ¿Me podrías proporcionar el esquela y el código fuente? Es que no están disponibles en esta página. Un saludo y gracias.

    ResponderEliminar
    Respuestas
    1. Hola, perdona no haberte contestado antes. Echa un vistazo en:

      https://forum.arduino.cc/index.php?topic=386176.15

      Cualquier duda me mandas un privado. Ando muy liado y tengo el blog un poco desatendido.

      Saludos

      Eliminar
  2. Hola, Estoy probando varios validadores RM5 pero no tengo claro el voltaje de los pulsos de salida, he probado con un analizador lógico y los pulsos son solo de unos mV. Alimentando el validador con 12V ¿Cuál debería se el voltaje de los pulsos?
    Gracias

    ResponderEliminar
    Respuestas
    1. Perdona por no haberme dado cuenta antes de tu mensage. En reposo deben de tener dodos los canales 5v con respecto a masa. Cuando introducimos una moneda el canal correspondiente se pone a 0v. En la tabla anterior indico las correspondencias para el modo paralelo. Trabaja con señales negativas.

      Saludos

      Eliminar
  3. Hola, si este mismo codigo y esquema lo hacemos con una placa Arduino UNO, deberiamos agregar o cambiar algo?? porque no me funciona. Es un monedero de la marca Comestero RM5 evolution.
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. No tengo a mano una placa arduino uno, pero el código debe funcionar. Más bien deber de comprobar en que modo está trabajando el monedero, en nuestro caso lo debemos configurar en modo paralelo. Para ello te remito a esta entrada

      https://eliomaticsat.blogspot.com/2019/02/cable-usb-rs232-ttl.html

      Cualquier cosa me comentas

      Eliminar

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *