ESP32でK155ID1を制御して2桁のニキシー管IN-12Bをダイナミック点灯させるまで

ニキシー管用の基板と制御用のICのK155ID1が揃ったので、ESP32を使ってニキシー管を制御したいと思います。

基板にソケットを半田付け

IN-12Bの2桁用の基板をJLCPCBで作りました。テストなので直接ニキシー管を半田付けするのではなく、ソケットを使いたいと思います。

ソケットはこちらをAliexpressで購入しました。

AliExpress.com Product – 1.0 Female Terminal Female Pin IN12 Socket IN18 QS30-1 QS27-1 YS27-3Amazonでも売っています。

ソケットをつけました。

ピンヘッダを付けて基板完成

1桁をK155ID1で制御してみる

まずは基本の回路として、ニキシー管IN-12BとK155ID1をつないで0を表示させたいと思います。

おおおお!0が光りました。

ESP32で0から9まで順番に表示

ESP32の出力ピンは3.3Vです。これに対しK155ID1は5VのTTL入力になっています。3.3V系と5V系で電圧が異なるので、レベル変換回路を使いしました。回路の左側の抵抗からトランジスタがレベル変換です。K155ID1がTTL入力なので、プッシュプルではなくトランジスタで電流を引き抜くだけで大丈夫です。

ただし、この回路では論理が反転します。K155ID1に0000を指定したいときは1111を、0101を指定したいときは1010をD0からD3端子に入力します。

おおおお!表示が切り替わります。ニキシー管をもっと近くで見て見ましょう。

いいですねぇ。この構造的な光り方。光りも暖かいです。

2桁をダイナミックスキャン

次は2桁に改良します。これまでは1桁だけを光らせていましたが、次は、2つのニキシー管を交互に高速に光らせて、あたかも2つが同時に光っているようにします。

フォトカプラ

ニキシー管のアノード側の180VをON,OFFします。トランジスタでスイッチング回路を作ってもいいのですが、ポピュラーな方法としてフォトカプラを使う方法があります。

180V以上の耐圧(コレクタエミッタ間電圧)のあるフォトカプラを選びます。私は安かったのでLTV-851を選びました。

データシートによると、コレクタエミッタ間電圧(VCEO)が300Vあるので、今回の用途には十分です。

フォトカプラは、LEDとフォトトランジスタが向かい合った構造になっていて、LEDが光るとその光を受けたフォトトランジスタがONするようになっています。光によってトランジスタをON、OFFする仕組みです。

LEDに適切な電流を流すための、抵抗値を計算します。フォトカプラは、LEDに流した電流に応じて、トランジスタがONした時のトランジスタに流れる電流量が変わります。どのぐらいの比率かは、Current Transfer Ratio(CTR)の欄を見るとわかります。データシートには40%とあります。40%ということは、LEDに1mA流すと、トランジスタにはその40%の0.4mAが流れるということです。今回、ニキシー管には2mAが流れて欲しいので、ILED= 2mA / 40% = 2mA / 0.4 = 5mA と、5mA以上流す必要があります。

LEDに流す電流が決まったので、LEDにつなぐ抵抗の抵抗値を求めます。LEDの順方向電圧はForward Voltageの欄で最大1.4Vとあります。ESP32のピンのONした時の電圧を3.3Vとすると、抵抗値は

R = ( 3.3V – 1.4V ) / 5mA = 1.9V / 5mA = 380[Ω] となりました。

このため、LEDにつなぐ抵抗は380Ω以下、近い値として330Ωがいいでしょう。

回路図

フォトカプラの定数が決まったので、回路にします。

ニキシー管の右側の回路が追加した部分です。

これで、2つのニキシー管を交互に点灯させることで、2桁の表示ができるはずです。

プログラム

ESP32のArduinoのプログラムがこちらです。

const int D0 = 26;
const int D1 = 25;
const int D2 = 33;
const int D3 = 32;

const int A1 = 14;
const int A2 = 27;

void setup() {
  pinMode( A1, OUTPUT );
  digitalWrite( A1, LOW );
  pinMode( A2, OUTPUT );
  digitalWrite( A2, LOW );

  pinMode( D0, OUTPUT );
  digitalWrite( D0, HIGH );
  pinMode( D1, OUTPUT );
  digitalWrite( D1, HIGH );
  pinMode( D2, OUTPUT );
  digitalWrite( D2, HIGH );
  pinMode( D3, OUTPUT );
  digitalWrite( D3, HIGH );
}

void numOut( int num )
{
  digitalWrite( D0, !( num & ( 1 << 0 ) ) != 0 );
  digitalWrite( D1, !( num & ( 1 << 1 ) ) != 0 );
  digitalWrite( D2, !( num & ( 1 << 2 ) ) != 0 );
  digitalWrite( D3, !( num & ( 1 << 3 ) ) != 0 );
}

void loop() {
  for ( int i = 0 ; i < 100 ; i++ )
  {
    for( int j=0 ; j<100 ; j++ )
    {
       //1桁目表示
      numOut( i%10 );
      digitalWrite( A1, HIGH );
      delay(1);
      digitalWrite( A1, LOW );
      delayMicroseconds(100); //100us以下だとゴーストが発生
    
      //2桁目表示
      numOut( (i/10)%10 );
      digitalWrite( A2, HIGH );
      delay(1);
      digitalWrite( A2, LOW );
      delayMicroseconds(100); //100us以下だとゴーストが発生
    }
  }
}

00から99までカウントアップするプログラムです。numOut()関数が、0から9までの数字をK155ID1の2進数に変換しています。

動作させてみる

うぉぉぉぉ!2桁表示できました!

何度見てみいいですね。ニキシー管の光り方。

2つのニキシー管を交互に点灯させるのですが、各アノードをOFFした後に、100us以上待たないと、隣の桁に自分と同じ数字がうっすらと写ってしまうゴーストが発生してしまいました。綺麗に表示させるには、プログラム中のdelayMicroseconds(100);が必要です。

ESP32で2桁のニキシー管をダイナミック点灯できました

この仕組みを拡張すれば、もっとたくさんのニキシー管を点灯させることができます。

2019.11.22追加 続きはこちら↓時計を作りました

追加終わり

コメント