Está en la página 1de 16
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 (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 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! 6 2e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestoros eC PE (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 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 press.com/2015/09/maestroperiferico.jpg), © Periférico a maestro bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 26 2e12te4, 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. (https://patxiballesteros. files. word press,com/2015/09/checksum.jpg) 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! 36 2e12te4, 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 > (https://patxiballesteros. files. wordpress.com/2015/09/hardware.jpg), Los periféricos se aislan eléctricamente del bus mediante unos optoacopladores, ver siguiente imagen. tips:ifpatxibalesters,wordpress,com/7015/091291introducclon--Ja-especificacion-mdbicp! ane 2e12te4, 21:09 Invoduccién ala especiicacién MOBIC? | Pati Ballesteros ve << erioher Yc vere Out (https://patxiballester ordpress.com/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. iles.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 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 (https://patxiballester bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 56 2e12te4, 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} (https://patxiballesteros files. wordpress.com/2015/09/maquinaes s.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 E1 VMC envia un comando de RESET al dispositivo. (https://patxiball files. wordpress.com/2015/09/inactive.png) bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! ene 2e12te4, 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 (https://patxiballesteros files. wordpress.com/2015/09/justreset.png) 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, (https://patxiballesteros files. wordpress.com/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 (https://patxiballesteros files. wordpress.com/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! 716 2e12te4, 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 (https://patxiballesteros. files. word press.com/2015/09/disabled.png) 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. wordpress.com/2015/09/enabled.png), (https://patxiballester 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! ane 2e12te4, 21:09 Inwoduccién ala especiicacién MOBIC? | Pati Ballestros (https://patxiballesteros 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 ) | (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 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 (https://patxiballesteros files, wordpress.com/2015/09/vendsuccess.png) bitpsfipatival estoros. wordpress, com/2015I09(2G/ntroduecion-a-especificacion-mdbicp! one auras, 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 (https://patxiballesteros files. wordpress.com/2015/09/sessioncomplete.png) Esto finalizaria un ciclo de venta quedandose el dispositivo cashless preparado para iniciar un nuevo ciclo. Autor: Patxi Ballesteros @patxiba (https:/twitter.com/Patxiba) Referencias: © Vending Machine/Cashless Device (hitps://wiki.nottinghack.org.uk/wiki/Vending_Machine/Cashless_Device), © The MDB protocol. bouni’s blog (hitp://blog.bouni.de/blog/2012/05/06/the-mdb-protocol-part-1/) ‘{@bouni (https://github.com/bouni) 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 (https://patxiballes ordpress.com/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! 1016 auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros Responder (hitps://patxiballesteros. wordpress.com/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://patxiballesteros.wordpress.com/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. wordpress.com/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: https://www.mayavending.com/producto/easymdb/ (\"https://www.mayavending.com/producto/easymdb/\") https://www.mayavending, comlcontrlando-uns monedero-mdb- <7 arduino/ (\"https://www.mavavending. 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 (\"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,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 = 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 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" 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 bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! ne auras, 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 = ser.read(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? = ser.read(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 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 Isb4 = amount_string & Ox0Off checksum = 0x02+0x07+msb4#lsb4+0xff checksu1 checksum & Ox00ff PayOutString = [0x02,0x07,msb4,1sb4,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]) 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] 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 + Oxff checksum? = checksum2 & OxOOff CoinAccepted = [0x02,0x08,0x00,0x00,0x00,0x00,0xtf,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 + Ox0b + cointype + numbercoin + Oxff checksum = checksum & 0x00ff DispenseCoin = [0x02,0x0b,numbercoin,cointype,Oxff,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 bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 126 auras, 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 = ser.read(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+ 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}) 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] ser.write(BillAccepted) databill = ser.read(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 = 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 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 (\“https://gist.github.com/thinkchip/114f6e84904ead2bd086/raw/Od0faf88860cacebeda38a601e 1f00086cb3fce/gistfilel py\") gistfilel.py (\"https://gist.github.com/thinkchip/114f6e8d904ead2bd086#file-gistfilel-py\") hosted with @ by GitHub (\"https//github.com\") 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 (https://patxiballesteros. wordpress.com/2015/09/29/introduccion-a-la- especificacion-mdbicp/?replytocom=56#respond), bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion-s-la-especifcacion-mdbic! 1316 auras, 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@usb.ve) Responder (hitps://patxiballesteros.wordpress.com/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. wordpress.com/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 (https://patxiballesteros. wordpress.com/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 (https://patxiballesteros, wordpress.com/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. 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 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! 146 auras, 2409 Inroduccin a la expecticacién MDBIICP | Pati Ballesteros Responder (hitps://patxiballesteros, wordpress.com/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://patxiballesteros.wordpress.com/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, wordpress.com/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://patxiballesteros.wordpress.com/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! 1816 auras, 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 https://tme/iottelegram (htips://t.me/iottelegram) Responder (hitps://patxiballesteros. wordpress.com/2015/09/29/introduccion-a-la- cificacion-mdbicp/2replytocom=124#respond) @ Blog de WordPress.com. (https://wordpress.com/es/?ref=footer_blog) bitpsfipatbal esteros. wordpress, com/2015I09/20/ntraduecion--a-especifcacion-mdbic! 16116

También podría gustarte