This time I would like to control the IV-27M with ESP32 and display the numbers. Here is the previous experimental article where I tried this out and turned on all the lights.
Examining the pin assignments
With all the lights on, I pulled out the pins one by one to find out which pin was connected to which segment or grit.
Pin assignment of the right side
The right side has 11 pins.
- NC
- NC
- Grid 1
- Heater
- Heater
- Grid2
- Grid6
- Grid7
- Grid5
- Grid3
- Grid4
The pins were as shown above. Grid 1 is the rightmost digit, and the larger the number, the further left it is.
Pin assignment of the left side
There are 15 pins on the left side.
- Grid8
- Grid9
- Grid10
- Grid11
- Grid12
- Segment a
- Segment f
- Segment b
- Segment g
- Segment e
- Segment c
- Segment d
- Segment dp(dot)
- Grid14
- Grid13
Driver IC for VFD
HV5812
I found a very useful driver IC, Microchip's HV5812, which can drive up to 80V on 20 channels. It has a built-in shift register and can be controlled via SPI.
It comes in a PLCC package, which is rare nowadays. I would like to use it to drive the IV-27M.
However, since this is a 5V driver IC, it cannot be directly controlled via SPI from an ESP32 running at 3.3V, so I will use a 3.3V to 5V level conversion IC.
Circuit
The SPI signal from the ESP32 is converted to a 5V signal using a level shifter, and then input to the HV5812, and the output of the HV5812 is connected to each grid and segment of the IV-27M.
The 24V power supply of the IV-27M is obtained from the 5V output of the ESP32 using a boost-type DCDC converter.
Program
#include #define SPI_FREQ 2000000 #define STROBE_PIN 5 long long data = 0x0000000000000000; const int GRID[14] = { 0 , 1, 5, 6, 4, 2, 4, 20, 21, 22, 23, 24, 34, 33}; // a b c d e f g dp const int SEG[8] = { 25, 27, 30, 31, 29, 26, 28, 32}; const int SEG_NUM = 8; // a b c d e f g const bool CHAR[18][7] = { {1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 0, 0, 0, 0}, {1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 1, 0, 1, 1}, {1, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1}, {1, 1, 1, 0, 1, 1, 1}, {0, 0, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 1}, {1, 0, 0, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1} }; void setup() { Serial.begin(115200); delay(100); Serial.println("start"); SPI.begin(); SPI.setFrequency(SPI_FREQ); SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); pinMode( STROBE_PIN, OUTPUT ); digitalWrite( STROBE_PIN, LOW ); } void loop() { gridON( 0 ); for ( int i = 0 ; i < 10 ; i++) { char str[2]; sprintf( str , "%01d" , i ); setChar( str[0] ); show(); delay(1000); } } bool gridON( int gridNum ) { data |= (long long)1 << GRID[gridNum]; } bool gridOFF( int gridNum ) { data &= ~((long long)1 << GRID[gridNum]); } //set charactor pattern void setChar( char charctor ) { int id = 0; switch ( charctor ) { case '0': id = 0; break; case '1': id = 1; break; case '2': id = 2; break; case '3': id = 3; break; case '4': id = 4; break; case '5': id = 5; break; case '6': id = 6; break; case '7': id = 7; break; case '8': id = 8; break; case '9': id = 9; break; case 'A': id = 10; break; case 'B': id = 11; break; case 'C': id = 12; break; case 'D': id = 13; break; case 'E': id = 14; break; case 'F': id = 15; break; case ' ': id = 16; break; case '-': id = 17; break; default: id = 16; break; } Serial.printf("%c %d\n",charctor , id); for ( int i = 0 ; i < 7 ; i++ ) { if ( CHAR[id][i] == 1 ) { data |= (long long)1 << SEG[i]; } else { data &= ~((long long)1 << SEG[i]); } } } bool show() { uint8_t transfarData[5]; transfarData[0] = ( data & 0x000000FF00000000 ) >> 32; transfarData[1] = ( data & 0x00000000FF000000 ) >> 24; transfarData[2] = ( data & 0x0000000000FF0000 ) >> 16; transfarData[3] = ( data & 0x000000000000FF00 ) >> 8; transfarData[4] = ( data & 0x00000000000000FF ); Serial.printf("data:%x %x %x %x %x\n", transfarData[0], transfarData[1], transfarData[2], transfarData[3], transfarData[4]); SPI.writeBytes(transfarData, sizeof(transfarData)); digitalWrite( STROBE_PIN, HIGH ); delay(1); digitalWrite( STROBE_PIN, LOW ); }
This is a modified version of the program from the previous VFD experiment.
The data variable is the variable that holds the content you want to display, and you set ON and OFF for each grid and segment in it. After that, the contents of the data variable are sent to the HV5812 using SPI.
Numbers are now displayed
Only one digit is displayed!
Since only one digit is displayed, it is quite bright. I'm going to modify the program so that it lights up all digits dynamically.