スポンサーリンク

透明で美しいVFD表示管IV-27Mで1桁の数字を表示してみました

スポンサーリンク

今回はESP32でIV-27Mを制御して、数字を表示してみたいと思います。これを試しに全点灯させた前回の実験記事はこちらです。

スポンサーリンク

ピン配置を調べる

全点灯している状態から、ピンを1つ1つ抜いて、どこのピンがどこのセグメントやグリットにつながっているのかを調べました。

右側のピンアサイン

右側は11ピンです。

  1. NC
  2. NC
  3. グリッド1
  4. ヒーター
  5. ヒーター
  6. グリッド2
  7. グリッド6
  8. グリッド7
  9. グリッド5
  10. グリッド3
  11. グリッド4

となっていました。グリッド1は一番右の桁で、数字が大きくなるほど左の桁になります。

左側のピンアサイン

左側のピンは15ピンあります。

  1. グリッド8
  2. グリッド9
  3. グリッド10
  4. グリッド11
  5. グリッド12
  6. セグメントa
  7. セグメントf
  8. セグメントb
  9. セグメントg
  10. セグメントe
  11. セグメントc
  12. セグメントd
  13. セグメントdp(ドット)
  14. グリッド14
  15. グリッド13

となっていました。

スポンサーリンク

VFD用のドライバIC

HV5812

HV5812DataSheet

とっても便利な、ドライバICを見つけました。Microchip社のHV5812です。20チャンネル80VまでドライブできるドライバICです。シフトレジスタを内蔵しているので、SPIで制御できます。

今では珍しいPLCCパッケージです。これを使ってIV-27Mをドライブしたいと思います。

ただし、5Vで動作するICなので、3.3Vで動作するESP32から直接SPIをつないで制御することができません。3.3Vから5Vへのレベル変換ICを経由して制御することにします。

スポンサーリンク

回路

IV27M回路図

ESP32のSPIの信号をレベルシフターで5Vの信号に変換後、HV5812に入力しています。HV5812の出力をIV-27Mの各グリットとセグメントへ接続しています。

IV-27Mの24Vの電源は、昇圧型のDCDCコンバータを使い、ESP32の5V出力から変換して得ています。

スポンサーリンク

プログラム

#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 );
}

以前のVFDの実験のプログラムを改造しました。

data変数が、表示させたい内容を保持する変数で、これに各グリッドとセグメントのON,OFFを設定します。その後、data変数の内容を、SPIを使ってHV5812へ送信します。

スポンサーリンク

数字が表示できた

1桁だけですが、数字が表示されました!

一桁しか表示していないので、結構明るいです。これを全桁ダイナミック点灯するようにプログラムを改造していこうと思います。

2021.5.14 追加 つづきはこちら

追加終わり