Nixie Tube Racquetball Scorecard

Update 11.19.13, cosmetics finished:

Video here: Racquetball Scorecard Nixie Tube Display - YouTube
And some pics:

The build as previously posted:

So this is my first project with any real meat to it, and I have learned a ton doing it. I have tinkered with the arduino for a long while now, but this is my first attempt at actually creating something.

Firsts include:
Nixie Tubes (170VDC)
Shift Registers
Wireless Comms (using Ciseco SRF modules, had to make a FTDI cable and learn to use that)
Serial Comms as instructions
off-board arduino, both with a ATMEGA328 and an ATTINY85 (burning the bootloader, arduino as ISP)
soldering a project into a permanent location. I now regret not etching my own PCB for this part, I used perfboard.
edit I decided that i would take my driver circuit on the perfboard debacle and use it as an opportunity to learn how to etch pcb's. It was an enormous success, and I think it is something everyone interested in electronics tinkering should spend the time learning. I have sucessfully created a relativley small footprint with a double sided board, that works beautifully.
enclosure construction - i am not particularly happy with how it turned out, but I am not really a woodworking guy, and got impatient with some parts. There is still some to do, explanation below.

The project:
A scorecard, with enough displays to indicate 3 separate teams, 2 digits per team. (racquetball is normally 1-on-1, or 2-on-2, but with my group of friends, we like to play a variation called 'cuthroat', 1-on-1-on-1). Scores range from 0-15, a lead by 2 is not required to win. Racquetball is played in a large cube room, usually with a glass back wall, and I didn't want a device inside the room to interfere with gameplay. The display device is comprised of 6 nixie tubes, grouped in two's, controlled by an ATMEGA328, through shift registers and HV transistors. I decided not to multiplex (another regret, I should have, just for learning how, if nothing else) so to achieve enough outputs, 2 shift registers are used per pair of nixie tubes. this gives me the ability to display 00-59 on any pair of tubes, and as a happy coincidence, is just enough to have the unit serve dual purpose, at some point in the future, I will also make it into a clock. The enclosure itself is made of balsa wood, and will have some strong suction cups to hold it to the rear glass.

How to adjust the score took me a little longer to decide on, but I eventually went with a ATTINY85, Ciseco SRF module and 4 buttons, powered by a coin cell battery. It had to be small, and unobtrusive to gameplay, which extends into ease of use as well - I didn't want to have to pause every time while someone went to the rear glass and waved their hands at sensors or something. A sweatband with the above components was my answer.

I know my code is inelegant, but I wanted to attempt the whole thing without running to the forums for every answer, and it works, so there is something to be said for that.

Display Code can be downloaded here (too large to post):
https://www.dropbox.com/s/o6nbryif02nduav/Racquetball_Scorecard_HE_V0_5__2400_.ino

remote code:

/*
Zac Tennyson
 5.14.13
 Raquetball Scorecard Remote End
 */

#include <SoftwareSerial.h>
SoftwareSerial mySerial(9, 0);      //define RX pin as non-existent(9), only need TX for the wristband
int t1Pin=1;
int t2Pin=2;
int t3Pin=3;
int negPin=4;

int time=0;
int timenow=0;
int interval=150;

int n=0;

void setup() 
{                

  for(n=1;n<5;n++)
  {
    pinMode(n,INPUT);
    digitalWrite(n,HIGH);
  }

  mySerial.begin(2400);  
}


void loop() 
{
  timenow=millis();
  if(timenow-time>interval)
  {
    time=timenow;
    if(digitalRead(t1Pin)==0 && digitalRead(negPin)==1)
    {
      mySerial.println("TEAMAU");
    }

    if(digitalRead(t2Pin)==0 && digitalRead(negPin)==1)
    {
      mySerial.println("TEAMBU");
    }

    if(digitalRead(t3Pin)==0 && digitalRead(negPin)==1)
    {
      mySerial.println("TEAMCU");
    }

    if(digitalRead(t1Pin)==0 && digitalRead(negPin)==0)
    {
      mySerial.println("TEAMAD");
    }

    if(digitalRead(t2Pin)==0 && digitalRead(negPin)==0)
    {
      mySerial.println("TEAMBD");
    }

    if(digitalRead(t3Pin)==0 && digitalRead(negPin)==0)
    {
      mySerial.println("TEAMCD");
    }
  }
}

The IN-12A Nixie socket:

I soldiered magnet wire to the socket, and down to the male header strip. I got that idea from someone's nixie clock online, if I can find it, I will credit him.

The shift register breakout board:
The NEW shift register breakout board:

and the underside:

Obviously not populated yet in this pic, but the shift registers go in the center, with the transistors on either side, feeding down to where the nixie's plug in on the bottom. There are 3 total, one for each team, or pair of nixies.

EDIT: 6.21.13:
The power supply needs to provide 170V for the nixie tubes, 5v for the ATMEGA328 and the shift registers, and 3v for the radio. I had it complete a few days ago, and while I was testing it, I accidentally made a connection with my meter that should never be made. I believe I fried the 555 timer. Upon replacing the 555 with another, something was still wrong, and I could not see any other visible defects, and all the metering I did showed that the other components were fine. I could think of no other troubleshooting tactics, so I just re-built all 3 sections. That's when I found out that the second 555 I tried was also bad. A third 555, and we were back up and running. I am not too depressed about building the power section twice, it came out a bit smaller the second time.

The 170v circuit was built from the instructables submission:
http://www.instructables.com/id/Nixie-Tube-HV-Driver/ and supplies sufficient current to power all 6 nixies at the same time.
the 5v circuit is just a LM7805 circuit and the 3v is a LM317, fed from the LM7805.

The remote end:

It will be in a sweatband, but a picture of a sweatband wasn't nearly as cool. The soldier points have epoxy over them to make sure nothing comes apart. I can't get over how small that radio is. Literally the size of a stamp.

The unlit semi-finished face:

The back opened up:

The front powered on, along with the remote end, now in the sweatband, after adding a couple points to the first two teams:

Also, you can download my Friting schematics for the 'mainboard' where the atmega sets, and the shift register breakout here:
Mainboard:
https://www.dropbox.com/s/3hrvqwak2xdkh4u/scorecard%20mainboard.fzz
shift register breakout:

I still plan on finishing the enclosure, but I haven't quite decided on how to do it. I have some nice brass corners to add to it, and i will either stain and varnish it or paint it all black.

Side note- the suction cups work great, the whole unit rested just fine over night at my house, and the vibration at the court is minimal, due to the bracing and thickness of the glass. First test run of that is tonight.

While it is unlikely that I will change any of the scorecard code, I welcome all suggestions as of use for learning more, code or otherwise, and I haven't started on the clock function at all.
I will take more pictures and add them to this post as I move forward.
Thanks for taking the time to look, and for any comments!

Post clear, crisp pictures of the prototype, and a schematic.

Click Reply below, than Additional Options and attach things that way.
.ino files, .jpgs, etc
Resize pic's before posting so they're 800-1000 pixies wide, and not some humongous 3500x2000 12 megapixel monster or something.

For those of you interested, the display end code is found below:

https://www.dropbox.com/s/o6nbryif02nduav/Racquetball_Scorecard_HE_V0_5__2400_.ino

Just added some updates, the semi-finished unit is up in the first post.

How does the remote work?
Is that a Tiny85? What RF module?

int2str:
How does the remote work?
Is that a Tiny85? What RF module?

There is a Ciseco SRF radio module on both ends,
http://shop.ciseco.co.uk/srf-wireless-rf-radio-surface-mount/
and at the remote end, it is attached to a ATTiny85 and 4 buttons.
The ciseco units communicates over serial, so it's not too difficult to get a good communication going, essentially they just burst the team (a,b or c) and up or down 3 times or so every time the button is pressed. The head end listens for an incoming serial line from the ciseco radio, and once it has one, it decodes it, makes the appropriate display adjustment, and delays for 200ms or so. I may adjust that up a little bit, it can change kind of fast if you hold the button down too long.

this is incredible!

hxtasy:
this is incredible!

Thanks. Hijacking your post to bump the thread and show the latest update