ニキシー管でクロスフェード処理をしてみよう!
他の方もニキシー管のクロスフェードについては解説していますが、初心者向けに僕なりに書いてみたいと思います。
目次
はじめに
- 対象...ニキシー管を使ってダイナミック点灯はできたけど、ダイナミック点灯しながらクロスフェードするにはどうしたらいいの?って方。
- 使うモノ...Arduino NANO, TLP627, ニキシー管IN-16×6本, 他(プログラム成分少なめなので他のマイコンでやっている人も大丈夫だと思います。)
- 注意...決まり文句ですが、高電圧を使うので実験は慎重にしましょう。特に汗などで濡れた手で回路に触ることは絶対にやめましょう。筆者はこれで2回感電しました。
- おねがい...筆者自体も初心者なのでもし他にいいやり方を知っている方がいたら教えてください。他にもお気付きの点あれば是非。
クロスフェードってなに?
大辞林 第三版によると、以下のように説明されています。
ゆな でぃじっく さんのクロスフェード実験映像がわかりやすいです。
どういう仕組みでクロスフェードしているの?
例えば「1」から「2」に切り替えたい場合の処理をみていきましょう。
ダイナミック点灯で対象のニキシー管が点灯している時に、1の時間的割合を次第に小さく、2の時間的割合を次第に大きくしていくとクロスフェードすることが出来ます。比で書くと…
ダイナミック点灯 👉 1周目→2周目→3周目→…→9周目→10周目
1の点灯時間 : 2の点灯時間 👉 10:1→9:2→8:3→...→2:9→1:10
と言った具合に切り替えてあげることで、徐々に数字が切り替わっていくように見えます。
クロスフェード処理があるのと、ないのではニキシー管の鮮やかさが全然違いますよ!
ダイナミック点灯でクロスフェードするときの決め事
さていよいよ本題ですが、まず初めに検討したいことが4つあります。
-
何秒で表示を切り替えるのか?
-
クロスフェードにはどのくらい時間を割くのか?
-
一桁あたりの点灯時間は?(ゴースト対策時間を含む)
-
ゴースト対策時間は何ミリ秒必要なのか?
一つずつ確認していきましょう。
1. 何秒で表示を切り替えるのか?
これはニキシー管に表示されている数字をどのタイミングで切り替えるかということです。
例えば時計なら1秒で切り替える、温湿度計なら5秒で切り替える、などあると思います。
これによって2番のクロスフェードに割ける時間が変わってきます。今回は時計を想定して 1秒で考えていきます。
2. クロスフェードにはどのくらい時間を割くのか?
この時間が長ければゆっくり時間を切り替えられますし、短ければシャキシャキ切り替わります。時計で考えると、数字の切り替え時間が1秒なので、だいたい0.3秒くらいが妥当でしょうか。
今回はクロスフェードに0.3[s]時間を割く方向で考えていきましょう。
3. 一桁あたりの点灯時間は?
ダイナミック点灯で一桁あたりにかけている時間のことです。人間の時間分解能は、約50[ms]〜100[ms]と言われているので、少なくともそれ以下の時間にしないとチラついて見えてしまいます。TLP627のターンオン時間とターンオフ時間はそれぞれ、50[μs], 80[μs]となっているので*1、一桁あたりの点灯時間は2[ms]で余裕でしょう。
よって今回は一桁あたりの点灯時間を2[ms]で考えていきます。
4. ゴースト対策時間はどれくらい取るのか?
ゴーストを発生させないためにニキシー管を点灯させた後、アノード側を先に切り、カソード側をその少し後に切る必要があります。この少し後という時間がどのくらいなのかは、その回路に依存するため実際に動かしてみないとわかりません。一般的には10[μs]から500[μs]程度でしょうか。この時間は短いに越したことないですが、300[μs]とることにします。(筆者の回路上で200[μs]で試したところゴーストが発生しました…)
実際にどうやってプログラムするの?
プログラムの構成を考える
実際にプログラムの構成を考えていきましょう。
※この記事を読んでいる方は、ダイナミック点灯は理解できている方が多いと思うので、ダイナミック点灯に関する細かい説明は省かせていただきます。
前章より、1) 時計を想定して1[s]で数字を切り替え、2) 0.3[s]のクロスフェードの時間を確保し、3) 一桁あたり2[ms]の点灯時間とし(ゴースト対策時間含む)、4) ゴースト対策時間は 300[μs] としました。
また、ニキシー管は6本を想定して、考えていきます。(理屈がわかれば4本や8本でも可能)
まず何回に分けてクロスフェード処理をするかについて考えます。
一桁あたり 2[ms]ということは、一周、今回は6本で 2[ms] × 6 = 12[ms] ということになります。
クロスフェードにかける時間である0.3[s]を12[ms]で割れば、25周分の数字の切り替え回数があるということになるので、25:0→24:1→…→1:24→1:24という具合に切り替えていけば良いわけです。
また、この比の1あたりの時間を求めます。
一桁あたりのニキシー管の点灯時間は 2[ms] でした。これはゴースト対策の300[μs]を含んだものでしたね。よって 2[ms] - 0.3[ms] = 1.7[ms]が正味の点灯時間となります。
これを25分割すればいいので 1.7[ms] ÷ 25 = 0.068[ms] = 68[μs]
この 68[μs]の回数を徐々に切り替えていけばクロスフェードできるわけです。
プログラムの概観
イメージ的にはこんな感じ(↓)です。NixieCrossFadeOutputは僕が勝手に名前をつけました。一桁あたりの
切り替わる前の数字点灯→切り替わる後の数字点灯→ゴースト対策消灯
までをしています。引数は左から、桁、切り替わる後の時間(数字)、切り替わる前の時間(数字)、点灯時間の割合を示しています。
NixieClockArrayとBeforeClockArrayはそれぞれ、切り替わる後の時間と切り替わる前の時間です。
このプログラムで実際にニキシー管を動かしたものがこちら↓
for( int j = 25; j > 0; j-- ){ //25周する。
for( int i = 0; i < 6; i++ ){ //6桁分表示
NixieCrossFadeOutput( i + 1, NixieClockArray[i], BeforeClockArray[i], j);
}
}
/*************************************************/
void NixieCrossFadeOutput(char dig, char Anum, char Bnum, int j ){
//NixieCrossFadeOutputの引数=桁, 後の時刻, 前の時刻, 点灯時間の割合
//指定した桁をHIGHにする
switch(dig){ case 1:
digitalWrite( Dig_num1, HIGH );
digitalWrite( Dig_num2, LOW );
digitalWrite( Dig_num3, LOW );
digitalWrite( Dig_num4, LOW );
digitalWrite( Dig_num5, LOW );
digitalWrite( Dig_num6, LOW );
break;
//以下2~6まで省略
}
switch(Bnum){
case 0:
//ここでの4bitはニキシー管ドライバ(SN74141)でのInputにあたる
digitalWrite( A, LOW );
digitalWrite( B, LOW );
digitalWrite( C, LOW );
digitalWrite( D, LOW );
break;
//以下1~9まで省略
}
delayMicroseconds( 68*j );
//入れ替わられる数字の点灯時間
switch(Anum){ case 0:
digitalWrite( A, LOW );
digitalWrite( B, LOW );
digitalWrite( C, LOW );
digitalWrite( D, LOW );
break;
//以下1~9まで省略
}
delayMicroseconds(68*(25-j)); //入れ替わる数字の点灯時間
//ゴースト対策。
アノードをLOWにする。
digitalWrite( Dig_num1, LOW );
digitalWrite( Dig_num2, LOW );
digitalWrite( Dig_num3, LOW );
digitalWrite( Dig_num4, LOW );
digitalWrite( Dig_num5, LOW );
digitalWrite( Dig_num6, LOW );
delayMicroseconds(300); //ゴースト対策の消灯時間(300μs)
}
これで 0.3[s]時のクロスフェード処理の説明は以上となります。ここまで読んでいただきありがとうございました。
さいごに
ニキシー管のクロスフェード処理について理解していただけましたか?
少しでもニキシー管ライフの参考になれば幸いです。
自分で書いていてもまだ納得のいくものとなっていないので、どこかご指摘、質問等あればなんでもコメントに書いてください。
*1:TLP627のデータシートリンク、