Operate a Coin Acceptor

The initialization sequence as defined per the MDB Specification is as follows:

M,1 R,08 R,09 R,0F,00 R,0F,0100000000 R,0A R,0C,000F0000 (Poll, in loop)

Now, below, there is a python program that does this sequence programatically.

Some remarks:

  • This program follows the advised sequence described in Section 5 of the MDB Specification to Initialize a Coin Acceptor.

  • The Tube status is always empty

  • The program is doing nothing with Coin Inserted events

  • The VMC is not enabling any of the Expansion Features that are allowed for level 3 Coin Acceptors.

  • If the coin acceptor sends an incorrect message, the sequence is not reinitialized (this is something that must be done if the program is to be used in a real VMC)

  • Code is not optimized (e.g. Readline must be called after write2Serial, so this could be put in a function)

  • The goal of this example is to demonstrate and keep it simple, this is not suitable for "Real" VMCs. However, it can serve as a starting point.

from os import read, write import serial,sys,time #Commands that need to be sent to the interface # M,1 -> Activate Master # R,08 -> Reset Coin Changer # R,0B -> Obtain Just Reset from Changer~ # R,09 # R,0F,00 -> Request additional Features (LVL 3+ Only) # R,0F,01ZZZZZZZZ -> To enable desired features (depends on the changer's reply to previous command) (LVL 3+ Only) # R,0A -> Tube Status # R,0C,000F0000 # No manual Dispense (Last 2 Bytes), Coin Types 1,2,3 and 4 are accepted (000F , on first 2 bytes) # R,0B -> Poll (In Loop) # COMMAND DEFINITION ENABLE_MASTER="M,1" RESET_COIN_ACCEPTOR="R,08" REQUEST_SETUP_INFO="R,09" EXPANSION_REQUEST="R,0F,00" EXPANSION_FEATURE_ENABLE="R,0F,0100000000" TUBE_STATUS_REQUEST="R,0A" COIN_TYPE="R,0C,000F0000" POLL="R,0B" ########################################### #CHANGER RESPONSE TABLE def initSerialPort(portName): global ser ser = serial.Serial() #Create Serial Object ser.baudrate = 115200 #Set the appropriate BaudRate ser.timeout = 1 #The maximum timeout that the program waits for a reply. If 0 is used, the pot is blocked until readline returns ser.port = portName # Specify the device file descriptor ser.open() #Open the serial connection def readSerial(): global ser s = ser.readline().decode('ascii') # Read the response # DEBUG : print("Read from Serial port: " + s) return s def write2Serial(message): global ser buff = message + "\n" ser.write(bytes(buff,'ascii')) #Write the version command "V\n" encoded in Binary def initCoinAcceptor(): write2Serial(ENABLE_MASTER) readSerial() write2Serial(RESET_COIN_ACCEPTOR) readSerial() write2Serial(REQUEST_SETUP_INFO) setupInfo = readSerial() print("Changer Setup Info:" + setupInfo) write2Serial(EXPANSION_REQUEST) expansion = readSerial() print("Changer Expansion Response:" + expansion) write2Serial(TUBE_STATUS_REQUEST) readSerial() write2Serial(COIN_TYPE) readSerial() def startPollLoop(): while True: write2Serial(POLL) # Poll Coin Changer print("Changer Response:" + readSerial()) time.sleep(0.5) if __name__ == "__main__": print("Qiba Simple python example to operate a coin acceptor\n\n") if len(sys.argv) != 2: print("Usage: python VMCCoinAcceptor.py <port_name>") exit(1) portName = sys.argv[1] initSerialPort(portName) write2Serial("V") print("Device Firmware version:" + readSerial() + "\n") initCoinAcceptor() startPollLoop()