Professional Documents
Culture Documents
V1.1
05/2012
ThinkChip
V1.1
05/2012
Instalacin
Al conectar el dispositivo MDB USB, el sistema operativo Windows tratar de buscar en su base de
datos el driver correspondiente, al no encontrarlo, le pedir al usuario que instale manualmente el
driver. Para windows XP es automtico la peticin de instalar manualmente el driver, pero en windows
vista y seven, se deber instalar desde administrador de dispositivos.
Al conectar el dispositivo convertidor MDB USB, aparecer en la carpeta de Otros dispositivos, como
se ve en la figura:
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
Buscamos la carpeta donde se encuentra el driver llamado Convertidor MDB USB, al aceptar e
instalar, aparecer la siguiente ventana, alertando, esto pasa por que en Windows no esta certificado el
dispositivo USB, seleccionamos Instalar este software de controlador de todas formas
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
Software
Las funciones y tareas que estn disponibles para esta versin del convertidor MDB USB son las
siguientes:
ThinkChip
V1.1
05/2012
Por default tiene 00000000-0000-0000-0000-000000000000, este nmero tiene que modificarse por :
a3c4dc3e-683a-4220-9279-cdba089ea343
Una vez modificado esta propiedad, podrmos empezar a trabajar en el programa.
En el archivo DLL existen diferentes funciones, a continuacin explicamos cada una de ellas, as como
un ejemplo de uso. En los siguientes ejemplos, la herramienta SimpleUSB se le ha dejado el nombre
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
OpenConnection()
Para el siguiente ejemplo del uso de esta funcin, se ha creado un botn, que al llamar al evento _Click
se conecta el dispositivo, este metodo puede variar facilmente dependiendo de su aplicacin.
private void button1_Click(object sender, EventArgs e)
{
simpleUSB1.OpenConnection();
}
Para desconectar el dispositivo se necesita llamar a la funcin
CloseConnection()
Para el siguiente ejemplo del uso de esta funcin, se ha creado un botn, que al llamar al evento _Click
se desconecta el dispositivo, este metodo puede variar facilmente dependiendo de su aplicacin.
private void button2_Click(object sender, EventArgs e)
{
simpleUSB1.CloseConnection();
}
Si se ha conectado existosamente el dispositivo MDB USB, se invocar a un evento llamado
_onDeviceConnect()
Si se ha desconectado exitosamente el dispositivo, se invocar a un evento llamado
_onDeviceDisconnect()
Ejemplo de uso:
ThinkChip
V1.1
05/2012
StartReadingInterruptEndPoint(2, 8)
Se recomienda llamar a esta funcin en el evento _onDeviceConnect(), como se ve en el ejemplo de
arriba, los parametros (2,8) son datos internos del funcionamiento del dispositivo y no deben de ser
modificados.
Detener Lectura de datos
Para detener la lectura de datos provenientes del dispositivo, se llamar a la funcin
StopReadingInterruptEndpoint()
Se recomienda llamar a esta funcin en el evento _onDeviceDisconnect()
ThinkChip
V1.1
05/2012
El dispositivo al ser conectado a la PC, empezar a escanear si existen dispositivos MDB conectados
como son Coin Changer y Bill Acceptors, en caso negativo, veremos el Led Error parpadear, esto
quiere decir que no existe ningun dispositivo conectado, para que el dispositivo pueda escanear
correctamente los dispositivos, debe haber desde luego al menos un dispositivo de cobro conectado, y
alimentado con una fuente de voltaje de por lo menos 24VDC a 2Amp.
En caso de que no se haya conectado la alimentacin de 24VDC y los dispositivos antes de conectar el
convertidor MDB USB a la PC, se necesita inicializarlo de nuevo.
Antes de llamar a la funcin que le dir al convertidor MDB, que, inicialice los dispositivos de cobro,
es necesario crear un buffer de datos de salida y de entrada.
byte[] OutputBuffer = new byte[32];
byte[] InputBuffer = new byte[32];
_onReadComplete()
Al llamarse al evento _onReadComplete, se avisa al sistema que un nuevo dato proviene del
convertidor MDB USB, pero an no hemos asociado, hacia donde
Cuando el dispositivo convertidor MDB USB ha terminado de conectarse e inicializarse con los
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
Cuando se ha recibido dinero desde el coin changer y el bill acceptor, el convertidor MDB USB enviar
automticamente el dato a travs del evento _onReadComplete()
El dato del monto enviado se enva como el doble, esto quiere decir que si se recibe el dato "2",
entonces lo que se recibi en realidad es 1 peso. Esto se hizo para no tener que manejar nmeros con
punto decimal en la comunicacin, el dato que se enva es un entero de 16 bits, pero al manejar un
buffer de 8 bits, se enva dividido en 2 bytes.
En el buffer de entrada, que para este ejemplo, tienen el nombre de InputBuffer recibe alrededor de 3
datos, cada uno enviado en el siguiente orden:
InputBuffer[0] = CASH_INSERTED (constante indicando que el datos enviado, se trata de dinero
insertado por usuario)
InputBuffer[1] = msb
InputBuffer[2] = lsb
En el siguiente ejemplo, se muestra como recibir el dato y guardarlo en una variable tipo int, adems de
imprimirlo en una etiqueta, para la visualizacin del usuario.
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] == CASH_INSERTED)
{
byte msb, lsb;
int cash_inserted = 0;
float cash;
msb = InputBuffer[1];
lsb = InputBuffer[2];
cash_inserted = msb;
cash_inserted <<= 8;
cash_inserted |= lsb;
cash = cash_inserted * 0.5;
label3.Text = cash.ToString();
}
}
ThinkChip
V1.1
05/2012
En la recepcin de errores que pudiera tener los dispositivos MDB, se requiere de primero realizar la
peticin de envio de informe de errores, para realizar esto, se necesita utilizar la funcin
WriteData(1, Buffer_de_salida,8)
En donde el dato de Buffer_de_salida se reemplaza por el buffer que nosotros hemos creado en nuestro
programa, con la constante de envio de datos de errores, como se ve en el siguiente ejemplo, el cual,
cada determinado tiempo se estar preguntado por el status de error, utilizando un timer y el evento
Tick
private void timer1_Tick(object sender, EventArgs e)
{
OutputBuffer[0] = ERROR_STATUS;
simpleUSB1.WriteData(1, OutputBuffer,8);
}
La recepcin de la respuesta se recibe en el evento _onReadComplete()
En donde el buffer de entrada InputBuffer recibe los datos de la siguiente manera:
InputBuffer[0] = constante que indica que se recepciona los datos de status de error
InputBuffer[1] = msb (byte ms significativo de error en coinchanger)
InputBuffer[2] = lsb (byte menos significativo de error en coinchanger)
InputBuffer[3] = ErrorBill (dato de status de error en bill acceptor)
El ejemplo siguiente demuestra la recepcin del error, y en una etiqueta imprime los status de cada uno
de los dispositivos MDB.
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] == ERROR_STATUS)
{
byte msb, lsb, error;
int error_coinchanger;
msb = InputBuffer[1];
lsb = InputBuffer[2];
error_coinchanger = msb;
error_coinchanger <<= 8;
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
error_coinchanger |= lsb;
InputBuffer[3] = error;
label4.Text = "Error coinchanger =" + error_coinchanger.ToString()
+ " Error bill=" + error.ToString();
}
}
ThinkChip
V1.1
05/2012
Tabla de constante de errores para Coin Changer, donde Z1 es el byte menos significativo, y Z2 el byte
ms significativo.
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
Para poder saber cuanto dinero hay en los tubos de cambio, en el coin changer, se llamar a la funcin
WriteData(1, Buffer_de_salida,8)
En el siguiente ejemplo, se utiliza un boton, llamando al evento Click
private void button4_Click(object sender, EventArgs e)
{
OutputBuffer[0] = CASH_IN_TUBES;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
En la respuesta, se enviar al evento a _onReadComplete()
En el siguiente ejemplo, se lee la respuesta del convertidor MDB USB, los datos los envia de la
siguiente forma:
InputBuffer[0] = constante que indica dinero en tubos
InputBuffer[1] = msb (byte ms significativo del dato)
InputBuffer[2] = lsb (byte menos significativo del dato)
El dato viene en un entero de 16 bits, y es el doble del monto real, esto quiere decir que multiplicandolo
por 0.5 o dividiendolo entre 2, se tiene el valor real.
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] = CASH_IN_TUBES)
{
byte msb, lsb;
int cash_in_tubes;
double money;
msb = InputBuffer[1];
lsb = InputBuffer[2];
cash_in_tubes = msb;
cash_in_tubes <<= 8;
cash_in_tubes |= lsb;
money = cash_in_tubes * 0.5;
label5.Text = "Dinero en tubos =$" + money.ToString();
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
}
}
ThinkChip
V1.1
05/2012
WriteData(1, Buffer_de_salida,8)
En el siguiente ejemplo, se pide por la informacin mediante el evento Click de un botn:
private void button5_Click(object sender, EventArgs e)
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = CASH_IN_BILL;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
}
Recuerden, que es una buena prctica, preguntar antes, s el dispositivo est conectado, antes de enviar
la informacin, como se ve en el ejemplo de arriba.
La respuesta a esta funcin se enviar al evento _onReadComplete()
El envo de datos es de la siguiente forma, en el buffer de entrada
InputBuffer[0] = constante que indica que se trata de billetes en stack
InputBuffer[1] = msb (byte ms significativo de nmero de billetes en stack)
InputBuffer[2] = lsb (byte menos significativo de nmero de billetes en stack)
En el siguiente ejemplo, se muestra como leer los datos, e imprimirlos en una etiqueta
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] = CASH_IN_BILL)
{
byte msb, lsb;
int cash_in_bill = 0;
msb = InputBuffer[1];
lsb = InputBuffer[2];
cash_in_bill = msb;
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
cash_in_bill <<= 8;
cash_in_bill |= lsb;
label6.Text = "Numero de billetes =" + cash_in_bill.ToString();
}
}
ThinkChip
V1.1
05/2012
En esta funcin, podemos habilitar o deshabilitar los dispositivos MDB, dependiendo de que se desea
habilitar o deshabilitar, se escribe en el buffer de salida, el orden es el siguiente:
Habilitacin y deshabilitacin de coin changer
OutBuffer[0] = constante que indica tarea de configuracin de coinchanger
OutBuffer[1] = valor booleano que indica habilitacin= 1 y deshabilitacin = 0
Habilitacin y deshabilitacin de bill acceptor
OutBuffer[0] = constante que indica tarea de configuracin de bill acceptor
OutBuffer[1] = valor booleano que indica habilitacin= 1 y deshabilitacin = 0
En el siguiente ejemplo, se utiliza cuatro botones para habilitacin y deshabilitacin de los dispositivos:
ThinkChip
V1.1
05/2012
OutputBuffer[1] = 1;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
}
private void button10_Click(object sender, EventArgs e)
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = SET_BILL;
OutputBuffer[1] = 0;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
}
ThinkChip
V1.1
05/2012
La funcin de envio de monto, es como su nombre lo dice, devolver cambio de dinero, mediante el coin
changer, para utilizar est funcin, se necesita enviar el monto del cambio por dos, esto quiere decir,
que si se necesita dar de cambio 10 pesos, se enviar al convertidor MDB USB la cantidad de 20. Esto
se hace mediante un entero de 16 bits, dividido en 2 bytes, enviando primero el ms significativo y
luego el menos significativo, en el buffer de salida se muestra el orden a ms detalle:
OutputBuffer[0] = constante que indica que envio de monto de cambio
OutputBuffer[1] = msb (byte ms significativo)
OutputBuffer[2] = lsb (byte menos significativo)
En el siguiente ejemplo, se muestra como utilizar esta funcin, mediante un TextBox y un botn para
enviar el monto escrito en TextBox, cabe destacar que este ejemplo no tiene ningun tipo de filtro a
letras, ya que es solamente demostrativo.
El convertidor MDB USB responder cuando haya terminado el proceso de envio de cambio, no
necesariamente tiene que ser exitosa la tarea, y depende del coin changer, ms adelante se muestran las
posibles respuestas a la funcin. En el siguiente ejemplo se muestra como se recibe datos desde el
evento _onReadComplete()
Se debe de esperar a la respuesta del convertidor MDB USB, antes de realizar otra funcin, ya que
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
normalmente tarda entre 1 o 5 segundos en terminar de dar cambio, dependiendo del modelo de
coinchanger.
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] == SEND_CHANGE)
{
if (InputBuffer[1] == 1)
{
label7.Text = "TAREA EXITOSA";
}
else
{
label7.Text = "ERROR NO CAMBIO";
}
}
}
El dato enviado en el buffer de entrada en la localidad [1] determina si se realizo exitosamente la tarea
de dar cambio, cualquier nmero diferente de 1, ser error y probablemente se tendr que repetir la
tarea.
ThinkChip
V1.1
05/2012
CONSTANTES
Anteriormente en el ejemplo, se habla de unas constantes, estas constantes se definen al principio del
programa, para que sea ms entendible para el programador. Las constantes son:
const byte INIT_MDB_DEVICES = 1;
const byte COIN_CHANGER = 1;
const byte BILL_ACCEPTOR = 2;
const byte COIN_AND_BILL = 3;
const byte CASH_INSERTED = 2;
const byte ERROR_STATUS = 4;
const byte CASH_IN_TUBES = 3;
const byte CASH_IN_BILL = 6;
const byte SET_COINCHANGER = 10;
const byte SET_BILL = 11;
const byte SEND_CHANGE = 9;
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
{
label1.Text = "Conectado";
simpleUSB1.StartReadingInterruptEndPoint(2, 8);
}
private void simpleUSB1_onDeviceDisconnect()
{
label1.Text = "Desconectado";
simpleUSB1.StopReadingInterruptEndpoint();
}
private void button1_Click(object sender, EventArgs e)
{
simpleUSB1.OpenConnection();
}
private void button2_Click(object sender, EventArgs e)
{
simpleUSB1.CloseConnection();
}
private void button3_Click(object sender, EventArgs e)
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = INIT_MDB_DEVICES;
simpleUSB1.WriteData(1, OutputBuffer,8);
}
}
private void simpleUSB1_onReadComplete()
{
simpleUSB1.ReadInterruptEndpoint(ref InputBuffer, 8);
if (InputBuffer[0] == INIT_MDB_DEVICES)
{
if (InputBuffer[1] == COIN_CHANGER)
{
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
error_coinchanger <<= 8;
error_coinchanger |= lsb;
error = InputBuffer[3];
label4.Text = "Error coinchanger =" + error_coinchanger.ToString()
+ " Error bill=" + error.ToString();
}
if (InputBuffer[0] == CASH_IN_TUBES)
{
byte msb, lsb;
int cash_in_tubes;
double money;
msb = InputBuffer[1];
lsb = InputBuffer[2];
cash_in_tubes = msb;
cash_in_tubes <<= 8;
cash_in_tubes |= lsb;
money = cash_in_tubes * 0.5;
label5.Text = "Dinero en tubos =$" + money.ToString();
}
if (InputBuffer[0] == CASH_IN_BILL)
{
byte msb, lsb;
int cash_in_bill = 0;
msb = InputBuffer[1];
lsb = InputBuffer[2];
cash_in_bill = msb;
cash_in_bill <<= 8;
cash_in_bill |= lsb;
label6.Text = "Numero de billetes =" + cash_in_bill.ToString();
}
if (InputBuffer[0] == SEND_CHANGE)
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
{
if (InputBuffer[1] == 1)
{
label7.Text = "TAREA EXITOSA";
}
else
{
label7.Text = "ERROR NO CAMBIO";
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
OutputBuffer[0] = ERROR_STATUS;
simpleUSB1.WriteData(1, OutputBuffer,8);
}
private void button4_Click(object sender, EventArgs e)
{
OutputBuffer[0] = CASH_IN_TUBES;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
private void button5_Click(object sender, EventArgs e)
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = CASH_IN_BILL;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
}
private void button6_Click(object sender, EventArgs e)
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = SET_COINCHANGER;
OutputBuffer[1] = 1;
simpleUSB1.WriteData(1,OutputBuffer,8);
}
}
Copyright Todos los derechos reservados. ThinkChip
ThinkChip
V1.1
05/2012
ThinkChip
V1.1
05/2012
{
if (simpleUSB1.DeviceConnected == true)
{
OutputBuffer[0] = SET_BILL;
OutputBuffer[1] = 0;
simpleUSB1.WriteData(1, OutputBuffer, 8);
}
}
}
}