今回はESP32でIV-27Mを制御して、数字を表示してみたいと思います。これを試しに全点灯させた前回の実験記事はこちらです。
ピン配置を調べる
全点灯している状態から、ピンを1つ1つ抜いて、どこのピンがどこのセグメントやグリットにつながっているのかを調べました。
右側のピンアサイン
右側は11ピンです。
- NC
- NC
- グリッド1
- ヒーター
- ヒーター
- グリッド2
- グリッド6
- グリッド7
- グリッド5
- グリッド3
- グリッド4
となっていました。グリッド1は一番右の桁で、数字が大きくなるほど左の桁になります。
左側のピンアサイン
左側のピンは15ピンあります。
- グリッド8
- グリッド9
- グリッド10
- グリッド11
- グリッド12
- セグメントa
- セグメントf
- セグメントb
- セグメントg
- セグメントe
- セグメントc
- セグメントd
- セグメントdp(ドット)
- グリッド14
- グリッド13
となっていました。
VFD用のドライバIC
HV5812
とっても便利な、ドライバICを見つけました。Microchip社のHV5812です。20チャンネル80VまでドライブできるドライバICです。シフトレジスタを内蔵しているので、SPIで制御できます。
今では珍しいPLCCパッケージです。これを使ってIV-27Mをドライブしたいと思います。
ただし、5Vで動作するICなので、3.3Vで動作するESP32から直接SPIをつないで制御することができません。3.3Vから5Vへのレベル変換ICを経由して制御することにします。
回路
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 追加 つづきはこちら
追加終わり
コメント