0 calificaciones0% encontró este documento útil (0 votos) 143 vistas16 páginasMDB Explicado
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido,
reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
2e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
Patxi Ballesteros
Desarrollo software y otros temas relacionados con la
tecnologia
Introduccion a la especificacién MDB/ICP
© 29/09/201512/12/2018 & Patxi Ballesteros ti Protocolos
MDB/ICP son las siglas de Multi-Drop Bus/Internal Communication Protocol. Aqui voy a describir la
versién 4.2 ([Link] 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 sefiales 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 tnica 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, 0
datos especificos 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 facilmente.
El protocolo MDB tiene tres niveles funcionales. El nivel 3 es el que mas comandos soporta. Ningun
dispositivo respondera a comandos de un nivel superior al suyo.
Comunicacién
E] protocolo MDB utiliza una transmisién serie asincrona para el envio 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.
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 62e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestoros
eC PE
([Link] files. [Link]/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 direccidn 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.
Anuncio publicitario
Live Trans
Obtén interpretacién en tiempo real
mientras hablas por teléfono, rompe
barreras de idioma. Gracias a Live
Translate, ahora puedes comuni...
Bit de modo en la transmisién de periférico a maestro: Se pone a 1 cuando el periférico envia el
Ailtimo byte del bloque de datos.
Formato del bloque
© Maestro a periférico
La transmision 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
El maestro puede responder a un perif
coin changer 10000100
cashless device 100010000
bill validator 100110000
command
address
modebit
(https:/patxiballesteros files. word)
wrd [Link]/2015/09/[Link]),
© Periférico a maestro
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 262e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
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
Sino tiene nada que enviar al maestro respondera con ACK. Modo = 1
Sino recibe lo que esperaba responderd 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 cdlculo 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 OxFF para quedarse solo con 8 bits e ignorar el acarreo.
([Link] files. word press,com/2015/09/[Link])
Tiempo de respuesta
Si el maestro no recibe una respuesta del periférico en 5 ms volverd 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 envia el periférico al maestro en
el comando Setup. Mas adelante veremos este comando.
Una vez transcurrido este tiempo maximo de espera, el maestro enviard al periférico un comando
RESET por lo menos cada 10 segundos.
Céodigos de respuesta
© ACK = 0x00
© RET=0xAA
° NAK =0xFF
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 362e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
Hardware
Como he comentado en el punto anterior, el protocolo MDB utiliza un bus para la transmisin y
recepcién de las sefiales 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
maquina de vending.
Coin
Peers
BENT
™
Teclado
Cashless
Srv
Gu
a
>
([Link] files. [Link]/2015/09/[Link]),
Los periféricos se aislan eléctricamente del bus mediante unos optoacopladores, ver siguiente
imagen.
tips:ifpatxibalesters,wordpress,com/7015/091291introducclon--Ja-especificacion-mdbicp! ane2e12te4, 21:09 Invoduccién ala especiicacién MOBIC? | Pati Ballesteros
ve << erioher
Yc vere Out
([Link]
[Link]/2015/09/aislamiento,jpg)
Dispositivo cashless
Un dispositive cashless es un dispositive para realizar pagos sin dinero en efectivo, por ejemplo una
tarjeta prepago o un teléfono mévil con tecnologia NEC 0 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.
[Link]/2015/09/[Link])
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 seria 1 00010 010 = 112H (el primer bit es el 8). Es decir, bits 0, 1 y
2son 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
([Link]
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 562e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
que el dato Ieva 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 tiltimo byte, y unico en este
caso, del bloque de su respuesta.
Estados
Un dispositive cashless se puede ver como una maquina de estados (ver siguiente Figura), estos son:
1. Inactive
2. Disabled
3. Enabled
4, Session Idle
5. Vend
RESET
ENABLE
BEGIN
SESSION
cess (“q)) vo
=f}
([Link] files. [Link]/2015/09/maquinaes
[Link])
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
E1 VMC envia un comando de RESET al dispositivo.
([Link] files. [Link]/2015/09/[Link])
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! ene2e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
Seguidamente el VMC se dedica a enviar comandos POLL. Cuando el cashless esta listo responde con
el comando JUST RESET.
re
cad
([Link] files. [Link]/2015/09/[Link])
A continuacién el VMC envia el comando SETUP con su configuracién y el cashless le responde con
Ja suya. En este ejemplo el VMC le esta 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 pais, el factor de
escala y los decimales que emplea en los valores del crédito, el tiempo maximo de espera sin
respuesta y un ultimo byte para configurar otros aspectos como es la recarga de saldo,
([Link] files. [Link]/2015/09/setup:
El VMC envia de nuevo el comando SETUP pero con otro subcomando, el que se refiere ala
configuracién Max/Min precios.
coos
Ill
([Link] files. [Link]/2015/09/setup:
png)
Entonces el cashless responde con ACK y pasa al estado Disabled.
bitpsfipatival estoros. wordpress, com/2015I09(2G/ntroduecion-a-especificacion-mdbicp! 7162e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
Disabled
En este estado el cashless recibird varios comandos POLL y si todo esta bien el VMC enviard un
comando READER ENABLE que pasaré al cashless al estado Enabled.
“Oe OT
([Link] files. word [Link]/2015/09/[Link])
Enabled
En este estado el dispositivo cashless esta preparado para recibir una sefial 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.
mae nes =
ALI
les. [Link]/2015/09/[Link]),
([Link]
EI dispositivo cashless cambiaré al estado Session Idle.
Session Idle
En este estado el cliente selecciona un producto en el teclado de la maquina de vending. Entonces el
VMC envia un comando VEND REQUEST con el precio y posicién del producto seleccionado. Tras
esto, El dispositivo cashless pasa al estado Vend
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! ane2e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros
([Link] files. wordpress,com/2015/09/sessionidle,png)
Vend
Enel 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. Aqui el
cashless también podria responder VEND DENIED si no validase la entrega del producto elegido,
por ejemplo.
oa ed
)
|
([Link] files. [Link]/2015/09/[Link])
A continuacién el VMC confirmaré si ha entregado el producto correctamente con el comando VEND
SUCCESS, en caso contrario respondera con VEND FAILURE. Existe otro posible subcomando,
VEND CANCEL que lo enviard el VMC si el cliente cancela la operacién de compra en este momento.
Esto seria que pulsa el botén de devolucién de monedas.
a
([Link] files, [Link]/2015/09/[Link])
bitpsfipatival estoros. wordpress, com/2015I09(2G/ntroduecion-a-especificacion-mdbicp! oneauras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
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.
cee
oats
|
0
([Link] files. [Link]/2015/09/[Link])
Esto finalizaria un ciclo de venta quedandose el dispositivo cashless preparado para iniciar un nuevo
ciclo.
Autor: Patxi Ballesteros @patxiba (https:/[Link]/Patxiba)
Referencias:
© Vending Machine/Cashless Device
(hitps://[Link]/wiki/Vending_Machine/Cashless_Device),
© The MDB protocol. bouni’s blog (hitp://[Link]/blog/2012/05/06/the-mdb-protocol-part-1/)
‘{@bouni ([Link]
16 comentarios en “Introduccion a la
especificacion MDB/ICP”
1. pablo dice:
0/03/2016 a las
Buen dia, muy bueno el blogspot.
‘Tengo un desarrollo, por favor contactar.
Responder ([Link] [Link]/2015/09/29/introduccion-a-la-especit
mdbicp/?replytocom=40#respond)
2. Juan dice:
05/04/2017 a las
Hola Patxi, me encanta tu forma de explicar el protocolo que para mas de uno sigue siendo tabu,
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
bitpsfipatival estoros. wordpress, com/2015I09(2G/ntroduecion-a-especificacion-mdbicp! 1016auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
Responder (hitps://patxiballesteros. [Link]/2015/09/29/introduccion-a-la-espi
mdbicp/?replytocom=48#respond)
icacion-
3. Freddy Luque di
18/07/3017 a las 16:46
Buen dia 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 agradeceria
Responder (hitps://[Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=51 #respond)
4, Losu dice:
19/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 maquina. Tengo dudas de si realmente sabre hacerlo y
no sé si puedo comunicarme con la maquina mediante puerto serie 15232.
Unicamente querria darle la orden de que sacara un producto de las posiciones disponibles. Hay
algtin comando para hacerlo?;Como lo tendria que hacer?
Responder (hitps://patxiballesteros. [Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom: spond)
© 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
18232: [Link]
(\"[Link]")
[Link] comlcontrlando-uns monedero-mdb- <7 arduino/
(\"[Link] ntrolando-un-monedero-m. ")
gist table { margin-bottom: 0; } This file contains bidizectional ae 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 (\"[Link]") 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,Oxff,0x02] PollCoin =
[0x02,0x03,0xff,0x04] TubesCoin = [0x02,0x05,0xff,0x06] ErrorCoin = [0x02,0x0a,Oxff,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 =
[Link]() [Link] = 9600 [Link] = COM-1 [Link] = 10 #10 seconds waiting for
data [Link]() if [Link](): print ‘Open serial port: ' + [Link] #function commands print
def main_console(): print "Menu Commands EasyMDB RS232m' print "For Init Coin Changer
dr
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 Oxff
0x02rn" [Link](InitCoin) data = [Link](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
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! neauras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
"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 Isb = ord(data[33]) country = country
| Isb 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 coin” print "0x02 0x05 Oxtf 0x06rn" ser. write
(TubesCoin) datal = [Link](6) msb! = ord (datal [2]) Isb1 = ord(data1[3}) totaltubes = msb1 <<
8 totaltubes = totaltubes | Isb1 totaltubesreal = float(totaltubes/2.0)#this value for mexico
supported print "Total Coin Tubes:" + "%.2f %ototaltubesreal #function poll coin def poll_coin():
i-0 global scaling while (i<30): print "Poll coin every 1 second’ print "Send 0x02,0x03,0xif,0x04"
ser. write(PollCoin) data? = [Link](10) msb2 = ord(data2[2}) Isb2 = ord(data2[3]) cash = msb2
<<8 cash = cash | Isb2 #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' Yocashreal 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}) Isb2 = ord(data2[6})
coindispensed = msb2 << 8 coindispensed = coindispensed | Isb2 realcoindispensed =
float(coindispensed/2.0) print "Coin dispensed: " +'%.2f Yrealcoindispensed coinerror =
ord(data2{7]) str(coinerror) print "Error coin number: ";coinerror print "mn" i=i+1
[Link](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 Isb4 = amount_string & Ox0Off checksum = 0x02+0x07+msb4#lsb4+0xff
checksu1 checksum & Ox00ff PayOutString = [0x02,0x07,msb4,1sb4,0xff,checksum]
[Link](PayOutString) data5 = [Link](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" [Link](ErrorCoin) data6 = [Link](6) msb6 =
ord (data6[2]) Isb6 = ord (data6[3]) error = msb6 <8 error = error | Isb6 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,0xtf,Oxff,Oxéf,Oxff,0xff,checksum" checksum2 =
Ox02 + 0X08 + Oxéf + Oxf + Oxff + Oxff + Oxff checksum? = checksum2 & Ox00Ff CoinAccepte
[0x02,0x08,Oxff, Oxff,Oxff,Oxff,Oxff,checksum2] [Link](CoinAccepted) data7 = [Link](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 + Oxff checksum? = checksum2 & OxOOff
CoinAccepted = [0x02,0x08,0x00,0x00,0x00,0x00,0xtf,checksum2] ser. write(CoinAccepted)
data7 = [Link](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 + Ox0b + cointype + numbercoin + Oxff checksum =
checksum & 0x00ff DispenseCoin = [0x02,0x0b,numbercoin,cointype,Oxff,checksum]
[Link](DispenseCoin) print "Sending coin dispense" data = [Link](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 = [Link](52) print "Manufacturer code" print
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 126auras, 2409 Invoduccién ala espectcacién MDBLICP | Pali Ballesteros
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}) Isb = ord(databill[32)) scaling_bill = msb <8
scaling_bill = scaling_bill | Isb str(scaling_bill) print "Scaling factor for Bill validator:
" scaling_bill msb = ord(databill[33}) Isb = ord(databill[34}) stackercap = msb <8 stackercap =
stackercap | Isb 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(PolIBill) databill = [Link](7) msb = ord(databill[2]) Isb =
ord (databill[3}) bills = msb <<8 bills = bills | Isb #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
"m" i= i+ [Link](1) #function stacker bill def stacker_bill(): print "Stacker bill function"
print "Send 0x03,0x03,0xff,0x05" [Link](StackerBill) databill = [Link](6) msb =
ord(databill[2}) Isb = ord (databill[3]) numberbills = msb << 8 numberbills = numberbills | Isb
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,0xt,Oxff,0xff,checksum’” checksum = 0x03 + 0x04 + Oxff + Oxff + Oxff checksum =
checksum & Ox00/f Bill Accepted = [0x03,0x04,Oxff,Oxff,0xff,checksum] [Link](BillAccepted)
databill = [Link](6) 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,0xéf, checksum" checksum = 0x03 + 0x04 + 0x00 + 0x00 + Oxff checksum =
checksum & 0x00ff Bill Accepted = [0x03,0x04,0x00,0x00,0xtf, checksum] ser. write(Bill Accepted)
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 Isb = key & Ox00ff checksum = 0x04+0x01+msb#lsb+Oxff checksum = checksum &
Ox00ff display_val = [0x04,0x01,msbIsb,Oxtf, checksum] ser. write(display_val) data = [Link](4)
print "Ok display” init_serial()call function that init serial port while 1: if [Link]()
ser flushInput() #flush input buffer, discarding all its contents [Link]()é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: [Link]() [Link]() elif
command ay_out_coin() elif command == 4: error_coin() elif command
coin_accepted() elif command = 7: bill_init() elif command = 8: poll_bill() elif command
stacker_bill() elif command == 10: bills_accepted() elif command = 11: coin_dispense() elif
command == 12: display_value() view raw
(\“[Link]
1f00086cb3fce/gistfilel py\") [Link]
(\"[Link]") hosted with @
by GitHub (\"https//[Link]\") Una caracteristica especial del protocolo MDB es que usa 9
bits. En cualquier caso, con un Arduino se puede conseguir una comunicacién con la maquina
y enviarle comandos para que, por ejemplo, entregue productos. En la especificacién MDB y
en mi articulo se pueden ver las sefiales que intercambian los dispositivos maestro y esclavo
para realizar una venta
Responder ([Link] [Link]/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=56#respond),
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 1316auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
© Fredd dice:
11/2017 a las 21
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 mas informacién o asesoria puedes contactarme a mi correo 12-
10747@[Link])
Responder (hitps://[Link]/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytoco
7#respond)
5. sergio dice:
12/01/2018 a las 7:49.
el billetero sigue acumulando credito al introducir acualquier denominacion
Responder (hitps://patxiballesteros. [Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=58#respond),
6. Juan C dice:
2/03/2018 a las 16:54
HOLA.
Tengo una inquietud.
ga través del protocolo MDB «dispositivo cashless» puedo ingresarle a la maquina la seleccién
que quiero comprar? 0 necesariamente tengo que seleccionarla en el teclado de la maquina?, de
que forma se hace?
Saludos y muchas gracias
Responder ([Link] [Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=62#respond),
© Patxi Ballesteros dice:
Hola, el dispositivo cashless pone el crédito, pero luego hay que seleccionar en el teclado
multiplexado el eé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 sefial
al teclado multiplexado para que expulse el producto solicitado,
Responder ([Link] [Link]/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=63#respond)
7. Tomas dice:
0/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 (hitps://patxiballesteros. [Link]/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 Pata, 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
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion--a-especifcacion-mdbic! 146auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
Responder (hitps://patxiballesteros, [Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=67#respond)
© Patxi Ballesteros dice:
11/10/2018 a Tas 23:
Yo pienso que si. Una sefial de salida en Arduino puede activar cualquier dispositive. Eso si,
dependiendo del consumo de la carga habra que usar un relé, transistor o triac.
Si quieres sacar una sefial por otro pin, no hay problema, pero eso requiere programarlo.
Responder (hitps://[Link]/2015/09/29/introduccion-a-la-
cespecificacion-mdbicp/?replytocom=69#respond)
9. Rafael Guette Durango dice:
5/05/2019 a las 1
Hola Patxi, me gustaria 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 (hitps://patxiballesteros, [Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=101érespond)
jejandro dice:
15/02/2020 a las 5:08
Hola Patai, Tengo un problema con este protocolo en general. Podria asesorar me al respecto.
Intento aplicarlo a microcontroladores pics. Gracias
Responder (hitps://[Link]/2015/09/29/introduccion-a-la-especificacion-
mdbicp/?replytocom=110#respond)
. Eduardo Garcia dice:
12/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 mquinas reciben una sefial de pulsos del monedero, en funcién del dinero
introducido, Ahora estan empezando a venir maquinas sin entrada de pulsos. Sélo RS232, y le
monedero es el mismo. El caso es que no hace ni un afio que se desarrollé una aplicacién para
cobro a través de internet, que mete los mismos pulsos a la maquina, y ademés cuenta los pulsos
introducidos por el monedero para informar de la facturacién, asi que es una pena tener que
deshacerse de esa aplicacién tan pronto. Para ello habia 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.
10.
¢Sabes si hay alguna libreria o alguna solucién que me pudiera servir? Estoy muy perdido con el
tema. Supongo que la otra opcién es meter la seal a una entrada, y contando tiempos desde el
primer «1»(bit de inicio), ver la trama. Pero no sé si seria muy fiable. Por ejemplo, si cada pulso
dura 5 ms, contar 5 desde el primer flanco y ver lo que hay. Pero, zy sino 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.
madbicp/?replytocom=116#respond)
© Tragamonedas Gominola dice:
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,
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion--a-especifcacion-mdbic! 1816auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros
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 [Link]
(htips://[Link]/iottelegram)
Responder (hitps://patxiballesteros. [Link]/2015/09/29/introduccion-a-la-
cificacion-mdbicp/2replytocom=124#respond)
@
Blog de [Link]. ([Link]
bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion--a-especifcacion-mdbic! 16116
También podría gustarte
IVIZION
Aún no hay calificaciones
158 páginas
Rif
Aún no hay calificaciones
1 página