ニキシー管時計作ってみた2|ソースコード準備

作ってみた

前回作成したニキシー管時計を動かすためのコードです。「とりあえず配線できたし光らせよう」ということです。8本のニキシー管をダイナミック方式で制御できるようにします。回路の配線数を減らしたことと引き換えに、コードが少しだけ複雑になります。

今回はランダムな数字を表示させます。

環境

ESP32

ESP32というマイコンを使ってニキシー管8本を制御していきます。マイコンというのは小さなパソコンのようなもので、ニキシー管の挙動を制御していきます。このESP32ですが、1,000円ちょっとで買えるのにWi-FiやBluetoothまで扱えるデキるヤツです。

Arduino core for the ESP32

Arduino IDEというツールを使ってESP32に書き込むプログラムを作っていきます。色々な手段がありますが、今回はArduino IDEを使っていきます。

環境構築についてはmgo-tec電子工作さんのページがわかりやすかったです。
Arduino core for the ESP32のインストール方法

8本のニキシー管にランダムな数字を表示する

ESP32に下記コードを書き込みます。

#define DECODER_A 21  //数字表示に関するピンの定義
#define DECODER_B 18  //K155ID1(BCD to Decimal decoder)に送る
#define DECODER_C 17  //BCD(2進化10進数)を書き込むピン
#define DECODER_D 19

#define NIXIE_1 16    //光らせたいニキシー管を指定するためのピン
#define NIXIE_2 26    //HIGHでニキシー管が光る
#define NIXIE_3 13
#define NIXIE_4 25
#define NIXIE_5 14
#define NIXIE_6 33
#define NIXIE_7 27
#define NIXIE_8 32

#define PS_DOWN 4    //高電圧を出力するためのピン(TL494のDTCピン)
                                  //LOWで高電圧を出力する

#define DISPLAY_MS 2         //1つのニキシー管を光らせる時間
#define BLANKING_US 200  //光らせる管を切り替える時に
                                           //陽極をOFFにする時間(ゴースト対策)

/**
 * (表示したい数字(10進表現), 表示したいニキシー管名)で
 * 指定のニキシー管に指定の数字を表示させる関数
 */
void displayDigit(unsigned short digit, unsigned short pin)
{
  digitalWrite(DECODER_A, (1 << 0) & digit);
  digitalWrite(DECODER_B, (1 << 1) & digit);
  digitalWrite(DECODER_C, (1 << 2) & digit);
  digitalWrite(DECODER_D, (1 << 3) & digit);
  digitalWrite(pin, HIGH);
  delay(DISPLAY_MS);
  digitalWrite(pin, LOW);
  delayMicroseconds(BLANKING_US); 
}

/**
 * 8桁のランダムな数字を表示する関数
 */
void printNixiesRandom(){
  long num = 0;
  num = random(10);
  displayDigit(num, NIXIE_1);
  num = random(10);
  displayDigit(num, NIXIE_2);
  num = random(10);
  displayDigit(num, NIXIE_3);
  num = random(10);
  displayDigit(num, NIXIE_4);
  num = random(10);
  displayDigit(num, NIXIE_5);
  num = random(10);
  displayDigit(num, NIXIE_6);
  num = random(10);
  displayDigit(num, NIXIE_7);
  num = random(10);
  displayDigit(num, NIXIE_8);
}

void setup() {
  // 数字表示に関するピンの準備
  pinMode(DECODER_A, OUTPUT);
  pinMode(DECODER_B, OUTPUT);
  pinMode(DECODER_C, OUTPUT);
  pinMode(DECODER_D, OUTPUT);

  //ニキシー管点灯に関するピンの準備
  pinMode(NIXIE_1, OUTPUT);
  pinMode(NIXIE_2, OUTPUT);
  pinMode(NIXIE_3, OUTPUT);
  pinMode(NIXIE_4, OUTPUT);
  pinMode(NIXIE_5, OUTPUT);
  pinMode(NIXIE_6, OUTPUT);
  pinMode(NIXIE_7, OUTPUT);
  pinMode(NIXIE_8, OUTPUT);

  //高電圧出力に関するピンの準備
  pinMode(PS_DOWN, OUTPUT);

  digitalWrite(PS_DOWN, LOW);  //高電圧出力を開始
}

void loop() {
  printNixiesRandom();  //8桁のランダムな数字を表示
}

解説

  • 1-15行目
    コード内の呼び方とESP32のピン番号を対応づけします。
  • 18行目
    ニキシー管が光る時間を指定します。ここでは2msecにしてます。
    ダイナミック方式なので、同時に光らせられるニキシー管は1本です。光らせるニキシー管を素早く切り替え続けることで、残像で8本全てが光っているように見えます。
  • 19 行目
    ゴースト対策の待ち時間を指定します。
    高速で光らせるニキシー管を切り替えると、表示している数字とは別の数字がぼんやり光って見えることがあります。ゴースト現象と呼ばれるこの現象を減らす対策の一つです。
  • 26−36行目
    表示したい数字とニキシー管名を指定することで、指定されたニキシー管に指定された数字を表示する関数です。
  • 41−59行目
    1から8番目のニキシー管にランダムな数字を表示させるようにしています。
  • 61−82行目
    このsetupというのは、起動時一度だけ呼ばれる関数です。ピンの初期設定をします。
  • 84−86行目
    このloopというのは、常に呼ばれ続ける関数です。全てのニキシー管にランダムな数字を表示させるように指示したprintNixiesRandom();を呼び続けるので、一生適当な数字が表示され続けます。

成果

毎回ランダムな数字を表示しているので、ダイナミック方式で制御出来ているのかよくわからないですね。次は時計機能を実装したいと思います。

参考資料

Arduino core for the ESP32のインストール方法
GitHub – ngpitt/arduino-nixie-clock: Arduino code for controlling a 6 digit multiplexed nixie tube clock

コメント

タイトルとURLをコピーしました