Introduction: 07-14 GM Truck Vacuum Fluorescent Display

In this project, we are going to use the PRND321 VFD off of a 2007 to 2014 GM truck to make a business cardholder.
Tools and Software needed.

  • Kicad for board layout
  • Arduino IDE for programming
  • Adjustable soldering iron
  • Hot air station (optional)
  • 3D Printer (optional, can do this part for you)

Supplies

See BOM on GITHUB for a full list.

Step 1: Layout in Kicad

If using the board I designed you can skip this step. The Footprint and symbol for the VFD can be found at the Github link at the end of the project so you don't have to make these yourself.

If you are making your own layout but want to use the same the 3d printed housing board size is 85.35mm by 74.35 (actual produced size and not in cad size). The screw holes at the top are 3mm down for the top and 4mm from their side and the bottom screw is 4mm from the bottom and 4mm from the left

If using the same LDO be aware that it will run pretty warm due to the load. I recommend doing a cooper pour of the 5v plane for a few MM out on both sides of the board and using a number of VIAs to attach them. This is just to pipe the heat and use the board to help dissipate some of the heat.

Follow the youtube channel Fixed Until Broken to see how I designed this.

Step 2: Get Your Board Produced

If you are using the board files I produced just upload them to your board house. I recommend JLCPCB as they sponsored this project.

If you made your own layout in kicad you need to generate your fabrication outputs. Once you make that you can zip them and upload them to your board house.
PCBs from $0(Free Setup, Free Stencil): https://jlcpcb.com/IYB

Step 3: Assembly & Programming

For assembling the board I recommend solder paste and hot air but the smallest package is 0603 so hand soldering is possible. The crystal oscillator will be the hardest one to do without the hot air station. Be sure to clean any flux off once done.

Now we have it assembled but it doesn't do anything because we need to program it.

Here is the code I used

#define VFD_S        8
#define VFD_C        7
#define VFD_D        6
#define buttonPin    4
int modenum = 1;
bool keeprunning;


void setup() {
  pinMode(3, OUTPUT);// pwm pin
  pinMode(VFD_S, OUTPUT);
  pinMode(VFD_C, OUTPUT);
  pinMode(VFD_D, OUTPUT);
  TCCR2A = _BV(COM2B1) | _BV(WGM20) ; //pwm stuff
  TCCR2B = _BV(WGM22) | _BV(CS20) | _BV(CS21) | _BV(CS22);  //pwm stuff
  OCR2A = 39;  //Sets freq 200Hz
  OCR2B = 19; //50% duty cycle
  digitalWrite(VFD_S, HIGH);
  pinMode(buttonPin, INPUT);
  keeprunning = true;
}

void screen(int first, int second){
if (keeprunning == true){
for (int i = 0; i <= 7; i++) {
   digitalWrite(VFD_D, bitRead(second, i));
   digitalWrite(VFD_C, HIGH);
   digitalWrite(VFD_C, LOW);
  }
for (int i = 0; i <= 7; i++) {
   digitalWrite(VFD_D, bitRead(first, i));
   digitalWrite(VFD_C, HIGH);
   digitalWrite(VFD_C, LOW);
  }
 for (int i = 0; i <= 11; i++) {
   digitalWrite(VFD_C, HIGH);
   digitalWrite(VFD_C, LOW);
  }
digitalWrite(VFD_C, HIGH); 
delay(500);
}
}

void poll() {
  if (digitalRead(buttonPin) == HIGH){
      keeprunning = false;
   if( modenum<=3){
  ++modenum;
  }
     if( modenum >=4){
  modenum = 1;
  }
 delay(800);
  }
}

void loop() {
while (modenum == 1){
  keeprunning = true;
  screen(0b11111111,0b00000000);
  poll();
  screen(0b11111110,0b10000000);
  poll();
  screen(0b11111110,0b01000000);
  poll(); 
  screen(0b11111110,0b00100000);
  poll();
  screen(0b11111110,0b00010000);
  poll();
  screen(0b11111110,0b00001000);
  poll();
  screen(0b11111110,0b00000100);
  poll();
}
while (modenum == 2){
  keeprunning = true;
  screen(0b10000001,0b00000000);
  poll();
  screen(0b01000000,0b10000000);
  poll();
  screen(0b00100000,0b01000000);
  poll();
  screen(0b00010000,0b00100000);
  poll();
  screen(0b00001000,0b00010000);
  poll();
  screen(0b00000100,0b00001000);
  poll();
  screen(0b00000010,0b00000100);
  poll();
}
while (modenum == 3){
  keeprunning = true;  
  screen(0b00000011,0b00000000);
  poll();
  screen(0b00000100,0b10000000);
  poll();
  screen(0b00001000,0b01000000);
  poll();
  screen(0b00010000,0b00100000);
  poll();
  screen(0b00100000,0b00010000);
  poll();
  screen(0b01000000,0b00001000);
  poll();
  screen(0b10000000,0b00000100);
  poll();
}   
}

Step 4: Flash the Atmega328

Now for the final step, flash the microcontroller. For this, you can either use a SOIC8 clip on the SOICbite pad or solder wires to it.
Pin 1 is 5v

Pin 2 and 3 are NC

Pin 4 is ground

Pin 5 is MOSI

Pin 6 is MISO

Pin 7 is clock

Pin 8 is RST


Use an Arduino as ISP, burn the bootloader, and then upload code using programmer.

Step 5: Enjoy

Now that it's programmed and working screw the PCB into the housing using m2 8mm screws. Power with 12v center positive wall wart.

Link to Gitub: https://github.com/garnerm91/VFD