1st project: Neo-Geo MVS arcade shield

Hey all,

I'm about to start on my first Arduino project - 'Neo-Geo MVS arcade shield'

Problem:
The Neo-Geo MVS arcade machine has a lot of features built into the main PCB that cannot be taken advantage of without the use of specialised parts that were not provided as standard. These parts are becoming increasingly few and far between and have therefore dramatically increased in value. PCB specs: http://www.hardmvs.com/manuals/MV2F-MV4FServiceManual.pdf
The additional features include:

  • displaying the current credits remaining for player 1 and player 2 (provided by two small PCBs that each had two 7-seg displays)
  • indicating the current game selected by illuminating an lcd-panel that simply back-lit a small poster - some arcade cabs supported up to 6 panels
  • allowing users to save games to an AES memory card
  • allowing both users to plug in headphones

Here are the parts that are increasingly hard to acquire:

Solution:
Enable an Arduino to provide the above features by creating a shield that can remain inside the arcade cab. The shield should read the host of pins on the arcade PCB, interpret them, and then update 2 sets of 7-seg displays (to display up to 99 credits per person) as well as illuminate a corresponding LED panel or bulb to indicate the current selected game. The Memory card reader is probably out of scope as it would still require some form of specialed pin array to make contact with the memory card pins. Additionally the ability to plug in headphones an be supplied with two simple audio extension cables - so probably not suitable for this project.

Additional features:
As well as provide the replacement features I'd like to include some optional extras - a small LCD readout of things like internal cab temperature, volume level, current game name, and play time. This LCD could also replace the 7-segs entirely. I'd also like to include pause button functionality and maybe allow adjustment of volume for headphones and / or speakers.

Is this an appropriate use of an Arduino?

I've bought an Arduino Mega in preparation and am currently studying BCD to 7-seg ICs to power the 7-seg displays. Arcade cabs readily have 12V, 5V and GND pins available to power the Arduino.

Any feedback appreciated!

You described it well, and you know a lot about it. So perhaps it can be done.
Starting with the 7-segment display is a good option.
After that you can expand the functions.

You could even make a program on a PC, that shows the 7-segment display.
The memory is probably some kind of EEPROM memory. If you know the interface you could use perhaps a hardware EEPROM that also can be read by the Arduino.

I've a few questions relating to the path i'm taking to address the 7-segment displays:

  • What's the best way to control 2 pairs of 7 segment displays? (both pairs need to be able to display 0 to 99 independently of the other pair)
  • Can I send the same 'blank', 'store' and test lamps' signal to both CI's?
  • How do I know what resistors are needed between the CI's and the Arduino and between the CI's and the 7-segment displays?

Pin-out on the CI:

Thanks!

There are so many ways to use a 7-segment display.
You should pick one that you are comfortable with.

The Arduino Mega has so many pins, perhaps only 4 transistors and a number of resistors can be used.

Playground section, Arduino Playground - HomePage
Search for "seven".

Adafruit, Adafruit 0.56 4-Digit 7-Segment Display w/I2C Backpack - Yellow : ID 879 : $9.95 : Adafruit Industries, Unique & fun DIY electronics and kits
Try the "Tutorial".

Sparkfun, 7-Segment Display - 4-Digit (Red) - COM-09483 - SparkFun Electronics
With example code.

Take a look at another thread: http://arduino.cc/forum/index.php/topic,159704.0.html

If you go here, pighixxx.com
and open "ABC – Arduino Basic Connections (ver1rev0)", you see on page 10 a 4 digit 7-segment with the MAX7221. I have not used that chip, but the circuit is very simple. It needs only one resistor. The chip costs about 5.50 dollars on Ebay, but it makes it very easy.

Progressing well - multiplexing 7-segments is sorted.

I'm now focusing on reading the values of 13 pins from the arcade mainboard.
I'm sure the pins are changing value (I've got the arcade machine in hardware test mode and it should be incrementing both credit values) but I'm finding it difficult to get an understandable reading. Digital read of the pins was fruitless - what sort of things would I need to know / change in order to use this approach? Changing to analogue read I can see some of the pins changing to a maximum of about 350.
The 3rd pin is the clock pin (looked up the specs) so should I actually set an interrupt pin on this and watch for a change in value?

How should I go about reading highs and lows from these 13pins? The last pin is GND from the board and the 1st pin is 5v. I'm using an IDE cable to connect the 13pins to the arduino.

1 -> 5V
2 -> 5V
3 -> clock
4 -> D1
5 -> D2
6 -> D3
7 -> D4
8 -> D5
9 -> D6
10 -> D7
11 -> D8
12 -> GND
13 -> GND

How did you use the 7-segment display ?
Since you asked how to do it, we would like to know what choice you made and if you are happy with it.
That will benefit everyone reading this thread.

Are you sure 2=5V and 13=GND ? Did you check it with a multimeter ?

It could be an TTL output.
The logical '1' of an old TTL chip is not 5V, but perpaps 3V.
You could try to enable the internal pull-up resistors or the Arduino.

void setup()
{
  pinMode( 2, INPUT_PULLUP);
}

void loop()
{
  int i = digitalRead( 2);
}

Please don't use pin 1, that is used to upload a sketch and for the serial monitor of the Arduino.

Thank you for the advice - the 'INPUT_PULLUP' did indeed solve the issue.

I'm now reading the pins and am converting the resultant BCD into decimal for display.
I'm only reading the data pins when the clock pin goes high. I've written some basic logic to display the credits for both players, and the current selected game number, over serial. I'll post a link to the code on github once it is finalised.

For those interested in the 7-segment displays - I selected 2 pairs of common anode 7-segs as they allowed me to use way less resistors. I'm clocking / latching bits in serial to four 74HC595N shift registers which then send the data in parallel to each individual 7-seg. In this way i'm only using 3 ports per 7-seg display. I know there are good ways to reduce this number down but I'm not that worried as the Mega has plenty more left over.

The next stage of the project will be to convert the decimal numbers into displayed credits and light up individual panels to represent the selected game. I guess the final stages will be to develop a shield - or at least list the parts / documentation / code up on github so that the community can utilise it.

Complete code for a working solution is now available here:

Includes 7-segment display code and the MVS interface.