Saturday, July 30, 2011

Arduino Vending Machine: 2 - Accepting Dollar Bills


Updated - (8/1/2012)!
Summary
This is a tutorial of how to use an Arduino to count the number of dollar bills accepted by a bill validator (BA-30).

Description
This tutorial is about using an Arduino to count dollars that were accepted by a bill validator. This is a common type of bill validator used in machines that take money and give something (vending machines).  The goal is to connect the bill validator to the Arduino and be able to know when a dollar bill has been accepted.

Specifically, we will use an Arduino to read pulses from a bill validator.  Normally, the pulses read from the bill validator will be in the range of 8000 to 9000.  When we insert a dollar bill into the bill validator and the bill validator accepts the bill, we will be able to read pulses above 12000 from the bill validator.  Given this, we can tell when a bill is accepted.
If (duration > 12000)
{
     billCount++;
}

Before we begin
Divide and Confuse...
In many forums around the web, there is great interest in how to use an Arduino to accept cash.  Unfortunately,  there is very little concrete information about how to it.  What's worse is that these devices, bill validators and coin mechanisms, use different protocols.  Many devices that share a common protocol share the Multi-Drop Bus (MDB) protocol which uses a 9-bit word.  Enough said.

Bill Validator explained
The bill validator takes dollar bills.  For the most part, all it does is take money in paper form, validate it (make sure it is real), store it, and report that one piece of money (of a certain value) has been accepted.  The bill validator is also known as a bill acceptor or that thing that takes dollars (or other appropriate local currency).

The idea for everything is simple, we are just listening for when the bill is accepted.  We are using the Arduino to listen to the bill validator.  The bill validator has all of the logic to know when it has accepted the paper currency.  In the case of this tutorial, we are using the BA-30, made by Coinco.  The nice thing about the BA-30 is that it provides us with two ways to listen to it.  The first is using pulses and the other is using the MDB protocol.  We will be using the pulses.

Safety (always)
"You gotta play it safe around the power lines" - Louie T.L. Bug
Experimenting with the combined equipment of an Arduino, bill validator, and computer can cause harm to you or your equipment under certain situations.  Here's some items to consider for some of the components involved.

Bill Validator
In order to power the bill validator, you will need to hook it up to power from an outlet.  It is relatively simple but if you don't feel comfortable, don't do it.  Find someone that has done something similiar and have them help you.

D.) Other
This is the other category.  This is all meant to be fun.  When experimenting, there may be times you feel uncomfortable or unsafe about doing something in a project.  At times like these, find a person, forum, or group (Arduino forums linked) to ask and make your situation safe at all times.

Steps
Control the ESC/Motor using an Arduino
  1. Setup the bill validator.
  2. Connect the bill validator to Arduino.
  3. Upload your sketch to the Arduino.
  4. Use a dollar and watch for the output.


Begin
1. Setup the bill validator.

Figure 1.1 - The pins

We are going to work with the pins A through F {A,B,C,D,E,F} as these are for pulses.  Disregard the pins G through K as they are for MDB and aren't covered in this tutorial.

As you can see from Figure 1.2, I use a wire harness for the BA30.  You can find them on the internet.  If you are looking for them, search for "BA30 wire harness" or "BA30 coinco wire harness". As long as one end goes to the BA30, you don't really care what the other end goes to.

 First we need power.  Power the BA30 with main (110V) power.  NOTE: Power from an outlet can kill you.  Don't attempt this if you don't know how to be safe.  There is a picture below with all of the pins labeled (Figure 1.1).  This picture is from the kegbot blog at: http://kegbot.blogspot.com/2004/11/coinco-magpro-mag50b-pinout.html Take the line of a power cord and splice the hot into "110VAC Hot" (on the picture it's pin F), and again splice the hot into the "Hot Enabled" (on the picture it's pin E).  Take the line's neutral and splice it into "110VAC Neutral" (on the picture it's pin C).

Figure 1.2 - Sideview with pins labeled




2. Connect the bill validator to the Arduino
According to the diagram in Figure 1.1, the bill validators pin labeled "A" is the "cr-" line.  It is difficult to see but the line is green.  Take this line from the bill validator and put it in the Arduino pin #7 (this is the pin used in the sketch).  The next line we need from the bill validator is labeled "B" or the "cr+" line.  This line needs to tie into the +5v as shown below (Figure 2.1)

Figure 2.1 - Connecting bill validator to Arduino

3. Upload you sketch to the Arduino
The hard part is over.  Upload the following sketch to your Arduino:


/*
* Sean
* globalw2865@gmail.com
* 30JUL2012
* Bill validator/Arduino (second draft)
*/

/*
* RESOURCES:
* http://www.arduino.cc/en/Reference/PulseIn
* http://kegbot.blogspot.com/2004/11/coinco-magpro-mag50b-pinout.html
* http://www.coinco.com/coin/faq/servicematerials/921970_1.pdf
*/

/*
* Description:
* Arduino records and counts dollar bill received from pin 7 (billValidator).
*/

// Constants //
// pin for the bill validator's credit(-) line
const int billValidator = 7;

// Variables //

// recording the duration of pulse (milliseconds)
unsigned long duration;

// holding the total dollars recorded
int dollarCounter = 0;

void setup()
{
  // Pin setups for bill validator and button
  pinMode(billValidator, INPUT);
 
  // Initialize serial ports for communication.
  Serial.begin(9600);
  Serial.println("Waiting for dollar...");
}

void loop()
{
  // get the duration of the pulse
  duration = pulseIn(billValidator, HIGH);
   
  // Receiving a dollar bill will create a pulse
  // with a duration of 150000 - 160000.
  // NOTE: When there is no dollar bill pulse,
  // I will receive a pulse of 8400 - 8600
  // on every loop.
  // Dollar received
  if(duration > 12000)
  {
  // Count dollar
  dollarCounter++;
  // Checking for understanding
  Serial.print("Dollar detected.\n Total: ");
  // Display new dollar count
  Serial.println(dollarCounter);
  }
     
}


4. Use a dollar and watch for the output

First dollar (Figure 4.1)

Figure 4.1


Second dollar (Figure 4.2)

Figure 4.2


5. Done
The tutorial is fairly simple.  Many thanks to anyone who has corrected me.  Also, if anyone is interested in this, you will probably be interested in the posts on the Bounis Blog.  They go into detail on the MDB protocol (well done).




17 comments:

  1. Sean - thanks for this experiment. I was wondering if there were any updates on how this turned out? I'm working on something similar with the BA30 acceptor and currently troubleshooting. Did you use the Credit (-) or Credit (+) to input the pulse to an arduino pin? Your instructions and code were different. Any input would be appreciated!

    ReplyDelete
  2. Good point! I'll have to correct that, thanks.

    In the example sketch, I believe that Credit(-) goes to the gnd and the Credit (+) was assigned to pin 7.

    So from the example, this:
    // pin for the bill validator's credit(-) line
    const int bValPin = 7;

    Should be:
    // pin for the bill validator's credit(+) line
    const int bValPin = 7;

    Of course, I'll have double check in order to be sure. Thanks and good luck!

    ReplyDelete
    Replies
    1. Hi Sean, We've been troubleshooting 2 coinco ba30s over the last few months with your setup, code and a arduino uno with no success and would appreciate any advice you could offer. We have the dip switches set properly (3 and 8 on) and have been reading (via serial monitor) a loop pulse of about 8000 but have not recorded any high pulses when bill is inserted. There is sometimes a blip of about 600 or so when a bill is inserted but its too small to be reliable. Trying to figure out if its a hardware or software issue. What type of wire did you use? Length of wire? Any resistors, etc?

      Delete
    2. Given the interest, I'm working on a proper rewrite. Off the top of my head, I believe a 2k resistor was used between the bill validator and arduino (pin 7 of example).

      Delete
  3. Hi Sean,

    i work on get MDB running on an Arduino.
    So far i have a working version of a cashless device, but the code is very ugly (i'm not a programmer ;) )
    The project is documented here:

    https://reaktor23.org/de/projects/mate_dealer

    ReplyDelete
    Replies
    1. Thanks Bouni,
      Your project was part of the reason that I got as far as I did. It's really cool that you got that far. Also, the diagrams labeled, "basic wiring" and "experimental setup" are really helpful. Also, the MDB protocol diagram is an excellent visual aide for someone who is trying to understand the vendor MDB protocol document (book). I intend to come back to this as I don't like to leave projects like this unfinished. Thanks for your work and sharing.

      Delete
  4. Oh really! I'm surprised by your post.Great and impressive work.Thanks for sharing.

    ReplyDelete
  5. Hi, I was wondering if anyone has worked on the reverse, I would like to imitate a BA30 with a vending machine. I want to swipe a rfid tag and add a dollar to the vending machine.

    ReplyDelete
    Replies
    1. Hi John,
      As a short answer, to imitate the BA-30 (on most vending machines) you would need your rfid reader to be a slave (just like the BA-30) that listens and speaks to the controller (master or vend controller) using the MDB protocol. There haven't been many common/simple implementations.

      There have been people that have worked on this subject. The most work has been done with interfacing payment devices with an Arduino. The least amount of work has been integrating a new peripheral into an existing vending machine system.
      In general, vending machines are slightly different when trying to develop for these machines. For some reason (I assume proprietary or hardware convenience reasons), most implement a 9-bit protocol known as Multi-Drop Bus. It is 8-bits of data with a mode bit (address or data). This is where most people stop trying to integrate with the current system (MDB) and just replace it with something else or just interface with the peripherals they want to use.
      There is some equipment (like the ba-30) that is nicer to use. I've even read specs on some stuff that just uses regular rs-232 serial commands, but most of the vending machines from the (at least) past 10 years rely on this MDB conversation.

      Here is a good link of people figuring this out:
      http://forum.arduino.cc/index.php?topic=64460.0

      And if you are interested in more material about how this all works, bounis (comments above) has very detailed information on how this work. He also shows work for the matedealer.
      http://blog.bouni.de/

      Delete
  6. Wow, this totally worked! It worked on the first time! I'm using an old Mag50BAB, but everything worked just the way you said it would. Thank you for this tutorial!

    ReplyDelete
  7. Worked like a charm. Great post!!!

    ReplyDelete
  8. what the bill acceptor you use sir?

    ReplyDelete
  9. Hi Sean, I just wanna know if do you have a tutorial for coin acceptor. Thanks.

    ReplyDelete
    Replies
    1. I've spent time working with coin acceptors. I don't have a specific tutorial but the following might help you.
      Almost all vending machines use multidrop bus communication (RS-485), https://en.wikipedia.org/wiki/Multidrop_bus#MDB_in_Vending_Machines. A vending machine has a master (controller or motherboard-like board) and slaves (things like a coin acceptor or bill validator). While the vending machines we know around the world are very robust, the equipment and communication they use are not usually stuff that we (you and I) tinker with. For starters, commonly available coin acceptors communicate with the control board at some baud speed, 9N1 (9 data bits, no parity bit, and 1 stop bit). A lot of devices we are used to communicate at some baud speed but 8N1.

      A great resource to learn more about this subject is at bouni's blog. http://blog.bouni.de/blog/2012/05/06/the-mdb-protocol-part-1/

      To understand more about coin changers this faq from coinco is helpful:
      http://www.coinco.com/index.php/support/faqs

      If you have an existing coin acceptor that you need to interface, you'll probably be stuck trying to communicate by understanding the MDB protocol in vending machines. If all you want to do is to take coins, there are other devices available. These devices are much simpler.
      https://www.adafruit.com/products/787
      https://www.sparkfun.com/products/11636
      https://github.com/sparkfun/HaterMatic/wiki/Setting-up-the-coin-acceptor
      http://www.robotshop.com/media/files/pdf/datasheet-com-11636.pdf

      Hope this helps!

      Delete
    2. Thanks Sean! The coin acceptor I have here does not support mdb. I just want to determine/display the three pulses (1, 5, 10) in arduino uno.

      Delete
  10. This comment has been removed by the author.

    ReplyDelete