Protocolo MDB
Protocolo MDB
Protocolo MDB
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 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)
Maestro a periférico
(https://patxiballesteros.files.wordpress.com/2015/09/maestroperiferico.jpg)
Periférico a maestro
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.
(https://patxiballesteros.files.wordpress.com/2015/09/checksum.jpg)
Tiempo de respuesta
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
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.
(https://patxiballesteros.files.wordpress.com/2015/09/poll.jpg)
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
(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)
(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)
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)
Session Idle
(https://patxiballesteros.files.wordpress.com/2015/09/sessionidle.png)
Vend
(https://patxiballesteros.files.wordpress.com/2015/09/vend.png)
(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)
Referencias:
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?
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?
Responder (https://patxiballesteros.wordpress.com/2015/09/29/introduccion-a-la-
especificacion-mdbicp/?replytocom=124#respond)