Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% encontró este documento útil (0 votos)
271 vistas16 páginas

Protocolo MDB

Descargar como pdf o txt
Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1/ 16

Patxi Ballesteros

Desarrollo software y otros temas relacionados con la


tecnología

Introducción a la especificación MDB/ICP

 29/09/201512/12/2018  Patxi Ballesteros  Protocolos


MDB/ICP son las siglas de Multi-Drop Bus/Internal Communication Protocol. Aquí voy a
describir la versión 4.2 (https://www.ccv.eu/wp-
content/uploads/2018/05/mdb_interface_specification.pdf) de la especificación.

MDB es un protocolo utilizado en las máquinas de vending para interconectar diferentes


módulos, como pueden ser: Monederos (coin changers), billeteros (bill acceptors) y
lectores RFID.

El protocolo MDB transmite las señales por un bus serie que trabaja a 9600 baudios en
una configuración maestro-esclavo, donde todos los periféricos son esclavos de un
controlador maestro. Cada periférico tiene una dirección única y un conjunto de
comandos.

El maestro sondea continuamente el bus para conocer la actividad de los periféricos. Es


decir, cada periférico recibe una encuesta y éste responde con un acuse de recibo, acuse
de recibo negativo, o datos específicos dependiendo de la actividad que esté realizando.
Si un periférico no responde dentro de un tiempo predefinido se supone que no está
presente en el bus. Las colisiones dentro del bus se evitan debido a que cada periférico
solo responde cuando es encuestado. Como solo hay un maestro, y toda comunicación es
iniciada por éste, las colisiones en el bus se evitan fácilmente.

El protocolo MDB tiene tres niveles funcionales. El nivel 3 es el que más comandos
soporta. Ningún dispositivo responderá a comandos de un nivel superior al suyo.

Comunicación

El protocolo MDB utiliza una transmisión serie asíncrona para el envío de los datos. La
velocidad de transmisión es de 9600 baudios con una codificación NRZ.
Se transmiten 11 bits: 1 bit de arranque, 8 bits de datos (primero el LSB), 1 bit de modo y
1 bit de parada.

(https://patxiballesteros.files.wordpress.com/2015/09/trama.jpg)

Bit de modo en la transmisión de Maestro a periférico: El bit de modo a 1 indica un


byte de dirección, si es un 0 indica un byte de datos. La dirección la leen todos los
periféricos pero solo responde el que tiene esa dirección. El byte de datos solo lo lee el
periférico direccionado.

Bit de modo en la transmisión de periférico a maestro: Se pone a 1 cuando el


periférico envía el último byte del bloque de datos.

Formato del bloque

Maestro a periférico

La transmisión de un comando desde el maestro hasta un periférico consiste en:

1. Un byte con la dirección del periférico (bits 3, 4, 5, 6 y 7) y un comando (bits 0,1 y


2). Modo = 1
2. Opcionalmente un byte con un subcomando. Modo = 0
3. Opcionalmente n bytes de datos. Modo = 0
4. Un byte con el checksum. Modo = 0

El maestro puede responder a un periférico con ACK, NAK o RET. Modo = 0

(https://patxiballesteros.files.wordpress.com/2015/09/maestroperiferico.jpg)

Periférico a maestro

La respuesta de un periférico al comando enviado por el maestro consiste en:

1. N bytes de datos. Modo = 0


2. un byte con el checksum. Modo = 1

Si no tiene nada que enviar al maestro responderá con ACK. Modo = 1

Si no recibe lo que esperaba responderá con NAK. Modo = 1

Checksum
El byte de checksum se calcula sumando todos los bytes del bloque enviado. El bit de
acarreo en el checksum se ignora ya que el checksum es de 8 bits.

En la siguiente imagen se muestra un ejemplo del cálculo del checksum en un bloque de


datos enviado por el maestro. Observe como al resultado de sumar los seis bytes, es decir
a 0x23E, se le aplica un AND 0xFF para quedarse solo con 8 bits e ignorar el acarreo.

(https://patxiballesteros.files.wordpress.com/2015/09/checksum.jpg)

Tiempo de respuesta

Si el maestro no recibe una respuesta del periférico en 5 ms volverá a enviar el mismo


comando u otro distinto hasta que reciba una respuesta o pase un tiempo de espera
configurado por el periférico. Este tiempo por defecto se puede aumentar en la
configuración que envía el periférico al maestro en el comando Setup. Más adelante
veremos este comando.

Una vez transcurrido este tiempo máximo de espera, el maestro enviará al periférico un
comando RESET por lo menos cada 10 segundos.

Códigos de respuesta

ACK = 0x00
RET = 0xAA
NAK = 0xFF

Hardware

Como he comentado en el punto anterior, el protocolo MDB utiliza un bus para la


transmisión y recepción de las señales entre el maestro (VMC) y los esclavos (dispositivos
periféricos). En la siguiente figura se muestra un esquema de las conexiones entre los
distintos dispositivos de una máquina de vending.
(https://patxiballesteros.files.wordpress.com/2015/09/hardware.jpg)

Los periféricos se aíslan eléctricamente del bus mediante unos optoacopladores, ver
siguiente imagen.

(https://patxiballesteros.files.wordpress.com/2015/09/aislamiento.jpg)
Dispositivo cashless

Un dispositivo cashless es un dispositivo para realizar pagos sin dinero en efectivo, por
ejemplo una tarjeta prepago o un teléfono móvil con tecnología NFC o mediante códigos
QR.

El cashless es un esclavo en el bus MDB y las direcciones reservadas para este dispositivo


son la 10H y la 60H, utilizare la dirección 10H en el resto de la explicación.

El VMC está continuamente sondeando a los periféricos con el comando POLL. El


cashless deberá esperar a este comando si tiene algo que comunicar al VMC.

(https://patxiballesteros.files.wordpress.com/2015/09/poll.jpg)

En la imagen se observa que el primer byte del bloque es el comando 2H (RESET)


enviado a la dirección 10H (Cashless). En binario sería 1 00010 010 = 112H (el primer bit
es el 8). Es decir, bits 0, 1 y 2 son el comando 2H y los bits 3, 4, 5, 6 y 7 la dirección 10H. El
bit 8 es el modo que como es 1 indica que el dato lleva una dirección.

El segundo byte del bloque es el checksum calculado como se ha explicado en uno de los
puntos anteriores.

El cashless simplemente devuelve ACK con el bit de modo a 1 por ser el último byte, y
único en este caso, del bloque de su respuesta.

Estados

Un dispositivo cashless se puede ver como una máquina de estados (ver siguiente
Figura), estos son:

1. Inactive
2. Disabled
3. Enabled
4. Session Idle
5. Vend
(https://patxiballesteros.files.wordpress.com/2015/09/maquinaestados.png)

Inactive

Es el estado inicial del cashless. Se llega a él tras alimentar al dispositivo o al hacer un


RESET en cualquiera de los estados. En este estado el dispositivo no está disponible.

El VMC envía un comando de RESET al dispositivo.

(https://patxiballesteros.files.wordpress.com/2015/09/inactive.png)

Seguidamente el VMC se dedica a enviar comandos POLL. Cuando el cashless está listo
responde con el comando JUST RESET.

(https://patxiballesteros.files.wordpress.com/2015/09/justreset.png)

A continuación el VMC envía el comando SETUP con su configuración y el cashless le


responde con la suya. En este ejemplo el VMC le está indicando que trabaja en el nivel 2 y
el display que tiene (nº de filas y columnas). El cashless le responde que trabaja en el
nivel 1, el código del país, el factor de escala y los decimales que emplea en los valores
del crédito, el tiempo máximo de espera sin respuesta y un último byte para configurar
otros aspectos como es la recarga de saldo.

(https://patxiballesteros.files.wordpress.com/2015/09/setup1.png)

El VMC envía de nuevo el comando SETUP pero con otro subcomando, el que se refiere a
la configuración Max/Min precios.

(https://patxiballesteros.files.wordpress.com/2015/09/setup2.png)

Entonces el cashless responde con ACK y pasa al estado Disabled.

Disabled

En este estado el cashless recibirá varios comandos POLL y si todo está bien el VMC
enviará un comando READER ENABLE que pasará al cashless al estado Enabled.

(https://patxiballesteros.files.wordpress.com/2015/09/disabled.png)
Enabled

En este estado el dispositivo cashless está preparado para recibir una señal externa que
le haga iniciar una sesión de venta, por ejemplo, un cliente acerca su terminal móvil al
tag NFC. En este estado se responde a un comando POLL con BEGIN SESSION, esta
respuesta consiste en un bloque de datos con el importe introducido para realizar una
compra.

(https://patxiballesteros.files.wordpress.com/2015/09/enabled.png)

El dispositivo cashless cambiará al estado Session Idle.

Session Idle

En este estado el cliente selecciona un producto en el teclado de la máquina de vending.


Entonces el VMC envía un comando VEND REQUEST con el precio y posición del
producto seleccionado. Tras esto, El dispositivo cashless pasa al estado Vend.

(https://patxiballesteros.files.wordpress.com/2015/09/sessionidle.png)
Vend

En el estado Vend si el dispositivo cashless comprueba que es correcto entregar el


producto elegido, responderá a un POLL con VEND APPROVE indicando el importe del
producto que valida. Aquí el cashless también podría responder VEND DENIED si no
validase la entrega del producto elegido, por ejemplo.

(https://patxiballesteros.files.wordpress.com/2015/09/vend.png)

A continuación el VMC confirmará si ha entregado el producto correctamente con el


comando VEND SUCCESS, en caso contrario responderá con VEND FAILURE. Existe otro
posible subcomando, VEND CANCEL que lo enviará el VMC si el cliente cancela la
operación de compra en este momento. Esto sería que pulsa el botón de devolución de
monedas.

(https://patxiballesteros.files.wordpress.com/2015/09/vendsuccess.png)

Después se vuelve al estado Session Idle y si no hay otra venta pendiente se regresa al
estado Enabled tras recibir el comando SESSION COMPLETE.
(https://patxiballesteros.files.wordpress.com/2015/09/sessioncomplete.png)

Esto finalizaría un ciclo de venta quedándose el dispositivo cashless preparado para


iniciar un nuevo ciclo.

Autor: Patxi Ballesteros @patxiba (https://twitter.com/Patxiba)

Referencias:

Vending Machine/Cashless Device


(https://wiki.nottinghack.org.uk/wiki/Vending_Machine/Cashless_Device)
The MDB protocol. bouni’s blog (http://blog.bouni.de/blog/2012/05/06/the-mdb-protocol-
part-1/)  @bouni (https://github.com/bouni)

16 comentarios en “Introducción a la especificación


MDB/ICP”

1. pablo dice:
10/03/2016 a las 23:15
Buen día, muy bueno el blogspot.
Tengo un desarrollo, por favor contactar.

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=40#respond)
2. Juan dice:
05/04/2017 a las 7:50
Hola Patxi, me encanta tu forma de explicar el protocolo que para mas de uno sigue
siendo tabú, me gustaria saber si con arduino desarrollaste algun metodo para espiar las
comunicaciones entre dispositivos o empleaste algun otro aparato. En caso de que lo
hicieras con arduino podrias compartir como hacerlo???, gracias de antemano

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=48#respond)
3. Freddy Luque dice:
18/07/2017 l 16 46
18/07/2017 a las 16:46
Buen día estoy trabajando con una vending en mi proyecto de tesis, el proyecto se trata
de incorporarle un punto de venta ya que la vending solo tiene como forma de pago una
bill validator. Por favor si me puedes contactar para hablarte mas del proyecto te lo
agradecería

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=51#respond)
4. Iosu dice:
29/11/2017 a las 17:09
Buenas tardes Patxi:
Querria comprar una maquina vending con protocolo MDB y acoplarle un desarrollo
externo que directamente me saque un producto de la máquina. Tengo dudas de si
realmente sabre hacerlo y no sé si puedo comunicarme con la máquina mediante puerto
serie rs232.
Únicamente querría darle la orden de que sacara un producto de las posiciones
disponibles. Hay algún comando para hacerlo?¿Como lo tendría que hacer?

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=55#respond)
Patxi Ballesteros dice:
30/11/2017 a las 10:47
Hola Iosu, se que existe un producto comercial que permite conectarse a través del
puerto rs232: https://www.mayavending.com/producto/easymdb/
(\"https://www.mayavending.com/producto/easymdb/\")
https://www.mayavending.com/controlando-un-monedero-mdb-cf7000-con-arduino/
(\"https://www.mayavending.com/controlando-un-monedero-mdb-cf7000-con-
arduino/\") .gist table { margin-bottom: 0; } This file contains bidirectional Unicode text
that may be interpreted or compiled differently than what appears below. To review,
open the file in an editor that reveals hidden Unicode characters. Learn more about
bidirectional Unicode characters (\"https://github.co/hiddenchars\") Show hidden
characters (\"{{) # #Example of how to use EasyMDB RS232 #Date June/2014 #Version
1.0.2 #Not warranty, for educational purposes #Thinkchip #V1.0.1 #dispense coin
function #Level coin changer added #V1.0.2 #add Display MDB function import serial
import time import sys #Global Variables ser = 0 scaling = 0 scaling_bill = 0 #Functions
for EasyMDB RS232 InitCoin = [0x02,0x01,0xff,0x02] PollCoin = [0x02,0x03,0xff,0x04]
TubesCoin = [0x02,0x05,0xff,0x06] ErrorCoin = [0x02,0x0a,0xff,0x0b] InitBill =
[0x03,0x01,0xff,0x03] PollBill = [0x03,0x02,0xff,0x04] StackerBill = [0x03,0x03,0xff,0x05]
#Function to init serial port def init_serial(): COM=10 #number of com port global ser
ser = serial.Serial() ser.baudrate = 9600 ser.port = COM–1 ser.timeout = 10 #10 seconds
waiting for data ser.open() if ser.isOpen(): print 'Open serial port: ' + ser.portstr
#function commands print def main_console(): print "Menu Commands EasyMDB
RS232rn" print "For Init Coin Changer press "1" Key" print "For Poll Coin Changer press
"2" Key" print "For Tubes Coin Changer press "3" Key" print "For Error Coin Changer
press "4" Key" print "For Coin types accepted press "5" Key" print "For Pay Out press "6"
Key" print "For Coin dispense press "11" Key" print "For Init Bill validator press "7" key"
print "For Poll Bill validator press "8" key" print "For Stacker Bill validator press "9" key"
print "For Bill accepted press "10" key" print "For display value press "12" key" print
"Exit "0" Key" #function init coin changer def init_coin_changer(): print "Start the
communication with Coin Changerrn" print "Send command 0x02 0x01 0xff 0x02rn"
ser.write(InitCoin) data = ser.read(52)#expect 52 bytes of information has model,
version, scaling #factor , etc level = ord(data[2]) str(level) print "Level Coin Changer: ",
level print "Manufacturer code" print data[3:5] print "Model Coin Changer" print
data[6:17] print "Serial Number Coin Changer" print data[18:29] scaling =
ord(data[30])#scaling factor str(scaling) print "Scaling Factor : ", scaling decimal =
ord(data[31]) str(decimal) print "Decimal Places : ",decimal msb = ord(data[32]) country
= msb << 8 lsb = ord(data[33]) country = country | lsb str(country) print "Country Coin
changer model :", country print "Coin type accepted:" coinaccepted = ord(data[34])
str(coinaccepted) print "Coin type 1:",coinaccepted coinaccepted = ord(data[35])
str(coinaccepted) print "Coin type 2:",coinaccepted coinaccepted = ord(data[36])
str(coinaccepted) print "Coin type 3:",coinaccepted coinaccepted = ord(data[37])
str(coinaccepted) print "Coin type 4:",coinaccepted coinaccepted = ord(data[38])
str(coinaccepted) print "Coin type 5:",coinaccepted coinaccepted = ord(data[39])
str(coinaccepted) print "Coin type 6:",coinaccepted #function tubes coin changer def
tubes_coin(): print "Send command tubes coinrn" print "0x02 0x05 0xff 0x06rn"
ser.write (TubesCoin) data1 = ser.read(6) msb1 = ord(data1[2]) lsb1 = ord(data1[3])
totaltubes = msb1 << 8 totaltubes = totaltubes | lsb1 totaltubesreal =
float(totaltubes/2.0)#this value for mexico supported print "Total Coin Tubes:" + '%.2f'
%totaltubesreal #function poll coin def poll_coin(): i=0 global scaling while (i<30): print
"Poll coin every 1 second" print "Send 0x02,0x03,0xff,0x04" ser.write(PollCoin) data2 =
ser.read(10) msb2 = ord(data2[2]) lsb2 = ord(data2[3]) cash = msb2 << 8 cash = cash |
lsb2 #for take the real value of coin inserted, need to divide between #scaling factor, but
not always is that and observe the best operation if cash>1 : cashreal=
float(cash/scaling) print "Coin inserted:" + '%.2f' %cashreal else: print "Coin inserted : 0"
#coin routing routing = ord(data2[4]) if routing == 0: print "Cash Box routing coin" elif
routing == 1: print "Tubes routing coin" elif routing == 2: print "Not used" elif routing ==
3: print "Reject coin" else : print "nothing coin routing" msb2 = ord(data2[5]) lsb2 =
ord(data2[6]) coindispensed = msb2 << 8 coindispensed = coindispensed | lsb2
realcoindispensed = float(coindispensed/2.0) print "Coin dispensed: " + '%.2f'
%realcoindispensed coinerror = ord(data2[7]) str(coinerror) print "Error coin number:
",coinerror print "rn" i = i + 1 time.sleep(1) #function for payout def pay_out_coin(): print
"Select the amount that you want to dispense" amount_string = raw_input()
amount_string = int(amount_string) msb4 = amount_string >> 8 lsb4 = amount_string &
0x00ff checksum = 0x02+0x07+msb4+lsb4+0xff checksum = checksum & 0x00ff
PayOutString = [0x02,0x07,msb4,lsb4,0xff,checksum] ser.write(PayOutString) data5 =
ser.read(5) alert = ord(data5[2]) if alert == 1: print "OK payout" else: print "Fail payout"
#function for error coin general def error_coin(): print "Error coin general" print "Send
0x02,0x0a,0xff,0x0b" ser.write(ErrorCoin) data6 = ser.read(6) msb6 = ord(data6[2]) lsb6
= ord(data6[3]) error = msb6 << 8 error = error | lsb6 str(error) print "Error coin
changer: ",error #function coin accepted def coin_accepted(): print "Coin type accepted"
print "For enable all coins press "1" and disable "0" " key = raw_input() key = int(key) if
key == 1: print "Enable all coins" print "Send
0x02,0x08,0xff,0xff,0xff,0xff,0xff,checksum" checksum2 = 0x02 + 0x08 + 0xff + 0xff + 0xff
+ 0xff + 0xff checksum2 = checksum2 & 0x00ff CoinAccepted =
[0x02,0x08,0xff,0xff,0xff,0xff,0xff,checksum2] ser.write(CoinAccepted) data7 =
ser.read(5) alert = ord(data7[2]) if alert == 1: print "OK coin accepted" else: print "Fail
coin accepted" elif key == 0: print "Disable all coins" print "Send
0x02,0x08,0x00,0x00,0x00,0x00,0xff,checksum" checksum2 = 0x02 + 0x08 + 0x00 + 0x00
+ 0x00 + 0x00 + 0xff checksum2 = checksum2 & 0x00ff CoinAccepted =
[0x02,0x08,0x00,0x00,0x00,0x00,0xff,checksum2] ser.write(CoinAccepted) data7 =
ser.read(5) alert = ord(data7[2]) if alert == 1: print "OK coin accepted" else: print "Fail
coin accepted" #function Dispense coin def coin_dispense(): print "Coin dispense" print
"Select Coin Type to dispense,range 0 to 15 value only" key = raw_input() key = int(key)
cointype = key print "Select number coins to dispense,range 0 to 15 value only" key =
raw_input() key = int(key) numbercoin = key checksum = 0x02 + 0x0b + cointype +
numbercoin + 0xff checksum = checksum & 0x00ff DispenseCoin =
[0x02,0x0b,numbercoin,cointype,0xff,checksum] ser.write(DispenseCoin) print "Sending
coin dispense" data = ser.read(5) response = ord(data[2]) if response == 1: print "OK coin
dispense" else: print "Fail coin dispense" #function bill validator def bill_init(): global
scaling_bill print "Bill init command" print "Send 0x03,0x01,0xff,0x03" ser.write(InitBill)
databill = ser.read(52) print "Manufacturer code" print databill[2:4] print "Model bill
validator" print databill[5:16] print "Serial Number bill validator" print databill[17:28]
escrow = ord(databill[29]) str(escrow) print "Escrow bill validator: ",escrow
decimalplacesbill = ord(databill[30]) str(decimalplacesbill) print "Decimal places:
",decimalplacesbill msb = ord(databill[31]) lsb = ord(databill[32]) scaling_bill = msb << 8
scaling_bill = scaling_bill | lsb str(scaling_bill) print "Scaling factor for Bill validator:
",scaling_bill msb = ord(databill[33]) lsb = ord(databill[34]) stackercap = msb << 8
stackercap = stackercap | lsb str(stackercap) print "Stacker capacity: ",stackercap
billtype = ord(databill[35]) str(billtype) print "Bill type 1:",billtype billtype =
ord(databill[36]) str(billtype) print "Bill type 2:",billtype billtype = ord(databill[37])
str(billtype) print "Bill type 3:",billtype billtype = ord(databill[38]) str(billtype) print "Bill
type 4:",billtype #function Poll Bill def poll_bill(): i=0 global scaling_bill while
(i<30):#times that will poll print "Poll bill every 1 second" print "Send
0x03,0x02,0xff,0x04" ser.write(PollBill) databill = ser.read(7) msb = ord(databill[2]) lsb =
ord(databill[3]) bills = msb << 8 bills = bills | lsb #For take the real value of bill inserted,
we need to divide between #scaling factor, but not always is the same mathematical
operation if bills>1 : billsreal= float(bills*10.0) print "Bills inserted:" + '%.2f' %billsreal
else: print "Bills inserted : 0" bills_error = ord(databill[4]) str(bills_error) print "Error
bills: ",bills_error print "rn" i = i + 1 time.sleep(1) #function stacker bill def stacker_bill():
print "Stacker bill function" print "Send 0x03,0x03,0xff,0x05" ser.write(StackerBill)
databill = ser.read(6) msb = ord(databill[2]) lsb = ord(databill[3]) numberbills = msb << 8
numberbills = numberbills | lsb str(numberbills) print "Numbers bills in stacker:
",numberbills #function bills accepted def bills_accepted(): print "Bills accepted
command" print "Press "1" for enable all bills or "0" for disable" key = raw_input() key =
int(key) if key == 1: print "Enable bills command" print "Send
0x03,0x04,0xff,0xff,0xff,checksum" checksum = 0x03 + 0x04 + 0xff + 0xff + 0xff
checksum = checksum & 0x00ff BillAccepted = [0x03,0x04,0xff,0xff,0xff,checksum]
ser.write(BillAccepted) databill = ser.read(5) alert = ord(databill[2]) if alert == 1: print
"OK bill accepted" else: print "Fail bill accepted" elif key == 0: print "Disable bills
command" print "Send 0x03,0x04,0x00,0x00,0xff,checksum" checksum = 0x03 + 0x04 +
0x00 + 0x00 + 0xff checksum = checksum & 0x00ff BillAccepted =
[0x03,0x04,0x00,0x00,0xff,checksum] ser.write(BillAccepted) databill = ser.read(5) alert
= ord(databill[2]) if alert == 1: print "OK bill accepted" else: print "Fail bill accepted"
#function display value def display_value(): print "Display value cash" print "Enter
value between 0 and 9999" key = raw_input() key = int(key) print "Send value" msb =
key >> 8 lsb = key & 0x00ff checksum = 0x04+0x01+msb+lsb+0xff checksum = checksum
& 0x00ff display_val = [0x04,0x01,msb,lsb,0xff,checksum] ser.write(display_val) data =
ser.read(4) print "Ok display" init_serial()#call function that init serial port while 1: if
ser.isOpen(): ser.flushInput() #flush input buffer, discarding all its contents
ser.flushOutput()#flush output buffer, aborting current output main_console()
command = raw_input("Please select a commandrn") command = int(command) if
command == 1: init_coin_changer() elif command == 2: poll_coin() elif command == 3:
tubes_coin() elif command == 0: ser.close() sys.exit() elif command == 6: pay_out_coin()
elif command == 4: error_coin() elif command == 5: coin_accepted() elif command == 7:
bill_init() elif command == 8: poll_bill() elif command == 9: stacker_bill() elif command
== 10: bills_accepted() elif command == 11: coin_dispense() elif command == 12:
display_value() view raw
(\"https://gist.github.com/thinkchip/114f6e8d904ead2bd086/raw/0d01faf88860cace6eda3
8a601e1f00086cb3fce/gistfile1.py\") gistfile1.py


(\"https://gist.github.com/thinkchip/114f6e8d904ead2bd086#file-gistfile1-py\") hosted
with by GitHub (\"https://github.com\") Una característica especial del protocolo MDB
es que usa 9 bits. En cualquier caso, con un Arduino se puede conseguir una
comunicación con la máquina y enviarle comandos para que, por ejemplo, entregue
productos. En la especificación MDB y en mi artículo se pueden ver las señales que
intercambian los dispositivos maestro y esclavo para realizar una venta.
Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=56#respond)
Fredd dice:
30/11/2017 a las 20:10
Buenas tardes losu. Para acoplarle un dispositivo externo a la vending tienes que
hacerlo por comunicación MDB. Te recomiendo que te leas el manual de protocolo de
comunicación MDB que esta disponible en la web y desarrollar tu proyecto con un
arduino preferiblemente el arduino Mega 2560. Si quieres más información o asesoría
puedes contactarme a mi correo 12-05510@usb.ve (mailto:12-05510@usb.ve) o al 11-
10747@usb.ve (mailto:11-10747@usb.ve)

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=57#respond)
5. sergio dice:
02/01/2018 a las 7:49
el billetero sigue acumulando credito al introducir acualquier denominacion

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=58#respond)
6. Juan C dice:
22/03/2018 a las 16:54
HOLA.
Tengo una inquietud..
¿ a través del protocolo MDB «dispositivo cashless» puedo ingresarle a la máquina la
selección que quiero comprar? o necesariamente tengo que seleccionarla en el teclado
de la máquina?, de que forma se hace?

Saludos y muchas gracias

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=62#respond)
Patxi Ballesteros dice:
11/04/2018 a las 19:37
Hola, el dispositivo cashless pone el crédito, pero luego hay que seleccionar en el
teclado multiplexado el código del producto. Esto lo hemos hecho también con Arduino,
es decir, primero el cashless (que es el Arduino) pone el importe, después, también
Arduino da la señal al teclado multiplexado para que expulse el producto solicitado.

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=63#respond)
7. Tomas dice:
10/10/2018 a las 19:29
Hola Patxi tengo un monedero conectado a un vending y me da el siguiente mensaje
«todas monedas inhibidas debido a MDB Reset» es un cashflow 690 sabras el porque de
este estado y como solucionarlos Gracias…

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=66#respond)
8. William Alexander Alvarez Barona dice:
11/10/2018 a las 6:42
Hola Patxi, es posible que pueda actuar en paralelo el proceso mecanico en el Arduino, es
decir: después de ingresar por el teclado multiplexado el codigo del producto ( activar un
bombillo por cierto tiempo ), pueda hacer la misma tarea en otro pin de salida y activar
otro bombillo por otro tiempo, sin que afecte el que ya está corriendo. Gracias por la
respuesta.

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=67#respond)
Patxi Ballesteros dice:
11/10/2018 a las 23:50
Yo pienso que sí. Una señal de salida en Arduino puede activar cualquier dispositivo.
Eso sí, dependiendo del consumo de la carga habra que usar un relé, transistor o triac.
Si quieres sacar una señal por otro pin, no hay problema, pero eso requiere
programarlo.

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=69#respond)
9. Rafael Guette Durango dice:
05/05/2019 a las 1:00
Hola Patxi, me gustaría contactarme contigo, tengo un proyecto algo como convertir
id003 a Mdb.
Sé que se puede hacer con arduino, si te interesa por favor hablame

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=101#respond)
10. Alejandro dice:
15/02/2020 a las 5:08
Hola Patxi, Tengo un problema con este protocolo en general. Podría asesorar me al
respecto. Intento aplicarlo a microcontroladores pics. Gracias

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=110#respond)
11. Eduardo García dice:
02/05/2021 a las 19:39
Hola Patxi. En primer lugar muchas gracias, porque creo que es de la poca información
sobre MDB en castellano. Un conocido tiene una empresa con maquinas autovending con
monederos. Hasta ahora las máquinas reciben una señal de pulsos del monedero, en
función del dinero introducido. Ahora están empezando a venir máquinas sin entrada de
pulsos. Sólo RS232, y le monedero es el mismo. El caso es que no hace ni un año que se
desarrolló una aplicación para cobro a través de internet, que mete los mismos pulsos a
la máquina, y además cuenta los pulsos introducidos por el monedero para informar de
la facturación, así que es una pena tener que deshacerse de esa aplicación tan pronto.
Para ello había pensado poner un arduino a «escuchar» el bus, y que sea éste el que de
los pulsos a lo que ya hay, pero me encuentro el problema del protocolo de 9 bits. He
buscado en internet, y parece que alguien modificó un IDE de Arduino para ello, pero el
enlace ya no funciona.

¿Sabes si hay alguna librería o alguna solución que me pudiera servir? Estoy muy
perdido con el tema. Supongo que la otra opción es meter la señal a una entrada, y
contando tiempos desde el primer «1»(bit de inicio), ver la trama. Pero no sé si sería muy
fiable. Por ejemplo, si cada pulso dura 5 ms, contar 5 desde el primer flanco y ver lo que
hay. Pero, ¿y si no le ha dado tiempo a cambar por un ms? ¿Quizá contar en periodos de
5, pero esperar un ms más a leer?

Muchas gracias por tu tiempo.


Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=116#respond)
Tragamonedas Gominola dice:
04/12/2021 a las 19:45
hola eduardo garcia en efecto se puede hacer con Arduino el protocolo MDB de 9 bits si
estas interesado en la solucion contactame por telegram Ayuda Asesoria Experta y
Especializada para Proyectos Arduino Basicos y Embebidos, UNO Mega, ESP32, ESP8266,
NodeMCU32, Soc, FPGA, STM32 y PICmicro, M2M IoTing Intenet de Las Cosas IoT
Estandar e IoT 4.0 Industrial, Android a ESP8266 o ESP32. Rapidez y Calidad de Servicio
Garantizado. contacto Telegram/Telefono: 5576608060 Movistar Mexico
https://t.me/iottelegram (https://t.me/iottelegram)

Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=124#respond)

Crea un blog o un sitio web gratuitos con WordPress.com. (https://wordpress.com/es/?


ref=footer_website)

También podría gustarte