- Nixie tubes required 170V DC power supply so we need Nixie Power Supply Module - any high voltage 170V converter will be fine.
- We need a driver that is suitable for high voltages - e.g. Nixie Tube Driver V2
- Any Arduino board - in this example it will be Arduino Nano
- 22 outputs for connecting the nixie tube cathodes (K1-K22)
- 300V off-state maximum output voltage
- Compatible with all 5V / 3.3V designs
- Easy to use - only 3 control lines
- The drivers can be connected in series
More about Nixie Tube Driver V2 can be found on the project website.
There is only 3 control lines DIN, CLK, EN.22 outputs allow you to connect two nixie tubes with dots
At the beginning we have to declare how we connected the individual nixie tubes cathodes:
// Bit array for 2 nixie tubes, dot1, dot2, 2 bits for gaps
boolean nixieDisplayArray[24];
// Cathodes assignment to the position in the 24 bit array
// Each cathode of nixie tubes is connected to the corresponding driver output
// Bit numbers
byte nixie1[]={
// 0 1 2 3 4 5 6 7 8 9
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte nixie2[]={
// 0 1 2 3 4 5 6 7 8 9
10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
byte dot1 = 20; // K21 nixie driver output
byte dot2 = 21; // K22
nixieDisplayArray[24]; Why 24 bits if the driver has 22 outputs? If you take a closer look at the internal schematic of the nixie driver then you will notice that one of the shift registers has two outputs not connected. If we want to use several drivers connected in series, we must fill this gap for the correct transfer of data to subsequent drivers (registers).
Shift registers control program. You can also use any library to control shift registers, but for better understanding the program contains all the required steps to control registers without using the library.
void ShiftOutData()
{
// Ground EN pin and hold low for as long as you are transmitting
digitalWrite(EN_PIN, 0);
// Clear everything out just in case to
// prepare shift register for bit shifting
digitalWrite(DIN_PIN, 0);
digitalWrite(CLK_PIN, 0);
// Send data to the nixie drivers
for (int i = 23; i >= 0; i--)
{
// Set high only the bit that corresponds to the current nixie digit
digitalWrite(DIN_PIN, nixieDisplayArray[i]);
// Register shifts bits on upstroke of CLK pin
digitalWrite(CLK_PIN, 1);
// Set low the data pin after shift to prevent bleed through
digitalWrite(CLK_PIN, 0);
}
// Return the EN pin high to signal chip that it
// no longer needs to listen for data
digitalWrite(EN_PIN, 1);
// Stop shifting
digitalWrite(CLK_PIN, 0);
}
Core of the control code:
void NixieDisplay(byte digit1, byte digit2)
{
// Convert the desired numbers to the bit numbers for the nixieDisplayArray[]
digit1 = nixie1[digit1];
digit2 = nixie2[digit2];
// Clear bit array except dot1 and dot2 bits
for (int i = 23; i >= 0; i--)
{
if(i != dot1 || i != dot2) nixieDisplayArray[i] = 0;
}
// Set the bits corresponding to the nixie tubes cathodes
nixieDisplayArray[digit1] = 1;
nixieDisplayArray[digit2] = 1;
ShiftOutData();
}
nixieDisplayArray[] - this is a bit array storing the current state of all nixie controller outputs. Storing the current state of the outputs is needed if you want to control tubes and dot points independently.
// SetDot (dotNumber = 1/2, dotState = 0/1)
void SetDot(byte dotNumber, boolean dotState)
{
if(dotNumber == 1)
{
if(dotState == HIGH) nixieDisplayArray[dot1] = 1;
else nixieDisplayArray[dot1] = 0;
}
if(dotNumber == 2)
{
if(dotState == HIGH) nixieDisplayArray[dot2] = 1;
else nixieDisplayArray[dot2] = 0;
}
ShiftOutData();
}
HOW TO DISPLAY "2.0"Now the last step is the easiest part:
void loop ()
{
// NixieDisplay(digit1, digit2);
NixieDisplay(2, 0);
// SetDot (dotNumber = 1/2, dotState = 0/1)
SetDot(1, HIGH);
delay(1000);
}
More about Nixie Tube Driver V2 can be found on the project website.
Comments