Introduction: Simple User-adjustable DIY Nixie Clock

About: I'm an Italian freelance structural engineer, graphic designer and photographer, now I'm teaching physics in Waldorf high-schools. I always investigate electronics, robotics and science in general, I'm a passi…

As first instructable of the year I managed to finally complete my age-long nixie clock project.
Nixies are neon valve tubes, where ten cathodes have shape of digits and are lighted up by plasma when high voltage flows through them. I love these old era displays, which have been employed in last century before I was born.
In last year I've been slowly collecting components and knowledge to build some nixie clocks as Max Pierson's beautiful creation, I like the old style, the roundness of glass tubes, the rough wood case, the simplicity of the design. That clock has definitely inspired my project. Even though I really love vertical digits arrangement I keep that original feature for my next clock.

Therefore this first born is a six digits horizontal wood desk clock, with six big round Russian IN-4 nixie tubes, no dots, no visible buttons, no LED illumination, only a big massive rosewood block and the power of plasma ;-)
I have to explain you what the title means:

simple because it can be entirely built with common tools and from common components, you only have to order six IN-4 nixies and one nixie driver

user-adjustable because it's predisposed for many external sensors and additional features (as neon dots between digits, alarm, etc.)

DIY since you neither have to buy external shields or to pay for pcb manufacturing, just follow my instructable ;-)


WARNING: this circuit raises the voltage to deadly 300V so you must avoid to touch contacts while working, I'm not kidding, please BE CAREFUL!

Step 1: The Schematic and Working Principle

Lately, after some research and a fast designing, I attained this functional high voltage power source circuit. Since there is a full step to step guide about the hv power source section of my clock, I will pass over that explanation. There is only something to say about the input voltage for the clock: to increase the universality of the project I decided to give the possibility to power the clock with a voltage from 9 to 35V. The best solution (in terms of efficiency and thermal dissipation) is to connect a 9V DC PSU (500 mA or more), but if you want to power the device with a voltage from 12 to 35V you only have to shift the voltage switch in direction of the ON-OFF switch (which has a center ON position between two OFF ones).
With the pot you have to set the voltage (read next step for high voltage pins) to the about 190V needed to power the IN-4 nixies (in multiplexing displays is better to use a bit more than the 180V needed to light a single nixie tube). You can of course set up the proper voltage for any other nixie tube.
 

The other section is the logic circuit, where a cheap Atmega8 IC (but you can also use an Atmega168 or Atmega 328), through a nixie driver and some high voltage transistors, controls the digits.
The nixie driver is a K155ID1 which is the Russian equivalent of the 74141N, and it spares you to use 20 more high voltage transistors. This driver is not very expensive, but it's not longer manufactured, so with time it will be more difficult to find, for this reason I wanted to use only one in my project (while there are many nixie clock projects which uses one driver for each digit).
This has been possible thanks to some references I found in the web
(maxwellrosspierson.comelbastl.sweb.cz,
mlknaweb.blogspot.itglowbug.nl,
neon1.net, threeneurons.wordpress.com)
but mainly thanks to Jeremy Howa and Brad Lewis for their Arduinix project, which enlightened me about multiplexing power and from where I took the original code.

My schematic is drawn in Diptrace, a simple pcb design software, I divided it into two pats so to show it better, read notes on the image to understand circuit parts.

Step 2: The Board Design

Diptrace lets you to autoroute the traces, but in my case I had to route them manually since I wanted to keep the board as small as possible.
The clock is composed by two different boards: the bottom part contains all the power source and logic sections, and the top board is to connect the tubes, each one with a proper resistor. Indeed since different tubes could need different resistor values, I decided to leave 10K resistors on the clock board and add a second resistor for each tube on the tube shield, so that you can easily transfer the same main board from a clock to another. To calculate the total value or resistors I referred to Threeneuron's great explanation.

To set the right voltage set the right position of the 9V / 12-35V switch depending on your PSU, then plug the jack and connect your multimeter to a GND pin and to the "+180(TEST)" pin. Calibrating the potentiometer you will see voltage varying from about 140 to 300V, set it to 190V.

Actually the pcb you see here is an new version of my clock board, since I improved the component arrangement and I still have to etch the new board, so maybe you will note some minor differences.
If you look the "top silk" pdf file you'll see that I marked on the board top surface all the info to place components, such as name and polarity, so you should be able to solder them easily with the help of the b.o.m. 
Furthermore in the other documents you find the traces ready to print and to transfer on the copper board, for both clock circuit and tubes shield. Top-silks are mirrored for this purpose.

Step 3: B.o.m.

The bill of material is the longest I've ever needed for one of my electronic projects. I know it's far from to be professional and there should be many imperfections, but I tried to be more exhaustive I could.

You must add to the list: 66 sockets for tube pins, two male pin header strips for tube shield (1X10 and 1X6), the case, the IN-4 tubes and the PSU.
 
Please note that where you read 15K resistors you have to interpret 10K on the main circuit plus 4.7K (or 3.3K) on the shield pcb.
 
I've used a buzzer taken from a Nokia phone since it's great to play multi-tone sounds for alarm, but you can change it with any 5V buzzer, or you can remove it, as some more components (resistors for neon dots, 9V voltage regulator, reset button, etc.).

L1 is a fixed radial inductor (avoid toroidal chokes) 100 uH 1A. On the board you can find space to place a stocky or slender inductor, just ignore the hole you don't need. R17 and R18 should be 1% accuracy metal film resistors, to achieve a better voltage stability. D1 has to be a ultra-fast 400V diode, as BAV21, UF4004, UF4007, MUR140, or MUR160.

Attachments

Step 4: The Code

The code I used in this clock version is taken from the open source material available on Arduinix website, and I really suggest you to go looking Brad Lewis "Sloth Furnace" impressive projects (he's an instructables member too).

I modified the code to use only one nixie driver instead of two, since I don't need to run more than 6 digits, and I prefer to save drivers. There is a parameter which you can change if you have problem with your displays, it's the delay, but 2 ms works fine for me. You can try 3 or 4 ms but more will flicker the digits, since software has to go through all digits before lighting a digit again.

// Arduinix 6 Bulb - Also supports Hour and Min. time set.
// 
// This code runs a six bulb setup and displays a prototype clock setup.
// NOTE: the delay is setup for IN-17 nixie bulbs.
//
// original code by Jeremy Howa
// www.robotpirate.com
// www.arduinix.com
// 2008 - 2009
// code modified by Andrea Biffi www.andreabiffi.com to work with only one SN74141
//
// Last Edit Nov 2013
//

// SN74141 : True Table
//D C B A #
//L,L,L,L 0
//L,L,L,H 1
//L,L,H,L 2
//L,L,H,H 3
//L,H,L,L 4
//L,H,L,H 5
//L,H,H,L 6
//L,H,H,H 7
//H,L,L,L 8
//H,L,L,H 9

#define DEBUG_ON   false

// SN74141
int ledPin_0_a = 2;                
int ledPin_0_b = 3;
int ledPin_0_c = 4;
int ledPin_0_d = 5;
             
// anod pins
int ledPin_a_1 = 8;
int ledPin_a_2 = 9;
int ledPin_a_3 = 10;
int ledPin_a_4 = 11;
int ledPin_a_5 = 12;
int ledPin_a_6 = 13;

void setup() 
{
  pinMode(ledPin_0_a, OUTPUT);      
  pinMode(ledPin_0_b, OUTPUT);      
  pinMode(ledPin_0_c, OUTPUT);      
  pinMode(ledPin_0_d, OUTPUT);    
  
  pinMode(ledPin_a_1, OUTPUT);      
  pinMode(ledPin_a_2, OUTPUT);      
  pinMode(ledPin_a_3, OUTPUT); 
  pinMode(ledPin_a_4, OUTPUT);    
  pinMode(ledPin_a_5, OUTPUT);      
  pinMode(ledPin_a_6, OUTPUT);  
 
  // NOTE:
  // Grounding on pins analog0 and analog input 1 will set the Hour and Mins.
  pinMode(A0, INPUT ); // set the virtual pin analog0 (pin 0 on the analog inputs ) 
  digitalWrite(A0, HIGH); // set pin analog input 0 as a pull up resistor.

  pinMode(A1, INPUT ); // set the virtual pin analog input 1 (pin 1 on the analog inputs ) 
  digitalWrite(A1, HIGH); // set pin analog input 1 as a pull up resistor.
  
  if( DEBUG_ON )
  {
    Serial.begin(9600);
  }
}

////////////////////////////////////////////////////////////////////////
//
// DisplayNumberSet
// Use: Passing anod number, and number for bulb, this function
//      looks up the truth table and opens the correct outs from the arduino
//      to light the numbers given to this funciton.
//      On a 6 nixie bulb setup.
//
////////////////////////////////////////////////////////////////////////
void DisplayNumberSet( int anod, int num1)
{
  int anodPin;
  int a,b,c,d;
  
  // set defaults.
  a=0;b=0;c=0;d=0; // will display a zero.
  anodPin =  ledPin_a_1;     // default on first anod.
  
  // Select what anod to fire.
  switch( anod )
  {
    case 0:    anodPin =  ledPin_a_1;    break;
    case 1:    anodPin =  ledPin_a_2;    break;
    case 2:    anodPin =  ledPin_a_3;    break;
    case 3:    anodPin =  ledPin_a_4;    break;
    case 4:    anodPin =  ledPin_a_5;    break;
    case 5:    anodPin =  ledPin_a_6;    break;
  }  
  
  // Load the a,b,c,d to send to the SN74141 IC (1)
  switch( num1 )
  {
    case 0: a=0;b=0;c=0;d=0;break;
    case 1: a=1;b=0;c=0;d=0;break;
    case 2: a=0;b=1;c=0;d=0;break;
    case 3: a=1;b=1;c=0;d=0;break;
    case 4: a=0;b=0;c=1;d=0;break;
    case 5: a=1;b=0;c=1;d=0;break;
    case 6: a=0;b=1;c=1;d=0;break;
    case 7: a=1;b=1;c=1;d=0;break;
    case 8: a=0;b=0;c=0;d=1;break;
    case 9: a=1;b=0;c=0;d=1;break;
  }  
  
  // Write to output pins.
  digitalWrite(ledPin_0_d, d);
  digitalWrite(ledPin_0_c, c);
  digitalWrite(ledPin_0_b, b);
  digitalWrite(ledPin_0_a, a);

  // Turn on this anod.
  digitalWrite(anodPin, HIGH);   

  // Delay
  // NOTE: With the difference in Nixie bulbs you may have to change
  //       this delay to set the update speed of the bulbs. If you 
  //       dont wait long enough the bulb will be dim or not light at all
  //       you want to set this delay just right so that you have 
  //       nice bright output yet quick enough so that you can multiplex with
  //       more bulbs (2ms is standard).
  delay(2);
  
  // Shut off this anod.
  digitalWrite(anodPin, LOW);
}

////////////////////////////////////////////////////////////////////////
//
// DisplayNumberString
// Use: passing an array that is 6 elements long will display numbers
//      on a 6 nixie bulb setup.
//
////////////////////////////////////////////////////////////////////////
void DisplayNumberString( int* array )
{
  // bank 1 (bulb 1)
  DisplayNumberSet(0,array[0]);   
  // bank 2 (bulb 2)
  DisplayNumberSet(1,array[1]);   
  // bank 3 (bulb 3)
  DisplayNumberSet(2,array[2]);   
  // bank 4 (bulb 4)
  DisplayNumberSet(3,array[3]);   
  // bank 5 (bulb 5)
  DisplayNumberSet(4,array[4]);   
  // bank 6 (bulb 6)
  DisplayNumberSet(5,array[5]);   
}

// Defines
long MINS = 60;         // 60 Seconds in a Min.
long HOURS = 60 * MINS; // 60 Mins in an hour.
long DAYS = 24 * HOURS; // 24 Hours in a day. > Note: change the 24 to a 12 for non millitary time.

long runTime = 0;       // Time from when we started.

// default time sets. clock will start at 12:59:00
// NOTE: We start seconds at 0 so we dont need a clock set
//       The values you see here would be what you change 
//       if you added a set clock inputs to the board.
long clockHourSet = 12;
long clockMinSet  = 59;

int HourButtonPressed = false;
int MinButtonPressed = false;

////////////////////////////////////////////////////////////////////////
//
//
////////////////////////////////////////////////////////////////////////
void loop()     
{
  // Get milliseconds.
  runTime = millis();

  // Get time in seconds.
  long time = (runTime) / 1000; ///change this value to speed up or slow down the clock, set to smaller number such as 10, 1, or 100 for debugging
  
  int hourInput = digitalRead(14);  
  int minInput  = digitalRead(15);
  
  if( DEBUG_ON )
    Serial.println( hourInput );       
  
  if( hourInput == 0 )
    HourButtonPressed = true;
  if( minInput == 0 )
    MinButtonPressed = true;
  
  if( HourButtonPressed == true && hourInput == 1 )
  {
    clockHourSet++;
    HourButtonPressed = false;
  }
  
  if( MinButtonPressed == true && minInput == 1 )
  {
    clockMinSet++;
    MinButtonPressed = false;
  }
  
  // Set time based on offset..
  long hbump = 60*60*clockHourSet;
  long mbump = 60*clockMinSet;
  time += mbump + hbump;

  // Convert time to days,hours,mins,seconds
  long days  = time / DAYS;    time -= days  * DAYS; 
  long hours = time / HOURS;   time -= hours * HOURS; 
  long minutes  = time / MINS;    time -= minutes  * MINS; 
  long seconds  = time; 

  // Get the high and low order values for hours,min,seconds. 
  int lowerHours = hours % 10;
  int upperHours = hours - lowerHours;
  int lowerMins = minutes % 10;
  int upperMins = minutes - lowerMins;
  int lowerSeconds = seconds % 10;
  int upperSeconds = seconds - lowerSeconds;
  if( upperSeconds >= 10 )   upperSeconds = upperSeconds / 10;
  if( upperMins >= 10 )      upperMins = upperMins / 10;
  if( upperHours >= 10 )     upperHours = upperHours / 10;

  // Fill in the Number array used to display on the tubes.
  int NumberArray[6]={0,0,0,0,0,0};
  NumberArray[0] = upperHours;
  NumberArray[1] = lowerHours;
  NumberArray[2] = upperMins;
  NumberArray[3] = lowerMins;
  NumberArray[4] = upperSeconds;
  NumberArray[5] = lowerSeconds;

  // Display.
  DisplayNumberString( NumberArray );
}



To burn the code to the Atmega IC I used Arduino. Just remove the Arduino chip, insert your Atmega8 (or better), change board and serial port under "tools" menu, paste my code and upload it. Take out the IC and insert in the socket on the clock board. Please notice that your Atmega IC could need to be burn with bootloader before you upload the code, you can find instruction on this page. I used a USBtinyISP programmer, but you can buy IC already burned with the bootloader.

Step 5: Toner Transfer

Ok guys, you're certainly happy that theory section is ended and we can now see something concrete.
As I usually do I've etched two boards at the same time, so to reduce the chance to make a faulty pcb.

First thing to do is to polish the copper surface with a sponge (the one for dished on the scratching surface) and then clean it with a strong soap. After that step absolutely avoid to touch the surface or to dry it with a dirty towel, toner has to find a perfectly degreased surface to adhere at 100%.

Now join printed paper and copper board and keep them together with paper tape pieces, put them with paper up under a clean towel, set your iron at maximum temperature and pass over the paper to make the toner adhere on the copper surface. Now pour into water, wait some minutes and when paper is all wet remove it with the help of a soft brush (maybe a toothbrush).

This is a pretty damn process and the success mostly depends by the type of paper, in this case I've tried a cheap inkjet photographic paper. I definitely need to switch to photoresist method.

Step 6: Etching

When you're absolutely sure there is no remain of paper between tracks, and after retouching every interrupted track with permanent marker, you can pour the board into ferric chloride solution for about 40-50 minutes (it depends by many factors as the percentage of solution, the temperature, how much often you agitate the basin, etc.). You see in the picture that I always use the pcb holder I built. I suggest to shake gently the container every 10 minutes and check the traces every 5 minutes when 30 minutes or more has passed. When you see there is no more copper on areal clean from toner you can wipe the board with a paper towel and wash it in abundant water. Dispose of the exhaust acid in proper centre.

Step 7: Finishing the Main Pcb

To remove the toner from the copper traces use a metal sponge or sand paper. If you're not sure about the electrical conductivity of some traces you have to check them with the multimeter and fix any mistake soldering a bit of tin.
Then make holes where needed using 0.8 mm drill bit and a precise column drill (if you want to build one look here).

Step 8: Etching the Tubes Shield

To build the tubes shield the process is the same as the main circuit. Also in this case I made two boards at the same time. Both came out well, except near the edges where I had to fix some toner lack with the permanent marker.
As before, remove toner after etching and drill holes for components.

Step 9: Top Silk

If you wish you can transfer the top silk on the board with the toner transfer method. This helps you placing the components and also adds useful information to connect external sensors and to act on the switches.
Then you can begin to solder the main components on the board. 

Step 10: Solder

Solder also the pins sockets on the tubes shield, together with resistors and jumpers. To solder the connection pins headers between main circuit and shield follow the suggestions in the next step.

Step 11: Pin Rows

Since the pin male headers are on the same side of the copper, the process to solder them in place is a bit more complexed compared to all the components on the opposite side.
I suggest you to push the pin heads hard into the holes (0.8 mm is the better size in my opinion) and solder them on the pads. As in first picture you have now the rows upside down. Remove the plastic holder with little pliers, flip it and insert again with the groove toward the copper, then with your nails or the pliers push the plastic against the tin, that will cover pads and any soldering sign.

Step 12: Find the Right Case

I've been lucky and I found a case almost perfect to fit my circuit. Obviously it's much better to design the pcb referring to the exact measures of an existing case, so go looking for it at once ;-)
The same instant I've seen this box I loved it. I bought it a the Christmas Fair in my city and it was last piece, made in India from a single rosewood block. I chose the rougher side to become the front of the clock, since I like the irregular edge on the front top edge.

Step 13: Drill Holes

I had to drill the 3 cm diameter holes for the six digits, with the right drill bit and a medium column drill the process was long but not difficult. Try to not warm too much the bit.
You can mark the center of the holes with a ruler or to attanch a print of the circuit top side on the wood, then mark the dots with an awl.

Step 14: Perfect the Case

To drill the holes avoiding wood cracks formation, push a wood block on the inside surface of the board, and try keeping it pressed with shims or clamps, then drill the holes until you reach it. Also try to leave at least a pair of millimeters of space between holes. My first shield was too short, and I had to make a little longer shield to match the holes.

Step 15: Fix the Lacks

Since new shield was longer than the inside space I had to enlarge it on a corner. To do that I drilled some thin holes and I removed the wood pieces with the aid of a chisel. As you see now holes and pin sockets are perfectly aligned.

Step 16: Straighten the Sockets

to straighten the pin sockets so to simplify the insertion of the tubes, I suggest to insert all the tubes one time and remove them. That will help you a lot, since you can handy straighten up them with small pliers.

Step 17: Test the Circuit

This will have also a second advantage, i.e. testing the circuit before assembling the clock.
... suspence...
If everything works you can continue with the assembling.

Step 18: Assembling Nixies

Place the shield inside the case and insert back the tubes into it. Pay attention to not let any pin going out from his socket, you can look from the inside to check them.
You see that you can connect the main circuit to the tube shield with no trouble. This is very useful since you are now able to build a new clock and test it with the original clock circuit.

Step 19: Find Cool Case Stands

I had four rubber tips, to arrange four nice old style stands I decided to use them upside down glued to screws' heads.
With some gimlets drill the four holes, paying attention to not crack the wood. To be sure begin with a small gimlet and then pass to a bigger one, until you reach the desired hole diameter.

Step 20: Adjust Them

These stands are very handy because you can screw them until they're perfectly aligned with a planar surface, and the wood box will have a very precise support, although it's very rough.
Glue the rubber tips with cyanoacrylate glue in the exact centre of the screw heads. Now you'll note that there is enough space to keep the power plug inserted under the clock and let the wire coming out from the rear.

Step 21: Build a Bottom

We need to add a cover to the bottom of the clock to prevent children touching the circuit, since it's very dangerous and could be lethal. To cut it from a thin wood board I marked the edges of the hole with a paper sheet and a pencil, then with a screwdriver I transferred the shape onto the wood surface. Then I cut the perimeter with a jig saw.
I also drilled holes for on-off switch, power plug, and time buttons. At the end I polished the cover with dark wax to give it a better color. Now the led is no more visible, but since the cover is snap-fit I can remove it or add another hole under the light.

Step 22: Extend Buttons

I know that some push-buttons have a long cylinder, to protrude out of the case. I also have many of them, and they are a good choice. Anyway in this case I forgot to solder that button type, so instead of desoldering and changing them with two long ones, I added a different style of extension.
I found some plastic supports for shelves with a brown cylindrical part, so I cut it and glued to the buttons. I also had to glue a washer so that some space remained between bottom cover and buttons body.

Step 23: Connect the Clock

Assembling is finally completed, you can connect your clock and admire your work!
There is enough space behind the pcb inside the case to keep a 9V power source, maybe 6 AA alkaline batteries or a Li-ion rechargeable battery-pack. I have to design a circuit to charge it via the power plug. I will add to the improvements list ;-)

Step 24: Place It

The top viewed nixie displays as these beautiful IN-4 have usually a narrow angle of view. It means that if you place your clock on a low table or cupboard you'll hardly see the digits. I suggest to keep it on a shelf or near the TV so you can see it when seated.
You can also decide to insert tubes deeper in the case, so that only the half sphere glass surface protrudes, but consider that one of the best features of a nixie display is that digits lie on different planes, and you can see them much better from the side of a tube.

Step 25: Improvements List

This is not the end of the project, since there are some features to add to this new clock, maybe you can suggest more improvements:

  1. add a RTC (Real Time Clock) module so that the clock keeps the time also when PSU is disconnected
  2. add a cathode poisoning prevention routine to extend tubes life
  3. add a sensor to only turn the clock when you are near (sound sensor, ultrasonic proximity sensor...) and save tubes life
  4. add an alarm function using the multi-tone speaker
  5. substitute the push-button with a rotary encoder, to simplify surfing among the new functions
  6. remove in some way the wood knurl that seems a push-button on the lower left of the case ;-)
  7. add an internal 9V battery to keep the clock running wit no power-cord done, looking the pdf files you will see two pads marked to that purpose!
  8. add a bottom to protect the circuit and maybe cover the led light, or bend the led if light is annoying done!
  9. test the new crossfade code from Arduinix done!
  10. polish with dark wax the inside surface of the holes.
  11. as well explained on Threeneuron's page, multiplexing needs blanking intervals to avoid ghosting, and when I'll go deepen in the code I'll examine this function
  12. in my next version the third position of the ON/OFF switch will set the sleep function, so to turn off the displays leaving the controller working done, attached pdf files are updated!
I hope you liked my bigger electronic project so far, stay tuned for more features and clock models! And tell me if I forgot some detail.