Vending Machine/Cashless Device Implementation

From Nottinghack Wiki
Jump to navigation Jump to search


We now have two versions of the custom cashless device:

  1. v1 - created for the Westomatic vending machine, and uses a nanode and RDM880 based RFID module, and is build mostly on perf board.
  2. v2 - created for the BevMax45 vending machine, and is heavily based on v1, but now uses a custom PCB with a SAM D21 MCU (same as the Arduino Zero), a WizNet Ethernet shield and a MFRC522 RFID reader. There is an aim to update the first vending machine to use a v2 cashless device, but as of Dec 2018, this hasn't been done yet.



The cashless device has been built around a nanode, which is connected using UDP/IP over an Ethernet connection to holly.

There is a board between the Nanode (see Media:VMC-Nanode Schematic.png) and the vending machine which both powers the nanode from the ~34vdc supply, and allows serial communication with the VMC.

The nanode is connected (using software serial) to an RFID reader mounted under the 'H' logo on the outside of the Vending machine. There is also a micro-switch attached to the coin-reject mechanism (to allow any RFID card read to be cleared from memory), and a blue LED above the reader to indicate when a card has been read & recognised. An LCD to show your username & current balance was added in July 2013.

Firmware for this device is in GitHub.

The diagram below shows the connection between devices:
Vend devices.png


The second cashless device uses a cutom PCB using the SAM D21 MCU (as used in the Arduino Zero), and has numerous changes, including:

  • A MFRC522 RFID module, which is the same as the NoteAcceptor, tools boards, etc., instead of a RDM880 based module
  • Uses TCP/IP to connect to a Mosquitto MQTT broker on holly instead of UDP/IP. The messages sent remain the same.
  • A serial based setup menu, to allow for entry of device name, IP, etc. This should allow the same firmware to be used unmodified in both machines.

Vend pcb.jpg Vend pcb2.jpg Cashless device2 display.jpg

Firmware for this version is also in GitHub.


To keep things simple, the interface to holly is text based; the sequence of messages is shown in the flowchart below:
Vend messages.png

For v1, these messages are sent using UDP/IP, for v2 they use MQTT, transmitting on the nh/<device_id>/tx topic and receiving on the nh/<device_id>/rx topic. Not an ideal implementation for MQTT by a long way, but reuses a message flow that's been working well for some years.

Message details

From To Details
VM Holly AUTH:<RFID serial>
Sent when RFID card first read
Holly VM GRNT:<RFID serial>:<transaction number>
Sent in response to AUTH if the card is known & marked as active in the database.
Holly VM DENY:<RFID serial>
Sent in reply to AUTH if the card is either not know, or marked as expired/canceled.
VM Holly VREQ:<RFID serial>:<transaction number>:<amount>
Sent when a selection is keyed in. <amount> is in pence.
Holly VM VNOK:<RFID serial>:<transaction number>
Sent in response to VREQ if the purchase is permitted (e.g. credit limit won't be exceeded).
Holly VM VDNY:<RFID serial>:<transaction number>
Sent in response to VREQ is the vend should be denied for any reason.
VM Holly VSUC:<RFID serial>:<transaction number>:<position>
Sent after the VMC reports to the nanode that the product has been successfully vended.
VM Holly VFAL:<RFID serial>:<transaction number>
Sent if the VMC reports that the vend failed. ***UNTESTED*** for the Westomatic machine, as we don't beleive the machine can/would ever report a failed vend. The BevMax45 can report failed vends (if enabled on the machine), but due to a fault with the drop sensors, it was reporting every vend as failed, so this has been switched off.
VM Holly VCAN:<RFID serial>:<transaction number>
Sent if the coin reject button is pressed. Will record a cancelled vend if an AUTH has been sent, but no VREQ yet received - otherwise it has no effect.
VM Holly INFO:<debug message>
Information message that can be sent at any stage - has no effect other than being written to a log on holly.
Variable Description
<RFID serial> RFID serial number - expected to be 9 digits long
<transaction number> Unique number assigned to the vending machine transaction when an AUTH message is received with an active RFID serial, and must be included in all related messages.
<position> Position in the vending machine as reported by the VMC. Note that this location is mapped to the locations codes displayed in the vending by holly (e.g. 41-31 reported here corresponds to location A1).

Example session

(card presented)
(Selection made)
(Product vended)

Source Code

The code of the server side component is on Github (the relevant part is nh-vend.cpp). This code is common to both v1 & v2 of the cashless device, and also handles payments received via the NoteAcceptor & CoinAcceptor.